控制原理
定时器中断完成脉冲计数与脉冲引脚翻转,脉冲等于设定脉冲后关闭定时器中断,重新控制步进电机时,打开相应定时器中断即可。
简单的速度控制方法
1.通过改变arr和psc的值来改变速度,其中arr控制电机转速,psc控制电机计数频率。以stm32f103为例,单片机主频为72M,说明每1000个时钟周期产生一次中断,并将输入时钟的频率分频为720倍。arr和psc值越小,速度越大。
2.通过改变步进电机驱动器的细分数,细分数越小,速度越大,步进电机步距角1.8度,转一圈需要200个脉冲,所以最小细分数是200,细分数为400的时候步进电机转动0.9度,细分数800时步进电机转动0.45度,以此类推。
3.PWM方式调速,这个方式我最初会用,后面发现在实际应用中,使用脉冲计数显然更好控制一些。
注:速度较快时步进电机可能丢转,或者是和目标位置有较大差距,所以速度要控制在合适范围内由脉冲数计算运动距离(丝杠滑台步进电机)假设步进电机细分数为800,步距角为1.8度,可知步进电机每次脉冲都会运动0.45度,假设丝杠螺距为5mm,说明步进电机每转一整圈就会让滑台向前运动5mm,此时:
步进电机每完成800个脉冲就会让滑台向前运动5mm
如果需要移动100mm,需要16000个脉冲由脉冲数计算运动距离(同步轮或者齿轮)
在机械臂这样的项目里,没有丝杠这么直观的距离换算方式,以下是我选用的方式:
不算直线距离,只把角度换算成脉冲。
通过正解或逆解,输入末端位置xmm,ymm,zmm后换算成机械臂需要运动的角度,后查看大小齿轮传动比。
假设步进电机齿轮齿数是9,机械臂齿数是32:
void angle_to_pulse(void)
{
pulse_we_need = (low*9/32) / per_angle;
pulse2_we_need = (rot*9/32) / per_angle;
pulse3_we_need = (high_all*9/32) / per_angle;
printf("normalized low_pulse: %d, rot_pulse: %d, high_all_pulse: %d\r\n", pulse_we_need, pulse2_we_need, pulse3_we_need); // 调试输出
}
硬件连接
使用步进电机驱动器(其他方法会放在之后介绍),PUL-引脚控制脉冲,DIR-引脚控制方向,另外两个引脚DIR+和PUL+引出到5v,用于引脚供电,使能引脚可接可不接。
VCC和GND常接开关电源,为步进电机驱动器供电。由图片也能看出来,它可以承受9~42V的直流电压。B+,B-,A+,A-是步进电机的接线
判断步进电机AB同相/异相的方式控制代码解析
在主函数中设置和重置好定时器标志位,pulse计数值后,可以通过重新开启中断的方式完成定时器计数,方向引脚上电和脉冲引脚翻转
这个函数可以设置初始速度,改变arr和psc的值,使能定时器时钟,使能定时器,设置中断优先级,是一个比较重要的定时器初始化函数
来源: 整理文章为传播相关技术,网络版权归原作者所有,如有侵权,请联系删除。