AVR单片机的SPWM程序
void T1_inti()
{
TCNT1H=0xfc; //计数器清零
TCNT1L=0xe0;
TCCR1A=0x2d; // 0010 1101 频率相位修正PWM,发生匹配的时候,电平为0
TCCR1B=0x11; // 0001 0001 不分频,要是分频的话开关频率就达不到那么高了
TCCR1C=0x00; //没什么作用
OCR1A=493; // 在这种模式下 最大值寄存器OCR1A中的值,这个值与方波的频率有关系,还和方波的占空比有关系
}
void T0() //在定时器0的中断程序中向OCR1A和OCR1B送正弦函数表中的数值,调节M和OCR1A的值就可以调节频率和幅度
{
if(count<360)
{
OCR1B=SPWM_sin_value[count]*M+OCR1A/2-M;//公式应该是OCR1A=OCR1A/2+M(SPWM_sin_value[count]-1)其中OCR1A是三角波的最大值,M为振幅调节系数范围是0~OCR1A/2,(SPWM_sin_value[count]-1)中减的一是应为做的正弦表是一个全正的表,现在要变成(-1~+1)之间的表,调节OCR1A的值可以调节开关频率,调节M的值克一调节相关方波的占空比
OCR1C=SPWM_sin_value[count]*M+OCR1A/2-M
count++;
}
else
count=0;
TCNT0=0x9C;//可以进一步缩短所用的时间,这样可以达到更好的传送效果,但是也更加占用单片机的时钟资源。
}
void main()
{
PORT_inti(); //端口初始化
TO_inti(); //产生 kHZ的开关频率
T1_inti(); //相位修正PWM用于产生两路的SPWM波
while(1) //死循环 ,等待中断
{
}
}
AVR单片机SPWM程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)