stm32pwm怎么控制步进电机?定时器中断控制四线两相步进电机
stm32pwm怎么控制步进电机?定时器中断控制四线两相步进电机以上是中断函数部分 通过这噶函数我们可以实现对运行状态的粗略控制: 我们可以控制脉冲的数量,进而控制步进电机转过的角度。 我们可以控制定时器的中断频率,进而控制脉冲的频率 以此实现对步进电机速度的控制。说明: 此代码只适合新手来看看,并不适用于实际生产! 步进电机的速度控制算法有比这个优秀很多的,这只是我初步写的一个初级版本,后续会补上其他版本的步进电机控制方案。另外有一点需要注意的就是步进电机的细分选择: 我这边选择的是8细分 电流是根据电机特性选择的1.5A 细分方面不建议细分太多,这样会导致初级版本的程序频繁的进入中断函数,占用的CPU时间可能会影响程序的运行效率。细分的如果太少也会导致一些其他问题,比如电机的噪音增大。电流大小会直接影响到电机的力矩,如果电流过小可能会导致大电机启动不起来。电流过大则会导致小电机的发热严重。 EN 引脚一般是控制释放电机的 ,这里有一个概念叫做 保持
今天给大家分享一个 初级版本的步进电机的控制方法,用到的步进电机是4线两相的42步进电机 如下图:
步进电机驱动选用的是这款 TB6600
供电选用了12V的稳压电源 最小系统板供电是从Jlink上直接引出
MCU是 STM32F407ZGT6 最小系统板
根据步进电机控制器的资料可以知道 步进电机的速度和转过的角度都是通过 PUL 和PUL- 来控制的
(这里插一段关于步进电机驱动上的六个控制接线端子的使用,将其中的四个 或者是四根 - 接在一起做成共阳接法或者共阴接法,如果 电平是3.3V 或者 5V 可以不串接电阻 ,如果电压大于5V 需要在每一根线上串接相应阻值的电阻)
这里我选择的是共阳接法 也就是将所有的正极接线接到了一起
EN -引脚悬空 (我的程序里面暂时没有用到, 实际使用需要读者自行考虑)
DIR- 接单片机 PE12口
PUL- 接单片机 PE13口
接下来 就说一下我程序的基本思路:
要想控制步进电机 我们一般是控制两个东西:1是转过的角度值(位置)2是速度(为了防止丢步和平稳的启动机器 预防启动极限和转子振荡 我们的速度不能变化太快)
归结到程序上也就是我们需要控制PE13 IO口输出一定的方波信号 。 这个信号一方面有数量的限定,另一方面这个信号的频率不能是一个固定的数值(除非你的控制对时间没有要求,可以允许设备一直以一个较低的速度运行),这里我们选用了定时器 中断作为脉冲的时间基准 ,在定时器的中断函数里面我们对IO口的电平进行翻转一次获得一个方波的边缘(一半的方波) 通过对中断次数的统计我们可以实现对位置的控制(理想情况下),另一个需求就是控制速度,我的解决方案是控制中断的频率 以此来实现控制方波的频率,具体的操作就是修改 定时器的预分频器 PSC ,通过改变最终进入定时器CNT的脉冲频率来实现修改定时频率的目的(这里用到的是定时器的更新中断)
以上是初始化代码]主要是一个定时器的初始化以及中断的配置、两个通用IO的初始化
以上是中断函数部分 通过这噶函数我们可以实现对运行状态的粗略控制: 我们可以控制脉冲的数量,进而控制步进电机转过的角度。 我们可以控制定时器的中断频率,进而控制脉冲的频率 以此实现对步进电机速度的控制。
说明: 此代码只适合新手来看看,并不适用于实际生产! 步进电机的速度控制算法有比这个优秀很多的,这只是我初步写的一个初级版本,后续会补上其他版本的步进电机控制方案。
另外有一点需要注意的就是步进电机的细分选择: 我这边选择的是8细分 电流是根据电机特性选择的1.5A 细分方面不建议细分太多,这样会导致初级版本的程序频繁的进入中断函数,占用的CPU时间可能会影响程序的运行效率。细分的如果太少也会导致一些其他问题,比如电机的噪音增大。电流大小会直接影响到电机的力矩,如果电流过小可能会导致大电机启动不起来。电流过大则会导致小电机的发热严重。 EN 引脚一般是控制释放电机的 ,这里有一个概念叫做 保持力矩,也就是步进电机再点击驱动器的电流影响下会保持当前的位置难以转动,这个力矩的大小是由电流决定的也就是保持力矩。
另外分享一个快速区分步进电机的两根相线的方法: 将步进电机的任意两条相线短接,转动转子,如果有卡顿的感觉 那就说明短接的两根是同一相! 另外的两根自然就是另一相。
转自CSDN 博主:战神-B