最近需要用到两路PWM波,使用mega32硬件产生,介绍一下方法。
先上代码:
- DDRD |= (1<<5);
- PORTD &= ~(1<<5);
- DDRD |= (1<<4);
- PORTD &= ~(1<<4);
- TCCR1A = 0xa0;
- TCCR1B = 0x11;
- ICR1 = 2;
- OCR1A = 1;
- OCR1B = 1;
首先将PD4和PD5设为输出,然后选择工作模式:
TCCR1A = 0xa0,TCCR1B = 0x11
其中WGM13=1, WGM12=0, WGM11=0,WGM10=0,选择定时器工作模式为相位与频率修正PWM,TOP值ICR1,OCR1x更新时刻(输出低电平)BOTTOM,TOV1置位时刻BOTTOM;
COM1A1=1,COM1A0=0, COM1B1=1, COM1B0=0,比较匹配时清零OC1A/OC1B(输出低电平);
CS12=0,CS11=0,CS10=1,clk/1(无预分频)。
ICR1 = 2, OCR1A=1,表示A路输出波形的占空比为 OCR1A/ICR1= 50%。
以上总计为,定时器无预分频,当计时器等于ICR1(TOP)时更新,比较匹配OCR1A/OCR1B时输出低电平,从而形成PWM波形。频率最大由晶振决定,为晶振频率的1/4,依据mega16/32的工作频率最大为16M,输出波形最大即为4M。测试了一下20M的晶振,也能输出比较满意的矩形波,但是26M晶振上去后,产生的6.5M波形就成正弦波了。