目录

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

某宝店家提供资料如下:

        【注:上图中左右所取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最大频率】

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

3.2 stm32原理图

3.3 舵机与STM32的接线方式

+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.5 0.025 5 00
45° 1.0 0.050 1 000
90° 1.5 0.075 1 500
135° 2.0 0.100 2 000
180° 2.5 0.125 2 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 后记

还存在诸多问题:

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

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

  1. 最简单的pwm信号控制舵机

    控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压.它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出.最后,电压差的正 ...

  2. STM32—TIM3输出PWM信号驱动MG996R舵机(按键控制)

    文章目录 一.前言 二.MG996R舵机简介 三.通用定时器TIMx 四.TIM3输出PWM信号代码详解 上传代码 一.前言 利用STM32的TIM3的通道1输出PWM信号,驱动MG996R舵机,按键 ...

  3. STM32实战六 PWM加移相正交

    这一章编写PWM程序,使用TIM3以两个通道,完全映射到PC6和PC7,除普通PWM输出外,增加移相正交PWM功能,为后面的编码器计数模式提供信号源. PWM.h #ifndef __PWM__ #d ...

  4. STM32实战总结:HAL之电机

    电机基础知识参考: 51单片机外设篇:电机_路溪非溪的博客-CSDN博客 无刷电机和有刷电机 先详细了解有刷电机: 带你了解(有刷)电机工作原理_哔哩哔哩_bilibili 再详细了解无刷电机: 无刷 ...

  5. STM32输出PWM信号(库函数版本)

    什么是PWM信号? 官方解释:PWM信号一般指脉冲宽度调制.脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳 ...

  6. STM32 PWM信号周期和占空比的计算

    1.PWM信号的周期计算公式 T=[(TIM_Prescaler+1)*(TIM_Period+1)]/TIMxCLK 2.PWM信号的频率计算公式 f=1/T 3.PWM信号占空比计算公式 P=[C ...

  7. 借WS2812 PWM DMA驱动调试浅谈STM32调试思路

    借WS2812 PWM DMA驱动调试浅谈STM32调试思路 ​ 接触STM32差不多有4年了,在学校参加比赛时也需要进行各种调试工作,团队的配合也需要个人具有领域内快速定位与解决BUG的能力,前些日 ...

  8. 【项目实战】基于STM32单片机的智能小车设计(有代码)

    [1]背景意义 近些年随着国民生活水平的提升,以小车为载体的轮式机器人进入了我们的生活,尤其是在一些布线复杂困难的安全生活区和需要监控的施工作业场合都必须依赖轮式机器人的视频监控技术.因此,基于嵌入式 ...

  9. 【STM32实战】机械臂快递分拣系统(二)——机械臂控制程序(上位机)编写

    [STM32实战]机械臂快递分拣系统(二)--机械臂控制程序(上位机)编写 前言 题目分析 蓝牙模块的使用 上位机程序的编写 连接阿里云 测试 前言 近期回校上最后一门课,刚好是做机械臂有关的题目,所 ...

最新文章

  1. 性能提高和支持IE 9的新的ExtJS发布版:4.02和3.4
  2. Android的内存优化
  3. android-ndk-r15c libncurses.so.5
  4. linux卸载rpm包
  5. Head first java chapter 16 集合与泛型(数据结构)
  6. 【前端攻略】最全面的水平垂直居中方案与flexbox布局
  7. 流量主系列|独立表情包壁纸喝酒神器功能微信小程序源码
  8. trafficserver records.config参数说明
  9. Toolbar设置详解----掉坑总结
  10. ROC曲线与AUC区域的理解与实践
  11. [转摘] 我的同学聚会--性格决定命运
  12. 【实战】Axis2后台Getshell
  13. 安卓投屏大师_玩转手机投屏,我推荐三款不一样的投屏工具!
  14. 软件测试流程(完整版)
  15. BeX5使用疑难总结
  16. 西数绿盘的“C1门”!!!
  17. EditText属性及一些常用用法
  18. matlab绘制世界地图代码
  19. 打印出ntdll.dll中所有函数名字和地址
  20. 在Unity3d项目中利用Udp进行局域网内通信

热门文章

  1. 用计算机画有常数的函数图像,函数图像
  2. ECDSA安全性证明
  3. 免费收听--第2版招投标软件项目管理实战课
  4. 如何打造以人为本的移动游戏
  5. Java8 lambda表达式详解
  6. 2023最新苹果CMS10魔加主题1.1.6去授权版+支持全部版本
  7. 厦门市委书记走访图扑等多家软件企业调研元宇宙产业发展情况
  8. 51单片机c语言16进制数转换10进制数,51单片机C语言里 怎样将16进制 直接化成 10进制...
  9. P2P分布式搜索引擎YaCy
  10. 【软件测试技术期末复习选择题】