有关STM32核心板控制松下伺服电机

news/2024/11/23 23:57:44/

有关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根线就足够了。
分别是:

引脚说明接线方式
引脚3PULS1连接+12V电源
引脚4PULS2电机的控制脉冲信号,使用PWM信号
引脚5SIGN1连接12V电源
引脚6SIGN2高低电平控制电机旋转方向
引脚7COM+连接12V电源
引脚29SRV-ON接地
引脚41COM-接地

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,精确度还是很高的。控制电机的正反转就可以实现电机往两个方向运行指定的距离。
在程序中我还实现了电机的来回往返运动,输入想要运动到的位置,开始之后就会运动到指定的位置,然后往回运行到刚开始的位置,就这样不停的运行。

人机交互

每次课程设计主要的交互方式是通过触摸屏控制,而没有使用实体按键控制,整个的软件设计,我一共设计了四个界面,分别是:
图一 图二
图3 图4

总结

总的来说这次的设计还是比较简单的,希望大家能够完成的更好,该分享的也都分享了,全部原创,感谢分享。


http://www.ppmy.cn/news/534751.html

相关文章

国内电容市场份额达七成,松下如何抢占高地?

01 电容市场发展 电容器是三大电子被动元器件之一,是电子线路中不可缺少的基础元件,约占全部电子元件用量的40%,产值的66%。中国电容器行业规模增速持续高于全球规模增速,中国市场的快速增长成为拉动全球电容器行业规模增长的主要…

MCU(Cortex - M3/M4)启动加载过程和内存分配原理 笔记

最近发现对基础不太熟悉,写篇笔记记录一下MCU启动到用户C语言运行,之前做了那些工作,同时flash和Ram又分别保存了那个数据,每一段又是什么意义,方便后续自己忘记了,查阅。 一、 MCU启动 在MCU上电/复位之后…

Matplotlib---散点图

1. 散点图 scatter函数用于绘制散点图。下面是scatter函数的语法格式: scatter(x, y, sNone, cNone, markerNone, cmapNone, normNone, vminNone, vmaxNone, alphaNone, linewidthsNone, edgecolorsNone, **kwargs)参数解释: x:指定散点的…

软件项目管理 第三章软件项目的启动过程课后习题参考答案——主编:李冰、张桥珍、刘玉娥

第三章 软件项目的启动过程 课后习题参考答案 1.选择题 (1)乙方在项目初始阶段的主要任务不包含以下哪一项(D)。 A. 项目分析 B. 竞标 C. 合同签署 D. 合同管理 (2)项目章程中不…

Redis入门(2)-字符串

String是Redis最基础、最常见的类型,string类型的value中可存放任意数据,包括数值型、二进制的图片、音频、视频、序列化对象等。一个String类型的value最大是512M. 1.getset k v 若key存在返回之前的值,若不存在返回nil 2.strlen key 返…

Spark RDD | 常用函数讲解与代码实践

😄 因为spark里用的就是RDD数据结构来存储数据,所以对数据处理离不开RDD的各种函数操作咯!这一节就跟着梁云大佬打卡下如何处理RDD。【下面章节有🔥的是用的比较多的函数】 文章目录 0、初始化pyspark环境与driver介绍0.1、初始化0.2、driver是啥?1、创建RDD1.1、法1:通…

独家:海尔消金“重仓”医美,月放款量惊人

作者 | 周古 来源 | 镭射财经(leishecaijing) 边补充线下直营团队,边大规模扩张市场,海尔消费金融的医美分期业务正在组织一场大跃进。 继度小满退出医美分期直营市场后,海尔消费金融加快布局医美分期业务。海尔消费…

海尔微型计算机硬盘如何拆卸,海尔a62的详细拆机步骤【图文教程】

随着社会的不断发展,台式电脑已经无法满足市场的需求了,现在 笔记本电脑 非常地流行,它以轻薄的机身和过高的配置赢得了很多顾客的喜爱,所以市场上也出现了各种品牌的笔记本电脑。大家知道吧,任何东西都是优势互补的&a…