Arduino UNO Infrared emission timer setup

Arduino红外发射的调频定时器设置

网上了解了下ARDUINO的定时器、中断、PWM、舵机控制,红外收发等相关知识。尤其是仔细阅读了AVR atmega328p,也就是ARDUINO UNO的芯片手册的定时器部分,其中有两点:

  1. AT mega328p的定时器有3个,对应Arduino UNO板子,
  2. Timer0 对应 5、6引脚pwm, 8bit
  3. Timer1 对应 9、10引脚pwm, 16bit
  4. Timer2 对应 11、3引脚pwm, 8bit
  5. 舵机的pwm频率为50Hz / 20ms, 但是控制舵机需要的占空比比较小,为20ms中的5 ~ 2.5ms。

先讲讲红外发射的调频原理吧

那么根据1,由于红外发射需要38khz左右的载波频率,不过不用特别精确的38khz,所以红外收发的库里,

假若是16M的晶振,根据上述代码和手册,WGM20和WGM22置1,所以Mode为5

那么就是pwm,phase correct模式,

主要意思就是,每周期在ocrA处达到计数顶部,触发中断,然后从0开始计数,由于不是到达顶部255溢出才从0开始重新计数,所以能实现相位的调整,而不再是fclk / prescale / 256的频率。因为CS20置位,所以预除数是1,即没有预除数prescale。

那么频率就是fout= fclk / ocrA / 2,除2是因为两个中断才完成电平翻转,形成载波的一个周期。

那我们很容易得到,如果我们想要38khz的频率,用16M晶振获取,需要设置OCRA为

16M/38k/2=210,那么实际频率 16m / 210 / 2 = 38095.238hz。

中断向量TIMER2_COMPA_vect的处理函数

中要做的就是根据要收发的消息,对载波进行调制,根据需要调制上载波或者去掉载波。

此处见代码,不详述。

 

参考资料:

Arduino红外传感器-IR Receiver Module红外接收模块

https://www.ncnynl.com/archives/201606/85.html

0

发表评论