概述
在成功启动步进电机之后,可通过运行数个脉冲后停止定时器做到控制步进电机转动特定角度,实现脉冲定位。
前言
原理
步进电机是将电脉冲转化为角位移的执行机构,也就是当步进驱动器接收到一个脉冲信号后,就会驱动电机按设定方向转动一个固定的角度。所以可以通过精准控制输出脉冲的个数来控制角位移量,而脉冲频率用来控制转动角速度(详见前言)
定时器产生脉冲:利用STM32c8t6定时器输出PWM脉冲,定时器计数溢出之后则代表产生了一个脉冲,并请求一次中断,可在中断函数中记录已输出脉冲个数,就知道当前电机转动了多少角度。
细分: 常见的步进电机固有步距角为1.5°、1.8°等,步距角就是一个脉冲对应转动的角度,若是需要更小的步距角,就要用到步进驱动器的细分功能:
细分 | 步距角 | 转一圈需要脉冲数 |
---|---|---|
0 | 1.8° | 200 |
16 | 0.1125° | 3200 |
如图,驱动器设置16细分后,固有步距角就被分成了16分,此时一个脉冲就对应转动0.1125°,定位角度就更加精确。
实现结果
这里用串口输入目标角度的方式控制电机转动,结果如下:
可见,除了9°刚好是0.1125°的80倍才能精确地转动,其他度数都会存在一点误差。
PS:在此过程中,在初始化定时器之后,并没有启动定时器,但程序自动进入了一次中断,解决的办法就是在初始化函数中的修改预分频器psc前加入TIM4->CR1 |= TIM_CR1_URS;
详情见:探究STM32F103定时器初始化或程序运行中重配后会立即进入一次中断的原因和解决办法
代码
编写流程:
TIM4CH1脉冲通道配置(前言) -> DIR方向IO口配置(前言)->编写定时中断函数->main函数
static int target_angle = 0; //目标角度
static int pulse = 0; //脉冲个数
static double actual_angle =