有关STM32核心板控制松下伺服电机
源码下载链接:https://download.csdn.net/download/qq_43751669/12125876
硬件的使用:
首先是这次课程设计的硬件的使用,在ARM部分,老师给我们提供了普中科技的核心板以及一块普中科技的一个LCD屏,主要的型号我也没记太清楚,主要还是因为我没有使用老师提供的,以前参加比赛和自己玩的时候就是用的普通的一个核心板(STM32F103ZET6),还有正点原子的LCD屏(ALIENTEK 3.5` TFTLCD),还有一块以前比赛用到的自己打的PCB板,自己用的比较习惯,还有自己的以前一些代码可以直接移植。控制方面还是使用了两个PC817光耦,因为stm32核心板提供的控制电压最大为3.3V,不满足驱动器的控制引脚的需要,因此需要通过光耦进行升压控制。
电机方面,伺服电机驱动器学校给我们提供的是MBDHT2510,伺服电机提供的是MSMD042G1U,这个电机的额定转速是3000转/分钟,因此我在软件设计部分能够设置的最大的转速就是3000转/分钟。最后主要的看到效果的部分就是一个伺服电机的机架。
伺服电机的控制方式
伺服电机有转矩、位置、速度三种控制方式,以下分别介绍:
1.转矩控制:
转矩控制方式是通过外部模拟量的输入或直接的地址赋值来设定电机轴对外输出转矩的大小。例如,若10V对应5Nm的话,当外部模拟量设定为5V时,伺服电机轴输出为2.5Nm。转矩控制方式主要应用在对材质的受力有严格要求的缠绕和放卷的装置中,例如饶线装置或拉光纤设备,转矩的设定要根据缠绕的半径的变化随时更改以确保材质的受不会随着缠绕半径的变化而改变。
2.位置控制:
位置控制模式一般是通过外部输入 的脉冲的频率来确定转动速度的大小,通过脉冲的个数来确定转动的角度,也有些伺服电机可以通过通讯方式直接对速度和位移进行赋值。于位置模式可以对速度和位置都有很严格的控制,所以一般应用于定位装置。
3.速度控制:
通过模拟量的输入或脉冲的频率都可以进行转动速度的控制,在有上位控制装置的外环PID控制时速度模式也可以进行定位,但必须把电机的位置信号或直接负载的位置信号给上位反馈以做运算用。位置模式也支持直接负载外环检测位置信号,此时的电机轴端的编码器只检测电机转速,位置信号就由直接的最终负载端的检测装置来提供了,这样的优点在于可以减少中间传动过程中的误差,增加整个系统的定位精度。
本次课程设计中我选用的控制方式为位置式控制。主要就是通过使用一个PWM信号来控制电机的转动,不同的PWM的频率对应不同的转速,另一个高低电平来控制电机的转动方向。在驱动器的内部提供的双闭环系统,可以实现电机的方向突变和速度的突变。
光耦电路的设计
这里只是我推荐的控制电路图,当然还有别的方案,你们也可以选择别的方法,能达到具体的功能即可。
STM32与伺服驱动器的连接
由于需要通过STM32核心板来控制驱动器进而控制伺服电机进行一系列的操作,就需要将stm32核心板和伺服电动机驱动器连接起来,主要是控制伺服电动机驱动器的X4口。
其中位置控制的X4口接线如下图:
在这次课程设计中,STM32与伺服电动机驱动器的X4口连接并不需要把所有的50个引脚全部接上,为了达到课程设计所需要达到的效果,只需要接入7根线就足够了。
分别是:
引脚 | 说明 | 接线方式 |
---|---|---|
引脚3 | PULS1 | 连接+12V电源 |
引脚4 | PULS2 | 电机的控制脉冲信号,使用PWM信号 |
引脚5 | SIGN1 | 连接12V电源 |
引脚6 | SIGN2 | 高低电平控制电机旋转方向 |
引脚7 | COM+ | 连接12V电源 |
引脚29 | SRV-ON | 接地 |
引脚41 | COM- | 接地 |
A5驱动器的参数设置
下面的一些参数配置是经过了很长的时间才摸索出来的,虽然松下驱动器的使用说明都写了,但是找起来都比较麻烦,而且不会写的很直白,不会直接告诉你该怎么才能实现想要达到的目标。这里告诉大家我的配置方式,希望能给大家一些方向,节省大家的时间。
控制模式设置
使用位置控制模式需要设定好伺服电机驱动器,这里需要将Pr0.01配置为3。
指令模式设置
课设过程中我将Pr0.06设置为了0,将Pr0.07设置为了3。这样才能实现一个引脚控制电机的转动速度,另一个引脚控制电机的转动方向。一开始写程序的时候没有想到要配置这个,弄了很久都没有成功,花了很长时间才完成。
电机旋转一圈所需指令脉冲设置
设置伺服电机旋转一圈所需要的指令脉冲数,即给引脚4一定数量的脉冲,可以让电机转动一圈。
前面说了课设中用到的电机上标明了额定的转速为3000转/分。考虑到本次使用的核心板的为stm32f1,能达到的最大时钟为72MHz,因此我将Pr0.08设置为了3200,电机脉冲控制脚每接收3200个脉冲,电机就会转动一圈,基本能达到额定的转速。
最后要在这里告诉大家,设置好参数之后,一定要记得保存,否则之前的设置是没有效果的,一开始我也被困扰到了。具体方式为:
- A/A4系列 改完参数之后 按一下set 返回到 pr__,再按一次mode 出现EE-SEE,再按一下set,出现EEP----,按住向上的方向键保持5秒钟,出现finishe 或者reset就可
- A5系列 改完参数之后 长按set 返回到 pr__,再按一次mode 出现EE-SEE,再按一下set,出现EEP----,按住向上的方向键保持5秒钟,出现finishe 或者reset就可
软件设计部分
PWM
相信大家都应该懂PWM吧,不懂得上网查一下。
这里我给大家啊简要介绍一下用STM32配置产生PWM得一些步骤:
①使能定时器3和相关IO口时钟。
使能定时器3时钟: RCC_APB1PeriphClockCmd();
使能GPIOB时钟: RCC_APB2PeriphClockCmd();
②初始化IO口为复用功能输出。函数: GPIO_Init();
GPIO_InitStructure.GPIO_Mode=GPIOMode_AF_PP;
③这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,
所以需要开启AFIO时钟。同时设置重映射。
RCC_APB2PeriphClockCmd(RCC APB2Periph AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
④初始化定时器: ARR,PSC等。TiMTimeBaselnit();
⑤初始化输出比较参数: TIM_0C2Init();
⑥使能预装载寄存器:TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
⑦使能定时器。TIM_Cmd();
⑧不断改变比较值CCRx,达到不同的占空比效果:TIM_ SetCompare2();
关键部分的程序如下:
‘’’
//初始化TIM2
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseStructure中指定的参数初始化TIM2// 初始化TIM2的通道3
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OCInitStructure.TIM_Pulse = (arr+1)/2-1; //设置PWM比较参数TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //初始化通道3的PWM
TIM_ARRPreloadConfig(TIM2, ENABLE); //允许在定时器工作时向ARR的缓冲器中写入新值
TIM_Cmd(TIM2, ENABLE);
‘’’
转速和方向的控制
程序设计上,我采用了通用定时器TIM2的通道3产生PWM波控制电机的脉冲控制脚,用一个GPIO口输出的高低电平来控制电机的方向控制引脚。
其中PWM的配置过程中,我把定时器的预分频系数固定,之后只需要改变定时器的重装载值就可以改变产生的PWM输出信号的频率,从而达到改变电机转速的目的。
STM32输出PWM的频率计算公式:
Fpwm = 72MHz / ((arr+1)*(psc+1))
arr 是重装载值
psc 是预分频值
如果想要电机的转速达到每分钟3000转,按照前面配置的电机每转1圈需要3200的脉冲,每分钟PWM就需要产生32003000=9600000个脉冲,因此PWM的输出频率就为9600000/60=160000Hz。
程序设计过程中,我将预分频值定为了14,想要电机达到指定的频率,预分频系数就要设置为72000000/160000(14+1)-1=29,以此类推,想要达到不同的转速,只需要计算出对应的重装载值并配置。
改变重装载值的函数TIM_SetCompare3(TIM2,arr);
控制电机的正反转用的是GPIOA的三号引脚。
改变GPIO口的输出电平的函数:
GPIO_ResetBits(GPIOA, GPIO_Pin_3); //置0,电机反转
GPIO_SetBits(GPIOA, GPIO_Pin_3); //置1,电机正转
控制转动指定圈数
控制电机旋转指定的圈数,并且可以控制正反好转以及转动的转速。
像前面说的,电机的脉冲控制引脚每接收到3200个脉冲就会转动一圈,想要转动指定的圈数,至于要进行指定次数的循环即可,每次循环里面都给3200个脉冲给控制引脚。想要实现这一功能,我采取的是STM32的定时器的主从模式。
主从模式:
STM32的每个定时器都可以由另一个定时器触发启动定时器一般是通过软件设置而启动,STM32的每个定时器也可以通过外部信号触发而启动,还可以通过另外一个定时器的某一个条件被触发而启动.这里所谓某一个条件可以是定时到时、定时器超时、比较成功等许多条件.这种通过一个定时器触发另一个定时器的工作方式称为定时器的同步,发出触发信号的定时器工作于主模式,接受触发信号而启动的定时器工作于从模式。
各个定时器内部连接时的各个通道:
主从控制的特殊配置的部分函数:
//定时器2主模式设置
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
//定时器1从模式设置
//TIM2主连接TIM1,TIM_TS_ITR1
TIM_SelectInputTrigger(TIM1,TIM_TS_ITR1);
//设置从模式寄存器
TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_External1);
移动固定的距离
通过询问老师伺服电机驱动机架的尺寸,得知电机每转动一圈,机架可以移动40mm,也就是每3200个脉冲电机移动40mm,平均一个脉冲电机运动0.0125mm,精确度还是很高的。控制电机的正反转就可以实现电机往两个方向运行指定的距离。
在程序中我还实现了电机的来回往返运动,输入想要运动到的位置,开始之后就会运动到指定的位置,然后往回运行到刚开始的位置,就这样不停的运行。
人机交互
每次课程设计主要的交互方式是通过触摸屏控制,而没有使用实体按键控制,整个的软件设计,我一共设计了四个界面,分别是:
总结
总的来说这次的设计还是比较简单的,希望大家能够完成的更好,该分享的也都分享了,全部原创,感谢分享。