步进电机的控制需要对控制脉冲进行精确计数,通常利用CPU的PWM信号作为步进电机控制脉冲,并利用PWM自身的中断功能,每输出一个脉冲产生一次中断,然后计数,以实现对输出脉冲个数的控制。但在WinCE上系统直接实现上述控制过程是有因难的,由于操作系统线程调度,WinCE驱动中对中断的响应会有几十到几百微秒的延时,这显然不能满足高速PWM计数的需求,同时频繁的中断也会对整个系统的性能产生影响。
下图是基于英创工控主板EM9380的步进电机控制示意图。EM9380是英创公司推出的面向实时控制应用的工控主板,预装了正版的WinCE6.0操作系统,在主板上集成了两个CPU,主CPU是450MHz的ARM9,运行WinCE系统,负责通讯管理,人机交互等,从CPU采用了ARM Cortex-M3,专门用做实时控制应用。
EM9380步进电机控制
对于步进电机的控制,用户只需要在熟悉的vs2005(vs2008)开发环境下,通过简单的API函数MCU_PWM_CHANNEL()将控制参考传送给Cortex-M3,就可以实现频率可达100KHz,可计数的PWM脉冲输出。MCU_PWM_CHANNEL()函数说明如下:
// MCU PWM操作:启动/停止PWM通道, 启动参数包括频率、占空比和初始极性
BOOL MCU_PWM_CHANNEL(
HANDLE hMCU,
DWORD dwCh, // PWM通道号, = 3, 4, 5, 6, 7, 8
DWORD dwFreq, // PWM输出频率,单位Hz,=0:停止PWM输出
DWORD dwDuty, // PWM输出占空比,单位.1%, 输入范围= 0-1000
DWORD dwPol, // PWM初始极性,= 0: 低电平, = 1: 高电平
DWORD dwNum=0); // PWM脉冲个数, 缺省值=0:连续输出
EM9380 PWM(PWM3~PWM8)实时控制应用举例:
// 打开MCU驱动,输入参数固定为0
HANDLE hMCU = OpenMCU( 0 );
// 控制PWM3以频率100KHz,每个脉冲25%的低电平输出3个脉冲
MCU_PWM_CHANNEL(hMCU, 3, 100000, 250, 0, 3 );
// 控制PWM4以频率100KHz,每个脉冲25%的高电平输出3个脉冲
MCU_PWM_CHANNEL(hMCU, 4, 100000, 250, 1, 3 );
// 控制PWM5输出5MHz,50%占空比的连接PWM信号,dwNum参数使用缺省值
MCU_PWM_CHANNEL(hMCU, 5, 5000000, 500, 0);
// 控制PWM5停止输出
MCU_PWM_CHANNEL(hMCU, 5, 0, 0, 0);
// 关闭MCU驱动,释放相应资源
CloseMCU( hMCU );
执行上述代码后PWM3与PWM4的输出波形如下:(注:下图只是为了说明pol参考对输出波形的影响,实际上PWM3与PWM4并不是同步输出的,EM9380的其它PWM暂时也不具有同步功能)
PWM输出波形
EM9380可以支持8路PWM输出,其中6路是从从CPU Crotex-M3上引出的,支持PWM输出计数,他们与GPIO管脚复用关系如下:
EM9380 GPIO# | PWM通道 | 备注 |
GPIO20 | PWM1 | |
GPIO21 | PWM2 | |
GPIO4 | PWM3 | 可计数 |
GPIO5 | PWM4 | 可计数 |
GPIO6 | PWM5 | 可计数 |
GPIO7 | PWM6 | 可计数 |
GPIO0 | PWM7 | 可计数 |
GPIO3 | PWM8 | 可计数 |
-
嵌入式主板
+关注
关注
7文章
6084浏览量
35164
发布评论请先 登录
相关推荐
评论