【STM32】实战2—用STM32产生PWM信号驱动舵机MG996R(一)

目录

0 参考资料出处

参考博客

1 实验预期效果

2 硬件学习

2.1 舵机MG996R

3 STM32CubeMX的相关配置与接线

3.1 配置定时器TIM3

3.2 stm32原理图

3.3 舵机与STM32的接线方式

4 代码编写与实验效果

4.1 函数理解

4.2 代码编写

4.3 实现效果

5 后记


0 参考资料出处

参考博客:

        1、STM32CubeMX-定时器产生PWM驱动舵机_Top嵌入式的博客-CSDN博客_cubemx 舵机

        2、STM32F407+CubeMX-使用TIM产生PWM信号_Wallace Zhang的博客-CSDN博客_cubemx 生成pwm

; 

        3、STM32CuBeMX驱动舵机_Fitz_Cao的博客-CSDN博客_cubemx舵机

        4、舵机使用笔记(mg996 + stm32角度控制代码)_广东老周的博客-CSDN博客_mg996r舵机控制

1 实验预期效果

        完成舵机的90度旋转(不通过串口控制)。

2 硬件学习

2.1 舵机MG996R

        某宝店家提供资料如下:

22bfad8341874dca80752196da0b8c41.png

        【注:上图中左右所取0度参考位置不同,后文以左侧为准】

        根据对应数值可得脉冲宽度与转动角度的关系式为:脉冲宽度 = 0.5 + 角度值A / 90°

        所以可得占空比公式占空比 = (0.5 + A / 90) / 20

        有博客舵机使用笔记(mg996 + stm32角度控制代码)_广东老周的博客-CSDN博客_mg996r舵机控制归纳如下:

        ① PWM信号周期:20000us; 

        ② 0度时,高电平时长:500us;

        ③ 180度时, 高电平时长:2500us;

        ④ 每增加1 °,需增加高电平时长:(2500-500)÷180 = 11.1us;

        ⑤ 某角度值A,需要的总高电平时长:(A x 11.1 + 500)us; 

3 STM32CubeMX的相关配置与接线

3.1 配置定时器TIM3

        由博客【STM32】7—通用定时器 & 时钟树学习_kokoのadventure的博客-CSDN博客的2.2部分分析可知,TIM3内部时钟来源是PCLK1 = 84MHz预分频系数(PSC)设置为:83(即84 - 1),则84 000 000 / 84 = 1MHz,即每秒计数1M次,即每秒产生gif.latex?10%5E6个脉冲

        【注:当每秒产生gif.latex?10%5E6个脉冲时,Counter Period(ARR)和Pulse在数值上正好与各自单位为us的持续时间相当,因为us与s的数量级刚好差gif.latex?10%5E6】 

        为使每20ms产生1次PWM信号(舵机控制需要一个20ms的时基脉冲,即其频率为50Hz),则经过20 000(即0.02/1 * gif.latex?10%5E6)次脉冲就应重新开始计数,则自动重装值(AutoReload Register,简称ARR)为19 999(即20 000 - 1)。

【PWM相关概念这篇博客讲的很清楚:stm32输出比较PWM_小聪不想秃头的博客-CSDN博客_stm32输出pwm最大频率

b98fdd66d47b4f34bcdc97ecec8685f2.png

【博客STM32F407+CubeMX-使用TIM产生PWM信号_Wallace Zhang的博客-CSDN博客_cubemx 生成pwm的2.3部分对Counter Period与Pulse有清晰直观的解释】

3.2 stm32原理图

6d3029fd77ed405d94e05bca7c010826.png

3.3 舵机与STM32的接线方式

894216837c7943599795ad32ac6e5572.png

        +5V —— 5V        (0V)GND —— GND       (PWM)信号线 —— PA6

4 代码编写与实验效果

4.1 函数理解

/**
  * @brief 启动PWM信号的生成。
  * @param htim TIM handle
  * @param Channel 要启用的TIM通道
  *该参数可以是以下值之一。
  * @arg TIM_CHANNEL_1: 选择的TIM通道1
  * @arg TIM_CHANNEL_2: 选择的TIM通道2
  * @arg TIM_CHANNEL_3: 选择的TIM通道3。
  * @arg TIM_CHANNEL_4: 选择的TIM通道4
  * @retval HAL status
  */

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

 /**
  * @brief 在运行时设置TIM捕获比较寄存器的值,而不需要调用另一个time ConfigChannel函数。
  * @param __HANDLE__ TIM handle.
  * @param __CHANNEL__ 要配置的TIM通道。
  *该参数可以是以下值之一。
  * @arg TIM_CHANNEL_1: 选择的TIM通道1。
  * @arg TIM_CHANNEL_2: 选择的TIM通道2
  * @arg TIM_CHANNEL_3:选择的TIM通道3。
  * @arg TIM_CHANNEL_4: 选择的TIM通道4。
  * @param __COMPARE__指定捕获比较寄存器的新值。
  * @retval 无
  */
 

__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) 

【相关库函数见【STM32】HAL库学习 3—hal_time_kokoのadventure的博客-CSDN博客】 

4.2 代码编写

        ① 控制数(即__COMPARE__)= 占空比 * 时基脉冲数(此处应为20 000) - 1

        占空比 = (0.5 + 角度值A / 90) / 20

        所以,可得表:

角度脉冲宽度(ms)占空比控制数 + 1
0.50.0255 00
45°1.00.0501 000
90°1.50.0751 500
135°2.00.1002 000
180°2.50.1252 500

以下基于博客STM32CubeMX-定时器产生PWM驱动舵机_Top嵌入式的博客-CSDN博客_cubemx 舵机的代码进行改写:

/* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */  
/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,500-1);     //0度
		HAL_Delay(1000);

		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,1500-1);    //90度
		HAL_Delay(1000);
  }
  /* USER CODE END 3 */

4.3 实现效果

舵机90度旋转

5 后记

        还存在诸多问题:

                硬件上:舵机转到指定角度后会左右晃动几下,有时达不到指定角度就返回零度。

  • 13
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值