单片机
返回首页

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

2022-08-17 来源:csdn

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次,即每秒产生个脉冲。


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


        为使每20ms产生1次PWM信号(舵机控制需要一个20ms的时基脉冲,即其频率为50Hz),则经过20 000(即0.02/1 * )次脉冲就应重新开始计数,则自动重装值(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


        所以,可得表:

image.png

以下基于博客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 后记

还存在诸多问题:


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


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 简洁的过零调功器电路设计与分析

  • CCFL的工作原理及电子驱动电路解析

  • MT3608构成3.7V转12V的升压电路图

  • 基于M66T旋律发​​生器的电路图解析

  • 基于CA3193的热电偶放大器电路

  • 基于TDA1554的立体声放大器电路

    相关电子头条文章