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

发布者:cheng1984最新更新时间:2022-08-17 来源: csdn关键字:STM32  PWM信号  驱动舵机 手机看文章 扫描二维码
随时随地手机看文章

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 后记

还存在诸多问题:


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


关键字:STM32  PWM信号  驱动舵机 引用地址:【STM32】实战2—用STM32产生PWM信号驱动舵机MG996R(一)

上一篇:【STM32】实战3.1—用STM32与TB6600驱动器驱动42步进电机(一)
下一篇:【STM32】7—通用定时器 & 时钟树学习

推荐阅读最新更新时间:2024-11-17 08:38

一种电动栏杆机控制器的设计与实现
1.引言 电动栏杆机是机电一体化设备,不仅应用于公路、桥梁和口岸,同时也广泛使用在各种场区的禁行管理场合。电动栏杆系统设计的技术水平对产品的功耗、寿命及可靠性影响很大。目前我国的高速公路收费站内每一条车道都配置一台电动栏杆机。电动栏杆的快速与稳定运行对车辆快速通过收费站有着非常重要的意义。 传统的电动栏杆机大多采用继电器控制带有大减速比减速异步电机的结构形式,大多数电动栏杆需要与上位机联网,由上位机发出控制指令,通过计算机内的接口卡控制栏杆机的起停,并检测安装在电动栏杆机上的行程开关来控制抬起与落下的行程。由于计算机的不稳定性与系统不可靠性,使得电动栏杆机的可靠性降低,电动栏杆机故障引起的高速公路车流不畅屡见不鲜。另外选用
[单片机]
一种电动栏杆机控制器的设计与实现
STM32高级定时器、通用定时器TIMx、基本定时器TIM6和TIM7的区别
TIM1和TIM8定时器的功能包括: ● 16位向上、向下、向上/下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 ● 多达4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 死区时间可编程的互补输出 ● 使用外部信号控制定时器和定时器互联的同步电路 ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 ● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(
[单片机]
STM8|STM32 看门狗使用
STM8和STM32都配备了独立看门狗,其作用之大不言而喻。以下为STM8及STM32的独立看门狗使用例: 对于STM32单片机: #define SYS_IWDG_OPEN IWDG- KR=0xCCCC; #define SYS_IWDG_FEED IWDG- KR=0xAAAA; void SystemIWDG_Config(uint32 OverTime) { RCC- CSR|=RCC_CSR_LSION; while((RCC- CSR&RCC_CSR_LSIRDY)==0); IWDG- KR=0x5555; //使能模块访问 while(IWDG- SR&IWDG_S
[单片机]
STM32之CAN---中断管理浅析
1 前言 bxCAN占用4个专用的中断向量。通过设置CAN中断允许寄存器(CAN_IER),每个中断源都可以单独允许和禁用。 图1 从图1可以看出,最右边共四个中断,中断是可以通过CAN_IER来屏蔽或允许的。 2 CAN中断允许寄存器 (CAN_IER) 地址偏移量: 0x14 复位值: 0x0000 0000 图2 位31:18 保留位,硬件强制为0 位17 SLKIE: 睡眠中断允许 0: 当SLAKI位被置1时,没有中断产生; 1: 当SLAKI位被置1时,产
[单片机]
<font color='red'>STM32</font>之CAN---中断管理浅析
STM32单片机是怎样执行中断函数中的应用的
在STM32单片机的编程当中,中断函数的名称都是xxx_IRQHandler格式的。那当编译程序的时候是怎么知道这是一个中断函数的呢? 每个中断都是有入口地址的。程序在执行过程中遇到中断的时候,会先判断这个中断的类型,根据类型再到中断向量表中查找,找到之后,根据表中指明的地址,程序就跳到该地址开始执行代码。 ST提供的固件库当中,有提供一个stm32f10x_it.c文件,打开之后会发现里面放的都是些空函数,但是名字都是“xxx_Handler()”格式,需要使用某个中断的时候,在代码中使能该中断,并到这个文件中将中断服务函数添加上,就可以了。 而这些名字就是一个个的中断函数入口地址。在启动代码中便有这些定义。如下图所示:
[单片机]
STM32不用固件库易产生的问题:Undefined symbol SystemInit
最近接触STM32F10x,有时只想实现一些小功能,实在不想用冗大的官方固件库, 于是除了MDK提供的STM32F10x.s外,其余源文件都自己写。但MDK提供的启动文件 不完善,对外设和中断支持不好,于是把STM32固件库里的startup_stm32f10x_cl.s (我的芯片是stm32f107vct6)加了进来,不过,链接报错!出错信息如下: uart.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_cl.o). 百度搜到了如下的解决办法,以记之。 /***************************
[单片机]
STM32串口协议概念及结构体初始化详解+串口点灯+串口收发
一、串口通信协议简介 物理层:规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。其实就是硬件部分。 协议层:协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。其实就是软件部分。 1.RS232标准 2.USB转串口 3.原生的串口到串口 二、初始化结构体解 1.USART初始化结构体 2.同步时钟初始化结构体 3.编程时需要用到的固件库函数 三、串口点灯代码实现 1.USART .C文件 #include bsp_usart.h void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure;
[单片机]
<font color='red'>STM32</font>串口协议概念及结构体初始化详解+串口点灯+串口收发
STM32--UART异步通信学习
字符发送的过程描述:在UART的发送过程中先将数据输入到发送数据寄存器中(TDR)此时(TXE)被硬件置1,之后TDR寄存器将数据串行移入到发送移位寄存器中,将数据在TX端口发送,此时(TC)被硬件置1。 发送与接收是逆过程。 UART发送配置步骤: 1.通过USART_CR1寄存器上置位UE来激活USART。 2.编程USART_CR1的M位来定义字长。 3.在USART_CR2中编程停止位的位数。 4.如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。 5.利用USART_BRR寄存器选择要求的波特率。 6. 设置USART_CR
[单片机]
STM32--UART异步通信学习
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved