股票

AVR Mega16/32 PWM生成

最近需要用到两路PWM波,使用mega32硬件产生,介绍一下方法。

先上代码:

  1. DDRD |= (1<<5);
  2. PORTD &= ~(1<<5);
  3. DDRD |= (1<<4);
  4. PORTD &= ~(1<<4);
  5. TCCR1A = 0xa0;
  6. TCCR1B = 0x11;
  7. ICR1 = 2;
  8. OCR1A = 1;
  9. 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波形就成正弦波了。

打赏
原文链接:,转发请注明来源!

发表评论