实习公司项目须要控制步进电机,电机方面主要包括控制运动、加减速、限位。下面介绍一下在电机控制方面的心得,因为对于电机的控制不须要很精确,而且自身能力有限,相比于大牛有很大的差距。数组
主要是控制滑块的运动,开始运动时须要加速,当稳定在最高速度时匀速运动,检测到下端限位信号时,开始减速直到中止,而后进行反向加速,匀速,检测到上端限位时中止运动。测试
加速——匀速——减速——中止——反向——加速——匀速——中止spa
本次电机为两相四线步进电机,两相:电机有两个线圈(绕组),四线:电机有四根线,通常是A+ A- B+ B-。有些电机不会标注出线的极性,其实能够用万用表测,短接的就是同一个绕组,或者短接以后电机转动很费力,也表明是同一个绕组。excel
电机的运动须要较大的电流,这取决于电机自己和负载,因此一般须要驱动芯片。并且驱动芯片能够实现许多附加的功能,包括细分、休眠、保护等。本次采用的是DRV8825驱动芯片模块。模块的介绍图如图所示:code
引脚介绍:blog
1.ENABLE/:使能引脚,高电平中止工做,低电平正常工做;it
2.M0-M2:表明细分,最大能够达到32细分,这部分能够参考datasheet;class
3.RESET/ 、SLEEP/:低电平会休眠和复位,所以电机正常工做时,两个引脚接高电平;软件
4.STEP:最重要的引脚,经过单片机给这个引脚PWM信号,控制电机运动;date
5.DIR:0和1控制电机方向;
6.VMOT:供电引脚,通常用12-20V就能够了;
7.B2-A1:接电机四根线;
8.FAULT/:接高电平工做;
光电限位采用的反射型,型号为sy1200,感应距离为1-4mm,当没有遮挡时,输出低电平;有遮挡时,表明有光反射回来,输出高电平;测试过程当中,发现最好采用白色的平面反射,效果更好。
软件主要就是经过stm32输出PWM脉冲,脉冲的频率决定了电机的速度。
PWM经过定时器产生,决定频率的主要是arr重装载值,以及psc预分频值。最终输出的PWM频率为72000k/(arr*psc)。
因为须要作到加减速,也就意味着PWM的频率是改变的,所以arr的值须要改变。参考网上对于加减速的一些方法:主要有T型加减速和S型加减速,实现方法有公式法或者查表法。因为公式法比较麻烦,就直接采用了查表法。因此根据须要的频率,计算出不一样频率下的arr值,写到数组里,就能够实现频率的改变。不过这种方法下,频率的改变是根据时间作线性或者S型变化,这种方法对吗?仍是根据步数来改变?
S型加减速:
T型加速就是匀加速,固定加速度。S型加速须要根据公式计算,详细说明以下:
其中Fcurrent表明某个点的频率:Fmin表明最小频率;Fmax表明最大频率;Flexible为S曲线区间系数,越大表明压缩的最厉害,中间(x坐标0点周围)加速度越大;越小越接近匀加速。理想的S曲线的取值为4-6;num:频率点/2;
例如想要从1kHz加速到40kHz,中间通过40个点,Fmin=1kHz,Fmax=40kHz,num=40/2=20,最后经过excel计算出各个频率值,能够发如今末端的加速是很是缓慢的,中间加速比较大。问题就是,初始速度并非1khz了,他取决于系数的取值,取6时,初始速度就越小。
软件中实现:
采用定时器3输出PWM脉冲,定时器2用于计数中断(更精确的控制能够经过定时器2来计算出给出多少个脉冲,也就是电机运动的步数,那样的话就能够精确控制电机运动,造成开环反馈)
// 加减速实现部分
void TIM2_IRQHandler(void) // { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // time++; if(time>=35)// { time=0; //每x个周期进入定时后,对time进行清零,而后从新进行累加 if(jiasu==1) //加速状态 { n=n+1; fre=freq[n]; } if(jiasu==0) //减速状态,检测到下端的限位后进行减速,此时的n应该等于加速以后的最大值,也就是频率最大的时候,接下来进行递减,速度下降 { n=n-1; fre=freq[n]; } if(n>=38)// { n=38; } if(n<=0) //根据前面速度递减,当减到第一个数时,速度已经降到了1k,可让电机开始中止而后转向 { GPIO_SetBits(GPIOC,GPIO_Pin_6); // 拉高步进电机的enable,中止运动 DIR0=!DIR0; //转向 delay_ms(100); n=0; fre=freq[n]; jiasu=1; GPIO_ResetBits(GPIOC,GPIO_Pin_6); // 转向以后拉低电机的enable,开始运动 } TIM3_PWM_Init(fre,9); TIM_SetCompare4(TIM3,fre/2);// 改变TIM3的输出频率,从而改变电机的速度 } } }