在HCS08系列MCU上用软件实现仪表步进电机的驱动
时间:11-30
来源:互联网
点击:
电机转动的加减速
步进电机在转动时,因为转子、传动齿轮和负载的转动惯量,使它从一个位置转动到下一个位置(一个分步或微步)需要一定的时间。如果在转子转动到下一个位置之前,驱动信号就又往前走了一步的话,那么转子的磁场方向和定子线圈产生的气隙磁场方向的夹角就会超过一个分步或微步所对应的角度。只要转子的旋转速度跟不上驱动信号的变化速度,这个夹角就会越来越大,当夹角超过180度的时候,磁场对转子的作用力的方向就会变得跟原来的方向相反,如图8所示。这时,转子的旋转速度就会减慢,直到变成以相反的方向旋转。最终的结果就是转子所转过的角度和气隙磁场所转过的角度不相等了,也就是转子所转过的步数和驱动信号走过的步数不相等了,人们常把这种现象叫做“失步”。同样的,当要使步进电机从高速的旋转中停下来的时候,如果驱动信号的变化过快,转子就有可能在惯性的作用下继续旋转超过180度,从而也产生失步。另外,由于转子轴承、传动齿轮和负载上都有一定的摩擦阻力,因此电机在连续转动时的速度也是有限的,如果驱动信号的变化速度超过了电机能达到的最大转速的话,电机也会失步。
那么,如果让驱动信号一直保持较慢的变化速度,是不是就没有问题了呢?答案当然是否定的。这是因为步进电机作为仪表的显示部件,我们要求它能够将被测信号的变化实时地显示出来;而电机转动如果比较慢,那么仪表的显示就无法跟上被测信号的变化。
为了让步进电机既不会失步,又能转得尽可能的快,那么就要让驱动信号的变化速度和转子转动的速度保持基本一致。当电机启动的时候,转子做加速转动,这时第一步的持续时间要比较长,然后每一步的持续时间逐渐变短,对应的转动速度变化如图9所示。电机停止的过程则与之相反。在VID29系列步进电机的数据手册上给出了电机启动/停止时允许的驱动信号的变化速度(启动频率,Start-stop Frequency)和电机连续转动时允许的驱动信号的变化速度(最大驱动频率,Max Driving Frequency),我们可以根据它们计算出第一步的持续时间和加速过程结束后的每一步的持续时间。
步进电机和MCU的硬件连接
在LG32 Cluster Reference Design中,MCU和步进电机之间的连接如图10所示。其中使用了一片74ACT125作为电流放大驱动,这是因为MC9S08LG32的I/O口输出的电流最大只10mA,而VID29步进电机需要的驱动电流最大可达20mA。使用TPM模块的两个PWM输出通道驱动步进电机两个线圈的正极,两个普通I/O口驱动两个线圈的负极。TPM模块的两个通道也可以设置成普通I/O口,这样就可以根据需要使用微步方式驱动或者分步方式驱动。
在MC9S08LG32中集成了两个TPM模块,其中TPM1有2个通道,TPM2有6个通道。在这里选择TPM1来驱动步进电机,是因为当把一个TPM模块的某一个通道设置为PWM输出时,此TPM模块公用的模数(MOD)寄存器将被设成一个比较特殊的值,这样就会给它的其它通道的功能使用造成很多限制。所以为了更加充分地利用MCU的资源,这里选择了通道较少的TPM1,而把通道较多的TPM2留作他用。
步进电机驱动程序
本驱动程序为应用程序提供的接口函数有三个:
1. InitStepper:初始化函数,对驱动所用到的I/O口和定时器进行设置,并让步进电机转到初始位置——使仪表的指针指到零点的位置。
函数原型:void InitStepper(void);
参数:无
返回值:无
2. SetStepperTarget:设定步进电机的目标位置,也就是要让仪表的指针转到哪个位置(以相对于零点的角度来表示),整个转动的过程(如需要转多少步,往哪个方向转等)应用程序无需知道,而且应用程序可以指定任意目标位置。
函数原型:void SetStepperTarget(word wTargetDegree);
参数:word wTargetDegree,目标位置相对于零点的角度,其值是以(1/12)度(等
于微步方式下的步距)为单位的;
返回值:无
3. GetStepperCurrent:得到步进电机的当前位置。
函数原型:word GetStepperCurrent(void);
参数:无
返回值:返回仪表的指针当前所指的位置(以相对于零点的角度来表示),其值也以(1/12)度(等于微步方式下的步距)为单位。
另外,在头文件Stepper.h中定义了选择驱动方式的宏,使用者修改宏定义就可以选择分步驱动方式或微步驱动方式,如下:
#define STEPPER_PARTIAL_MODE 0
#define STEPPER_MICRO_MODE !STEPPER_PARTIAL_MODE
如前所述,驱动信号的变化速度不能太快,每次变化后都必须保持一段时间不变,为了让驱动程序占用的CPU的处理时间更少,就需要用到一个定时器。除了上面的三个接口函数外,驱动程序的其余部分都在定时器的中断服务程序中运行。
在驱动程序中,用两个静态变量来保存步进电机的目标位置和当前位置,其值是到零点的步数。定时器中断由SetStepperTarget函数使能,在中断服务程序中根据目标位置和当前位置的差值来决定步进电机转动的方向和步数,然后根据选择的驱动方式执行相应的转动程序。
步进电机在转动时,因为转子、传动齿轮和负载的转动惯量,使它从一个位置转动到下一个位置(一个分步或微步)需要一定的时间。如果在转子转动到下一个位置之前,驱动信号就又往前走了一步的话,那么转子的磁场方向和定子线圈产生的气隙磁场方向的夹角就会超过一个分步或微步所对应的角度。只要转子的旋转速度跟不上驱动信号的变化速度,这个夹角就会越来越大,当夹角超过180度的时候,磁场对转子的作用力的方向就会变得跟原来的方向相反,如图8所示。这时,转子的旋转速度就会减慢,直到变成以相反的方向旋转。最终的结果就是转子所转过的角度和气隙磁场所转过的角度不相等了,也就是转子所转过的步数和驱动信号走过的步数不相等了,人们常把这种现象叫做“失步”。同样的,当要使步进电机从高速的旋转中停下来的时候,如果驱动信号的变化过快,转子就有可能在惯性的作用下继续旋转超过180度,从而也产生失步。另外,由于转子轴承、传动齿轮和负载上都有一定的摩擦阻力,因此电机在连续转动时的速度也是有限的,如果驱动信号的变化速度超过了电机能达到的最大转速的话,电机也会失步。
那么,如果让驱动信号一直保持较慢的变化速度,是不是就没有问题了呢?答案当然是否定的。这是因为步进电机作为仪表的显示部件,我们要求它能够将被测信号的变化实时地显示出来;而电机转动如果比较慢,那么仪表的显示就无法跟上被测信号的变化。
为了让步进电机既不会失步,又能转得尽可能的快,那么就要让驱动信号的变化速度和转子转动的速度保持基本一致。当电机启动的时候,转子做加速转动,这时第一步的持续时间要比较长,然后每一步的持续时间逐渐变短,对应的转动速度变化如图9所示。电机停止的过程则与之相反。在VID29系列步进电机的数据手册上给出了电机启动/停止时允许的驱动信号的变化速度(启动频率,Start-stop Frequency)和电机连续转动时允许的驱动信号的变化速度(最大驱动频率,Max Driving Frequency),我们可以根据它们计算出第一步的持续时间和加速过程结束后的每一步的持续时间。
步进电机和MCU的硬件连接
在LG32 Cluster Reference Design中,MCU和步进电机之间的连接如图10所示。其中使用了一片74ACT125作为电流放大驱动,这是因为MC9S08LG32的I/O口输出的电流最大只10mA,而VID29步进电机需要的驱动电流最大可达20mA。使用TPM模块的两个PWM输出通道驱动步进电机两个线圈的正极,两个普通I/O口驱动两个线圈的负极。TPM模块的两个通道也可以设置成普通I/O口,这样就可以根据需要使用微步方式驱动或者分步方式驱动。
在MC9S08LG32中集成了两个TPM模块,其中TPM1有2个通道,TPM2有6个通道。在这里选择TPM1来驱动步进电机,是因为当把一个TPM模块的某一个通道设置为PWM输出时,此TPM模块公用的模数(MOD)寄存器将被设成一个比较特殊的值,这样就会给它的其它通道的功能使用造成很多限制。所以为了更加充分地利用MCU的资源,这里选择了通道较少的TPM1,而把通道较多的TPM2留作他用。
步进电机驱动程序
本驱动程序为应用程序提供的接口函数有三个:
1. InitStepper:初始化函数,对驱动所用到的I/O口和定时器进行设置,并让步进电机转到初始位置——使仪表的指针指到零点的位置。
函数原型:void InitStepper(void);
参数:无
返回值:无
2. SetStepperTarget:设定步进电机的目标位置,也就是要让仪表的指针转到哪个位置(以相对于零点的角度来表示),整个转动的过程(如需要转多少步,往哪个方向转等)应用程序无需知道,而且应用程序可以指定任意目标位置。
函数原型:void SetStepperTarget(word wTargetDegree);
参数:word wTargetDegree,目标位置相对于零点的角度,其值是以(1/12)度(等
于微步方式下的步距)为单位的;
返回值:无
3. GetStepperCurrent:得到步进电机的当前位置。
函数原型:word GetStepperCurrent(void);
参数:无
返回值:返回仪表的指针当前所指的位置(以相对于零点的角度来表示),其值也以(1/12)度(等于微步方式下的步距)为单位。
另外,在头文件Stepper.h中定义了选择驱动方式的宏,使用者修改宏定义就可以选择分步驱动方式或微步驱动方式,如下:
#define STEPPER_PARTIAL_MODE 0
#define STEPPER_MICRO_MODE !STEPPER_PARTIAL_MODE
如前所述,驱动信号的变化速度不能太快,每次变化后都必须保持一段时间不变,为了让驱动程序占用的CPU的处理时间更少,就需要用到一个定时器。除了上面的三个接口函数外,驱动程序的其余部分都在定时器的中断服务程序中运行。
在驱动程序中,用两个静态变量来保存步进电机的目标位置和当前位置,其值是到零点的步数。定时器中断由SetStepperTarget函数使能,在中断服务程序中根据目标位置和当前位置的差值来决定步进电机转动的方向和步数,然后根据选择的驱动方式执行相应的转动程序。
步进电机 电路 MCU Freescale 电流 电压 PWM 电阻 传感器 ADC 电感 总线 相关文章:
- 单芯片集成电路优化自适应转向大灯系统设计(07-03)
- 汽车仪表步进电机控制算法的仿真(02-15)
- 灵活的现代CPLD汽车数字仪表板(06-04)
- 基于步进电机控制技术的汽车辅助照明随动系统设计(01-25)
- 基于步进电机驱动器MC33991的车速表设计(11-14)
- 基于CAN总线的一体化步进电机驱动器的设计与实现(11-25)