来源:杏彩体育官网 发布时间: 2024-12-23 10:21:11 点击量:1
4)全套实验源码+手册+视频下载地址:ATK-DMF407电机开发板 - 正点原子资料下载中心 1.0.0 文档
本章我们的学习目的主要是了解舵机的驱动原理以及结构组成,并使用STM32将舵机驱动起来。 本章分为如下几个小节:
舵机(Servo)实际上可以看作一个伺服电机,其拥有驱动电路、控制电路,只不过一般舵机工作在一定的角度范围内,最常见的就是180度的舵机,它适用于那些需要角度不断变化并可以保持的控制系统中。目前在高档遥控玩具,如飞机、潜艇模型、遥控机器人中已经得到了普遍应用。下图为常见舵机的实物图:
舵机按照控制电路分类,可以分为数字舵机和模拟舵机,它们的机械结构是完全一模一样的,其最大的区别体现在控制电路上,数字舵机的伺服采用了数字电路(拥有MCU和晶振),而模拟舵机的采用的是模拟电路。它们最主要的区别在于:模拟舵机需要给它不停的发送PWM信号,才能让它保持在规定的位置或者让它按照某个速度转动,数字舵机则只需要发送一次PWM信号就能保持在规定的某个位置。
按照旋转角度可分为180°与360°的舵机,180度舵机只能在0度到180度(±90度)之间运动; 360°舵机转动的方式和普通的电机类似,可以连续的转动,不过我们只可以控制它转动的方向和速度,不能调节转动角度。本章我们主要讲解180°的模拟舵机。
角度传感器:用来实现位置反馈的,它会将其旋转后产生的电阻变化信号发送回控制电路,从而监控当前轴旋转的角度;
减速齿轮组:用来增大直流电机的扭矩。齿轮的材质一般有塑料齿轮、混合材料齿轮和金属齿轮。下面我们来看下舵机结构实物图,如下图所示
④接着角度传感器会将当前的电压信号反馈到控制电路板,控制电路板会根据反馈的比例电压调节舵机的转动位置,当达到目标位置后停止,形成一个闭环控制系统。工作流程如下图所示:
舵机的输入线所示,一般棕色表示GND,红色表示VCC,橙色表示信号脚,工作电压一般在4.8 ~ 6V,不同的工作电压对应不同的转矩标准,即输出力矩不同,6V的工作电压对应的力矩要大一些;根据不同的扭矩负载,工作电流可达2A以上。
其中信号线就是控制电路用于接受外部控制信号的,该信号一般周期为20ms(频率:50HZ)的脉宽调制(PWM)信号。并且该脉冲的高电平持续时间为0.5 ~ 2.5ms,对应舵盘旋转角度的0 ~ 180°,所对应的控制关系如下图所示:
从图14.3.3可以看出脉冲宽度与舵机旋转角度呈线性变化关系。也就是说我们只需要不断的提供一个脉冲周期为20ms的PWM信号给舵机,并且控制该脉冲信号的高电平持续时间占比,就可以控制输出轴保持在对应的角度上,注意角度范围不可超过180°。
①响应速度:即在接收到目标位置之后多久才可以转到目标角度,一般舵机为60度每0.17秒,另外根据负载扭矩相应速度也不等。
④舵机的扭矩:根据应用场合可从飞行器模型舵机的1.2KG/cm到大扭矩舵机的500~2000KG/cm不等,不过一般扭矩越大舵机消耗电流也越大。
由此可见这类舵机具有以下这些特点:输出力矩大,稳定性好;体积小,易安装;控制简单等。所以现在不仅仅应用于航模运动中,在机器人的关节,飞机的舵面,以及机械手等应用也越来越广泛。
本小节我们将使用STM32控制舵机转动到指定的角度位置。关于定时器如何输出PWM波的知识,请大家回顾高级定时器PWM输出实验的介绍。
F407电机开发板全部有3个舵机接口,分别由TIM8_CH1、TIM8_CH2、TIM8_CH3控制,本实验需要将舵机接入对应的舵机接口,通过按键KEY0设置控制哪个接口的舵机,KEY1增加舵机角度,最大180°,KEY2减小舵机,角度最小0°,LED0作为程序运行状态指示灯,闪烁周期200ms。
开发板设计了3组舵机接口,支持板载5V供电(注意该5V为DC口12V提供的,所以必须要接上DC口供电),原理图如下图:
图14.5.1.1中的JP3的SR+,是为舵机供电用的,它的来源可以选择板载VCC_SRV(5V)供电,也可选择外部电源接入供电(针对驱动电压比较高的舵机,比如一些12V驱动的舵机),一般我们选择板载电源供电,所以首先我们需要使用跳线帽将SRV+与VCC_SRV短接一起,这里要注意JP3跳帽处VCC_SRV的电源由DC电路提供的,所以DC口必须供电。开发板全部有三个舵机接口,其中SERVOx接舵机的信号线(通常信号线为橙色线),SRV+接舵机的电源正极(通常是红色线),GND接电源负极(通常为棕色线)。
主要特别注意的点是舵机控制信号SERVO1~3并不是直接控制舵机,而是经过电平转换来控制舵机,这样既隔离了IO,又可以控制各种不同电平的舵机。电平转换电路实际就是一个反向器,因为是反向器,所以控制电平需要反过来,比如要给舵机一个2ms高电平,周期20ms的信号,控制信号实际需要输出2ms低电平+18ms高电平。
定时器属于STM32F407的内部资源,只需要软件设置好即可正常工作。外部需要将舵机接入对应开发板的舵机接口,同时还使用按键KEY0、KEY1、KEY2进行控制。我们这里接了三个舵机(只有一个舵机的话可接到其中一个接口)实物连接图如下:
本实验用到的HAL库驱动请回顾高级定时器PWM输出实验的介绍。下面介绍一下舵机控制的配置步骤。
首先开启TIMx的时钟,然后配置GPIO为复用功能输出。本实验我们默认用到定时器8通道1、通道2和通道3,对应IO分别是PI5、PI6、PI7,它们的时钟开启方法如下:
使用定时器的PWM模式功能时,我们调用的是HAL_TIM_PWM_Init函数来初始化定时器ARR和PSC等参数。
注意:该函数会调用:HAL_TIM_PWM_MspInit函数来完成对定时器底层以及其输出通道IO的初始化,包括:定时器及GPIO时钟使能、GPIO模式设置、中断设置等。
在HAL库中,通过HAL_TIM_PWM_ConfigChannel函数来设置定时器为PWM1模式或者PWM2模式,根据需求设置输出比较的极性,设置比较值(控制占空比)等。
本实验我们设置TIM8的通道1、2、3为PWM2模式,比较值我们设置为:0.5/20*(arr+1),即默认设置PWM波的占空比为2.5%,也就是0.5ms的脉宽,对应的舵机舵盘位置为0°。
这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。舵机的控制源码主要有:高级定时器驱动源码和舵机角度设置源码四个文件:atim.c和atim.h以及steering_engine.c和steering_engine.h。源码中有明确的注释。
可以把上面的宏定义分成两部分,第一部分是定时器8输入通道1、2、3对应的IO口的宏定义,第二部分则是定时器8输入通道1、2、3的相应宏定义。下面我们来看下atim.c程序。
这个函数主要功能就是把角度值转换成定时器的比较值,我们前面介绍讲过舵机的旋转角度和脉宽成线性关系,比较值决定脉宽时间,所以我们这里把要转动的角度转成比较值控制脉宽时间,从而达到控制舵机旋转角度。接着看下一个舵机角度的设置函数。
由于我们的开发板有三个舵机接口,所以我们写的这个函数有一个id判断,id:1、2、3,分别控制舵机接口1、2、3,想要控制哪个接口的舵机就选择哪个id即可,然后第二个参数设置我们要舵机旋转的角度值,里边会调用到角度转比较值函数,然后我们将返回的数值,设置到定时器的比较值,即可完成脉宽时间的设置,控制舵机旋转对应角度。
先看atim_timx_pwm_chy_init(20000 - 1, 168 - 1)这个语句,这两个形参分别设置自动重载寄存器的值为20000,以及定时器预分频系数为168。先看预分频系数,我们设置为168分频,然后定时器8的时钟是2倍的APB2,即168MHZ,可以得到计数器的计数频率是1MHZ,也就是计数一次1us,我们计数20000次就是20ms,符合我们控制舵机的脉冲周期要求,通过按键设置比较值控制脉宽时间;然后LCD显示一些提示信息包括当前id以及当前控制舵机的角度值;注意需提前将舵机接入对应的舵机接口,按键KEY0设置控制哪个接口的舵机,KEY1增加舵机旋转角度,最大到180°;KEY2减小舵机旋转角度,最小到0°。LED0周期闪烁提示程序正在运行。
下载代码后,可以看到LED0每隔200ms左右闪烁一次,LCD显示当前所控制的舵机接口号以及舵机旋转角度,当我们按下KEY0选择控制哪个舵机接口,按下KEY1将舵机旋转角度每次加45°,最大到180°;按下KEY2将舵机旋转角度每次减45°,最小到0°。同时我们也可以不接舵机,使用示波器查看输出波形的脉宽时间。
下面我们使用正点原子DS100手持数字示波器,把舵机接口一的控制信号引脚连接至示波器通道,看波形截获,具体如下:
可以看到当控制舵机旋转90°时,脉冲频率50HZ(20ms),脉宽1.5ms和我们前面介绍的完全一致,大家可以自己尝试测量看看。