chenccl 发表于 2011-8-21 09:13:12

ATmega16产生SPWM驱动全桥实现DC_AC变换

软件平台: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


#defineS_HIN1 PORTA|=(1<<PA0)
#defineC_HIN1 PORTA&=(0<<PA0)

#defineS_LIN1 PORTA|=(1<<PA1)
#defineC_LIN1 PORTA&=(0<<PA1)

#defineS_HIN2 PORTA&=((0<<PA2)&(0<<PA3))                //选中PWM1(1<<PA2)
#defineC_HIN2 PORTA&=((1<<PA2)&(0<<PA3))                //清除PWM1

#defineS_LIN2 PORTA|=((1<<PA3)|(1<<PA2))                //选中PWM2
#defineC_LIN2 PORTA&=((1<<PA2)&(0<<PA3))                //清除PWM2

#defineS_SD1 PORTA|=(1<<PA4)
#defineC_SD1 PORTA&=(0<<PA4)

#defineS_SD2 PORTA|=(1<<PA5)
#defineC_SD2 PORTA&=(0<<PA5)

//128点正弦波样本值
/*
uint SinParam={
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={
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*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 ;
        }

}

kingboy100 发表于 2011-8-22 08:02:03

mark

jacky82512 发表于 2011-8-24 09:57:20

挺感兴趣的,希望楼主继续研究

chenccl 发表于 2011-8-28 15:03:11

呵呵,多谢~

zph888 发表于 2011-10-25 13:12:15

参考下

taocongrong 发表于 2011-12-25 21:16:37

yidehui 发表于 2012-1-30 14:53:46

mark

skylinyk 发表于 2013-10-29 11:36:54

mark,路过

nome2 发表于 2013-10-29 12:28:04

mark标记

jz701209李 发表于 2013-12-8 13:17:55

学习一下,謝谢

211LIRUISHUO 发表于 2014-6-17 15:50:32


学习一下,謝谢

cjh5750 发表于 2014-9-3 19:54:12

很好的样子

hellokv1688 发表于 2019-5-19 18:15:27

mark,学习一下!
页: [1]
查看完整版本: ATmega16产生SPWM驱动全桥实现DC_AC变换