软件平台:AVR Stdio4
硬件平台:ATmega16最小系统
//本人做的欢迎大家指教
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
#define uint unsigned int
#define uchar unsigned char
#define S_HIN1 PORTA|=(1<<PA0)
#define C_HIN1 PORTA&=(0<<PA0)
#define S_LIN1 PORTA|=(1<<PA1)
#define C_LIN1 PORTA&=(0<<PA1)
#define S_HIN2 PORTA&=((0<<PA2)&(0<<PA3)) //选中PWM1(1<<PA2)
#define C_HIN2 PORTA&=((1<<PA2)&(0<<PA3)) //清除PWM1
#define S_LIN2 PORTA|=((1<<PA3)|(1<<PA2)) //选中PWM2
#define C_LIN2 PORTA&=((1<<PA2)&(0<<PA3)) //清除PWM2
#define S_SD1 PORTA|=(1<<PA4)
#define C_SD1 PORTA&=(0<<PA4)
#define S_SD2 PORTA|=(1<<PA5)
#define C_SD2 PORTA&=(0<<PA5)
//128点正弦波样本值
/*
uint SinParam[128]={
128,134,140,147,153,159,165,171,177,182,188,193,198,204,208,213,
218,222,226,230,233,237,240,242,245,247,249,251,252,253,254,254,
254,254,253,252,251,250,248,246,244,241,238,235,232,228,224,220,
215,211,206,201,196,191,185,179,174,168,162,156,150,144,137,131,
125,119,112,106,100,94,88,82,77,71,65,60,55,50,45,41,
36,32,28,24,21,18,15,12,10,8,6,5,4,3,2,2,
2,2,3,4,5,7,9,11,14,16,19,23,26,30,34,38,
43,48,52,57,63,68,74,79,85,91,97,103,109,116,122,128
};
*/
uint SinParam[65]={
128,134,140,147,153,159,165,171,177,182,188,193,198,204,208,213,
218,222,226,230,233,237,240,242,245,247,249,251,252,253,254,254,
254,254,253,252,251,250,248,246,244,241,238,235,232,228,224,220,
215,211,206,201,196,191,185,179,174,168,162,156,150,144,137,131,
128
};
volatile uchar num=0;
volatile uchar HB_Flag=0;
int main(void)
{
//define PD4 and PD5 to be output(respectively OC1B and OC1A)
DDRD|=0x30;
//Mode;fast PWM(15),Freq;F(I/O)/1,clr at compare and set at top,
TCCR1A=0xA3;
TCCR1B=0x19;
OCR1A=1024;
OCR1B=0;
TIMSK=0x08; //output compare interrupt enable
sei();
while(1);
}
ISR(TIMER1_COMPB_vect)
{
OCR1B=SinParam[num]*4;
num++;
if(num>64)
{
num=0;
HB_Flag++;
if(HB_Flag==1)
{
C_LIN1(); //关断1号下桥
C_HIN2(); //关断2号上桥
_delay_us(4);
S_HIN1(); //开1号上桥
S_LIN2(); //开2号下桥
}
else if(HB_flag==2)
{
C_LIN2(); //关断2号下桥
C_HIN1(); //关断1号上桥
_delay_us(4);
S_HIN2(); //开2号上桥
S_LIN1(); //开1号下桥
HB_Flag=0;
}
else ;
}
} |