资讯专栏INFORMATION COLUMN

STM32CubeMX笔记(9)--定时器生成PWM特定波形,控制舵机转动

darryrzhong / 3650人阅读

摘要:只能在度到度之间运动,超过范围,舵机轻则齿轮打坏,重则烧坏内部电路舵机能度转动能控制转速。相关定时器的参数设置定时器为例编写相关的函数文件相关函数开启添加定时器的通道和通道的生成开启使能函数,放置于到中的用户代码区。


1、舵机相关知识

1.1 相关舵机的知识点:

  • 舵机的分类
    按照旋转角度
    180°舵机:能给定角度、固定转速。 只能在0度到180度之间运动,超过范围,舵机轻则齿轮打坏,重则烧坏内部电路.
    360°舵机:能360度转动, 能控制转速。但不能调节转动的角度
    按照控制信号
    模拟舵机:要持续提供PWM信号才能固定角度。优点:便宜。
    数字舵机:只要给一次PWM信号就能固定角度。优点:高精度,响就快,抖动小,更大的角度固定力。

  • 几个重要参数
    最大扭矩
    如MG996, 最大扭矩: 13KG/cm. 这个是在舵机堵转时测得的, 其时距离轴中心1cm处能挂起的重量.
    工作电压
    如常用的3.0V~7.2V, 接入电压不同, 所能产生的工作扭矩自然不同. 直接影响角度固定力。

  • 引脚说明
    红色:供电;电流比较大,除非测试, 真不建议在开发板上取电;
    粽色:地线;必须与控制器, 如SMT32芯片共地;
    橙色:PWM信号线;接芯片的TIMx外设的CHx脚;

1.2 舵机的控制:

  • 原理简介
    舵机接收的是PWM信号,能使舵机内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,当电压差为零时,电机停转,从而达到伺服的效果。
    即,给舵机提供一个特定的PWM信号,舵机就可以旋转到指定的位置。

  • PWM信号、角度
    舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。

为了更好地理解其信号,和编写代码,把PWM关键点转换如下:

PWM信号周期: 20000us
0度时,高电平时长: 500us
180度时, 高电平时长:2500us
每增加1 °,需增加高电平时长:(2500-500)÷180 = 11.1us
某角度值A,需要的总高电平时长:(A x11.1 +500)us


故在设置定时器参数时
预分频(PSC):72-1;
计数值(Counter):20000-1;(计数从0开始,所以要减1)

设置计数值为20000对应PWM信号周期:20000us;
控制对应的为对应通道的CCR设置为:500-2500;

重点解释一下:PSC, ARR, CCR, CNT
PSC:TIM时钟的分频系数:72;内部时钟经PSC值分频后, 传给CNT计数器使用;
CNT:计数器,CNT每计数一次的脉冲时长为:1÷(CLK÷PSC) = 1÷(72000000÷72) = 0.000001s/次 = 1us/次;
ARR:自动重装载值:20000,AutoReload Register也称为Counter Period,CNT计数器经过多少次脉冲就重新开始计数。用这个值可控制需要的PWM信号周期:1us x 20 000次 = 20 000us = 20ms
CCR:用于控制周期内高电平时长, 当CNT

特别地说明: 把所有ms值, 转换为us值, 是为了方便代码的编写和理解


2、STM32CubeMX引脚设置和代码生成

2.1 相关STM32CubeMX生成代码配置如下:

相关外部晶振的设置参考:STM32CubeMX笔记(5)–定时器中断

1、在STM32CubeMX软件右侧:
选择Times定时器设置项,根据下图进行配置相对应的定时器相关参数的设置。
(选择内部时钟源、设置通道的模式、设置预分频、计数值)

定时器频率=时钟频率/(预分频*计数值)

T i m e s ( H z ) = I n t e r n e l C l o c k ( M H z ) P S C ∗ C o u n t e r . Times(Hz) = /frac{InternelClock(MHz)}{PSC*Counter}. Times(Hz)=PSCCounterInternelClock(MHz).

下面图中设置的舵机的频率为50Hz,使用定时器8生成PWM波

其中内部时钟频率为APB1(InternelClock)频率为72MHz(根据时钟树看出)

预分频(PSC):72-1; 计数值(Counter):20000-1;(计数从0开始,所以要减1)
设置计数值为20000对应PWM信号周期:20000us;
控制对应的为对应通道的CCR设置为:500-2500;

设 置 生 成 的 频 率 = 72000000 72 ∗ 20000 = 50 H z 设置生成的频率= /frac{72000000}{72*20000}=50Hz =722000072000000=50Hz

2、在STM32CubeMX软件右上角,点击GEBERATE CODE项,生成代码。


相关定时器的参数设置:(定时器8为例)


3、编写相关的C函数文件

