Arduino 软件定时输出PWM或舵机控制信号
在使用Arduino开发硬件程序时往往会碰到PWM输出引脚与串口或其他硬件扩展的定时器冲突问题,导致PWM信号输出不稳定或不能正常工作。
下面使用软件方式解决PWM定时器冲突问题并且扩展更多的引脚输出PWM信号。
在学习如何编程之前先了解Arduino中的两个设备运行时间函数。
millis() 获取程序启动到当前的毫秒数
micros() 获取程序启动到当前的微妙数
先以一个定时LED为例,LED每隔500ms闪烁一次
上述程序的核心就是判断当前mcu是否到达指定时间标志点到达就执行对应语句。
如果想输出PWM那么像LED闪烁一样使用ms为单位的系统时间进行时间标定就不合适了,所以就需要用到micros()函数达到微秒级控制才能输出可用的PWM信号。
那么使用微妙的系统时间能够最大输出多少HZ的pwm信号呢?
计算过程也相对简单以输出8位PWM为例,8位PWM可输出0-255强度,那么一分钟就能输出1000000/255=3921hz的PWM。10位PWM则为1000000/1023=977可以勉强当1KHZ pwm使用勉强够用。
下面就是程序实现了例如2路PWM输出8位pwm。
注意该程序主要为原理描述,应用过程中还需要加IO初始化等操作,直接使用不输出任何PWM。
上述程序并不是一个相对完美的程序还包含死区时间设置等问题没有处理,但是基本原理已经阐述完毕,可以在此基础上扩展出更多的PWM输出,或者使用数组等方式构建更加容易扩展的PWM输出函数。