在Arduino中,可以使用AnalogWrite来使用硬件产生490Hz/980Hz的pwm波,并可根据参数来设定占空比。不了解这个的同学可以去AnalogWrite学习下,SecretsOfArduinoPWM也是讲了Arduino在avr的定时/计数器上做的封装,我们这里并不讲Arduino相关,而是讲AVR的定时/计数器,如何产生更多PWM波和定时/计数器的中断使用。
AVR Timer/Counter(以下统称Timer)
以ATmega358p为例,其内部拥有一个16位计时器,两个8位计时器,下图则为16位计时器的大致图解:
对于没有接触过avr内部的Arduino同学来说,这张图看不出来任何意思,别急,这些都是AVR-GCC里定义的缩写,我们先来解释下图中的缩写对照:
缩写 | 全称 |
---|---|
TCNT | Timer/Counter Register |
TCCR | Timer/Counter Control Register |
OCR | Output Compare Register |
OC | Output Compare Match Output |
ICR | Input Capture Register |
Int.Req | Interrupt Request |