3.1、相关PWM函数开启:

1)添加定时器8的通道1和通道2的PWM生成开启使能函数,放置于到main.c中的用户代码区

/* USER CODE BEGIN 2 */   HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1);   HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_2);/* USER CODE END 2 */

3.2、相关PWM占空比设置:

2)通过类似如下的设置,即可设置定时器8的通道1和通道2的相关占空比寄存器,直接控制PWM的占空比输出

   TIM8->CCR1 = 800;    TIM8->CCR2 = 1800; 

3.3、相关PWM占空比设置函数改进:

3)将上述寄存器进行改进,整合出相关的函数文件

/**************************************************************************函数功能:定时器TIMx的PWM输出占空比CCRx设置函数入口参数:[TIMx]:TIM1~8、[CHx]:TIM_CHANNEL_1~4、[CCR]:0~65535(舵机控制时:0~2500)返回  值:无说    明:通过设置TIMx寄存器CCRx的值设置输出通道的占空比**************************************************************************/void TIM_SetCCR(TIM_TypeDef *TIMx, uint32_t CHx, uint16_t CCR) {      	if(CHx==TIM_CHANNEL_1)    TIMx->CCR1 = CCR;  	if(CHx==TIM_CHANNEL_2)    TIMx->CCR2 = CCR;  	if(CHx==TIM_CHANNEL_3)    TIMx->CCR3 = CCR;  	if(CHx==TIM_CHANNEL_4)    TIMx->CCR4 = CCR;} 

函数的引用效果如下:

以下两个代码片段的使用效果相同,如下。
设置通道1占空比为50hz,高电平时间800us
设置通道2占空比为50hz,高电平时间1800us

   TIM_SetCCR(TIM8,TIM_CHANNEL_1,800);   TIM_SetCCR(TIM8,TIM_CHANNEL_2,1800);
   TIM8->CCR1 = 800;    TIM8->CCR2 = 1800; 

进一步测试,将以下代码复制到主函数的循环中:

 /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) {   	TIM_SetCCR(TIM8,TIM_CHANNEL_1,800);   	TIM_SetCCR(TIM8,TIM_CHANNEL_2,1800);   	HAL_Delay(1000);   	   	TIM_SetCCR(TIM8,TIM_CHANNEL_1,1800);   	TIM_SetCCR(TIM8,TIM_CHANNEL_2,800);   	HAL_Delay(1000);   /* USER CODE END WHILE */   /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */

4、编译工程文件,使用ST-Link烧录,测试定时器中断

将对应的通道输出接口连接上舵机的PWM控制线,进行相关转角的测试。
对应舵机来回旋转。


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122110.html

相关文章

  • 10. STM32——PWM 控制舵机(超声波感应开盖垃圾桶)

    摘要:中央对齐模式向上计数时当时通道为无效电平,否则为有效电平向下计数时一旦通道为有效电平,否则为无效电平。一般来说,舵机接收的信号频率为,即周期为。 STM32——P...

    jasperyang 评论0 收藏0
  • 项目六:时器一产生PWM控制舵机

    摘要:本次实验的采用的舵机是度伺服,控制关系如下二舵机电路图三高级定时器产生波相比普通定时器初始化中需要多加两句重复计数器的值主输出使能四代码电机初始化延迟初始化电机管脚初始化寻迹管脚初始化。 一、舵机工作原理     控制信号由接收机的通道进入信号调制芯片,获得直流的偏置电压。它内部有一个基准电...

    kelvinlee 评论0 收藏0
  • 使用STM32CubeMX初始化STM32F031F6Px系列

    摘要:利用可视化界面来进行的相关配置,所以时钟滴答定时器串口等就不用根据数据手册去操作标准库甚至是寄存器了,可以通过软件直接生成。 使用STM32CubeMX初始化ST...

    Zhuxy 评论0 收藏0
  • 项目三:利用PWM波和GPIO控制电机

    摘要:较高时,电机运行连续平稳噪音小,但器件功耗会随频率升高而增大较低时,利于降低功耗,并能提高调速线性度,但过低的频率可能导致电机转动连贯性的降低。通常时,器件能够稳定的控制电机。 一、驱动芯片介绍 TB6612 的的用法:      TB6612 是双驱动,也就是可以驱动两个电机下面分别是控制...

    taowen 评论0 收藏0
  • 单片机入门指南

    摘要:单片机入门指南本文基于常神文章基础上将单片机入门部分进行细化尽可能细节做到可实施性先引用一下常神的文章首先假设大家已经对高中物理的电路部分有所了解。单片机,如,是一种根据程序控制引脚高低电平的可编程器件,有些场合又将这种行为称作嵌入式。 ...

    nevermind 评论0 收藏0

发表评论

0条评论

darryrzhong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<