分享

PWM生成正弦波的程序

 ylw527 2010-09-15
/*--------------------------------------------------*/
/*           main.c                             */
/*           FYQ,2007,01,03                         */
/*           生成正弦波                             */
/*--------------------------------------------------*/
/*                                                  */
/*     AVR系统的处理器为:   ATMega16               */
/*     AVR系统的晶振频率:   7.3728Mhz              */
/* */
/*--------------------------------------------------*/

/****************************************************

程序修改为OC2输出,PD7脚(管脚21)
2007,10,31

****************************************************/



#include "defines.h"
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include "sin_table.h"
#include "delay.h"

#define DISABLE_TC2 (TCCR1B&=~_BV(CS22))

#define ENABLE_TC2 (TCCR1B|=_BV(CS22))

//  -----------------全局变量-----------------
uint8_t key_value;

uint8_t x_sw=0x00;

uint16_t x_lutext=0;

uint16_t x_lut;

//  x_sw表(8倍):x_sw=ROUND(8*N_sample*f*510/FCK)


void io_init(void)
{
DDRD=0xFF;
PORTD=0xFF;

DDRA=0xC0; // PA0~PA5为输入,PA6~PA7为输出
PORTA=0x00; // PORTA关上拉
}

//定义按键输入
void key_init(void)
{
DDRA=0xFF;
PORTA=0xFF;//_BV(PA0)|_BV(PA1)|_BV(PA2)|_BV(PA3);
}

void LedOnOff(void)
{
uint8_t i;
for(i=0;i<3;i++)
{
PORTA^=_BV(PA7);
delay_nms(500);
}

}


void tc2_init()
{
TIMSK|=_BV(OCIE2); //  使能T/C2溢出中断

TCCR2|=_BV(CS20); // 分频:1

TCCR2|=_BV(COM21)|_BV(COM20); // 比较匹配时置位OC2计数值为0xFF时清零OC2

TCCR2|=_BV(WGM21)|_BV(WGM20); // 快速PWM模式


}


SIGNAL(SIG_OUTPUT_COMPARE2)
{
  x_lutext+=x_sw;

x_lut=(uint8_t)(((x_lutext+4)>>3)&(0x007F)); //  数据规格化,0x007F=127

  OCR2=pgm_read_byte(&sin_table[x_lut]); // 从flash中取出正弦数据
// 更新OCR2
}

// 读键盘
uint8_t read_key(void)
{
uint8_t key_v;

key_v=(PINA&0x3F);

return key_v;
}

int main(void)
{
io_init();

tc2_init();

LedOnOff();

sei(); // 开总的中断允许

// set_sleep_mode(SLEEP_MODE_IDLE);
 
while(1)
{  

key_value=read_key();

switch(key_value){

case 0x00: {x_sw=0;DISABLE_TC2;};break;

case 0x01: {x_sw=1;ENABLE_TC2;};break;

case 0x02: {x_sw=2;ENABLE_TC2;};break;

case 0x04: {x_sw=3;ENABLE_TC2;};break;

case 0x08: {x_sw=4;ENABLE_TC2;};break;

case 0x10: {x_sw=5;ENABLE_TC2;};break;

case 0x20: {x_sw=6;ENABLE_TC2;};break;

default: break;

}


// sleep_mode();
 
}
 
return 0;
}
//
// 正弦表20060104
//
 
const prog_uchar sin_table[]=

64,  67,  70,  73,  76,  79,  82,  85, //0

88,  91,  94,  96,  99,  102, 104, 106, //1

109, 111, 113, 115, 117, 118, 120, 121, //2

123, 124, 125, 126, 126, 127, 127, 127, //3

127, 127, 127, 127, 126, 126, 125, 124, //4

123, 121, 120, 118, 117, 115, 113, 111, //5

109, 106, 104, 102, 99,  96,  94,  91, //6

88,  85,  82, 79,  76,  73,  70,  67, //7

64,  60,  57,  54,  51,  48,  45,  42, //8

39,  36,  33,  31,  28,  25,  23,  21, //9

18,  16,  14, 12,  10,  9,   7,   6, //a

  4,   3,   2,   1,   1,    0,   0,   0, //b

  0,   0,   0,   0,    1,   1,   2,   3, //c

4,   6,   7,   9,   10,  12,  14,  16, //d

18,  21,  23,  25,  28,  31,  33,  36, //e

39,  42,  45,  48,  51,  54,  57,  60 //f

};
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多