利用IO端口产生PWM信号控制电机(原创)
0赞
发表于 2011/10/15 9:49:01
阅读(6040)
ADµC7026自带PWM模块,可以在六个PWM引脚产生3对PWM信号,这六路PWM输出信号包含三个高电平驱动信号和三个低电平驱动信号,产生的PWM模式的转换频率和死区时间可通过编程实现。不过该模块PWM信号数量不够,虽然说可以产生六路,但是两两互补是不可以用来控制多路电机的。因此可以用IO端口来产生PWM信号。下面详细介绍一下是如何用IO端口产生PWM信号的。
PWM调速程序调节各电调PWM占空比,再通过电调改变电机转速,同时保证PWM信号的周期是20ms固定不变的(这是电调要求)。
ADµC7026有40个双向复用IO(GPIO)引脚,所有引脚耐压5V,也就是说通用IO支持5V作为输入电压,许多GPIO引脚都存在复用功能,默认情况下GPIO引脚设定为GPIO模式,PWM调速程序流程如图3-13所示。
附部分程序:
void ProPPM() //脉宽控制函数 { int i = 0; if(TimeCounter[0] == ControllValue[0]) { GP3DAT &= 0xFFFE0000; } if(TimeCounter[1] == ControllValue[1]) { GP3DAT &= 0xFFFD0000; } if(TimeCounter[2] == ControllValue[2]) { GP3DAT &= 0xFFFB0000; } if(TimeCounter[3] == ControllValue[3]) { GP3DAT &= 0xFFF70000; } if(TimeCounter[4] == ControllValue[4]) { GP3DAT &= 0xFFEF0000; } if(TimeCounter[5] == ControllValue[5]) { GP3DAT &= 0xFFDF0000; } if(PeriodCount == 1000) { ControllFlag = 1; //到达20ms则全部清零 GP3DAT = 0xFFFF0000; PeriodCount = 0; TimeCounter[0] = 0; TimeCounter[1] = 0; TimeCounter[2] = 0; TimeCounter[3] = 0; TimeCounter[4] = 0; TimeCounter[5] = 0; } }
PWM调速程序用到的4个端口为P3.0~P3.3。初始化时这几个端口被赋值为高电平,然后当定时器中断发生时查看各个端口的高电平时间是否超过了在控制程序中计算得到的值,若超过了则该端口的电平被拉低,与此同时还要检查从开始值现在是否到达20ms,若到达20ms则各个端口的状态恢复初始化设置。
上面这一过程会不断地进行下去,这样一来就可以产生符合条件的PWM信号了。