资讯专栏INFORMATION COLUMN

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

jasperyang / 1176人阅读

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

通用定时输出PWM

以TIM3为例,STM32的通用定时器氛围TIM2,TIM3,TIM4,TIM5,每个定时器都有独立的四个通道可以用来作为: 输入捕获,输出比较,PWM输出,单脉冲模式输出等。

STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM波输出,高级定时器TIM1,TIM8可以同时产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32可以最多同时输出30路PWM输出!

PWM的工作原理

以向上计数为例,讲述PWM原理:

  1. 在PWM输出模式下除了CNT(计数器当前值),ARR(自动重装载值),CCRx(捕获/比较寄存器值)。

  2. 当CNT小于CCRx时,TIMx_CHx通道输出低电平

  3. 当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平

所谓脉宽调制信号(PWM波),就是一个TIMx_ARR自动重装载寄存器确定频率(由它决定PWM周期),TIM_CCRx寄存器确定占空比信号。

PWM的模式

TIM_OCMode_PWM1 (边沿对齐模式)

向上计数时: 当TIMx_CNT

向下计数时: 一旦TIMx_CNT>TIMx_CCRx,CCR1通道1为无效电平,否则为有效电平。

TIM_OCMode_PWM2(中央对齐模式)

向上计数时: 当TIMx_CNT

向下计数时: 一旦TIMx_CNT>TIMx_CCRx,CCR1通道1为有效电平,否则为无效电平。

占空比

是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比。

舵机

实物图

接线

SG9O电机

硬件接线:

红线 : 3.3v/ 5v
黑 / 棕线 : GND
黄线 : 信号线

舵机工作原理

舵机的主要组成部分为伺服电机,所谓伺服就是服从信号的要求而动作。在信号来之前,转子停止不动;信号来到之后,转子立即运动。因此我们就可以给舵机输入不同的信号,来控制其旋转到不同的角度。
舵机接收的是PWM信号,当信号进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。简单来说就是给舵机一个特定的PWM信号,舵机就可以旋转到指定的位置。

舵机上有三根线,分别是GND、VCC和SIG,也就是地线、电源线和信号线,其中的PWM波就是从信号线输入给舵机的。
一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms~2.5ms之间时舵机就可以对应旋转到不同的角度。

t = 0.5ms——————-舵机会转到 0 °t = 1.0ms——————-舵机会转到 45°t = 1.5ms——————-舵机会转到 90°t = 2.0ms——————-舵机会转到 135°t = 2.5ms——————-舵机会转到 180°

周期T

PWM周期为20ms = 0.02s = (7200*200)/72000000

PWM占空比

是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比.由于PWM周期为20ms,所以(以舵机会转动 45°为例),占空比就应该为1ms/20ms = 5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200 * 5% = 10

单位: % (0%~100%)

TIM3 PWM输出 驱动SG90电机 配置过程:

1. 使能GPIO时钟,TIM定时器时钟,部分重映射时钟

//1.使能GPIO时钟、定时器时钟、复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

2. 重映射定时器

//2.重映射定时器GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

3. 配置GPIO结构体

GPIO_InitTypeDef gpioInitStructure;//3.配置GPIOgpioInitStructure.GPIO_Mode  = GPIO_Mode_AF_PP; //复用推挽输出gpioInitStructure.GPIO_Pin   = GPIO_Pin_5; //引脚5gpioInitStructure.GPIO_Speed = GPIO_Speed_10MHz; //10HzGPIO_Init(GPIOB, &gpioInitStructure); //初始化

4. 配置通用定时器TIM结构体

TIM_TimeBaseInitTypeDef timInitStructure;//4.配置定时器timInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频timInitStructure.TIM_CounterMode   = TIM_CounterMode_Up; //向上计数模式timInitStructure.TIM_Period        = 200-1; //设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。timInitStructure.TIM_Prescaler     = 7200-1; //设置了用来作为 TIMx时钟频率除数的预分频值。TIM_TimeBaseInit(TIM3, &timInitStructure); //初始化

5. 配置PWM

//5.配置PWMtimOCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1; //边沿对齐模式timOCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能timOCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High; //设置为高电平有效		TIM_OC2Init(TIM3, &timOCInitStructure); //初始化TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //配置自动加载的预加载寄存器		TIM_Cmd(TIM3, ENABLE); //使能

stm32 超声波感应开盖垃圾桶

motor.c

#include "motor.h"#include "stm32f10x.h"void motor_Init(void){		GPIO_InitTypeDef gpioInitStructure;		TIM_TimeBaseInitTypeDef timInitStructure;		TIM_OCInitTypeDef timOCInitStructure;				//1.使能GPIO时钟、定时器时钟、复用时钟		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);				//2.重映射定时器		GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);		//3.配置GPIO		gpioInitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;		gpioInitStructure.GPIO_Pin   = GPIO_Pin_5;		gpioInitStructure.GPIO_Speed = GPIO_Speed_10MHz;				GPIO_Init(GPIOB, &gpioInitStructure);				//4.配置定时器		timInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		timInitStructure.TIM_CounterMode   = TIM_CounterMode_Up;		timInitStructure.TIM_Period        = 200-1;		timInitStructure.TIM_Prescaler     = 7200-1;				TIM_TimeBaseInit(TIM3, &timInitStructure);				//5.配置PWM		timOCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;		timOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;		timOCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;				TIM_OC2Init(TIM3, &timOCInitStructure);		TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);				TIM_Cmd(TIM3, ENABLE);		}

motor.h

#include "stm32f10x.h"void motor_Init(void);

HC_SR04.c

在STM32第9篇中可以找到 9. STM32——HC_SR04超声波测距

HC_SR04.h

在STM32分栏第9篇中可以找到 9. STM32——HC_SR04超声波测距

usart.c

在STM32分栏第6篇中可以找到 6. STM32——用串口发送数据点亮LED(串口的中断接收)

usart.h

在STM32分栏第6篇中可以找到 6. STM32——用串口发送数据点亮LED(串口的中断接收)

main.c

#include "stm32f10x.h"#include "main.h"#include "led.h"#include "shake.h"#include "relay.h"#include "exti.h"#include "usart.h"#include "tim.h"#include "motor.h"#include "SysTick.h"#include "HC_SR04.h"int main(){		float Length=0;//		int pwmval=155;			motor_Init();		HC_SR04Init();		usart_init();		//		printf("abc");				while(1)		{				Length=Get_Length();				printf("%.3f/r/n",Length);				delay_ms(100);								if(Length<5)				{						TIM_SetCompare2(TIM3, 15);						delay_ms(1000);										}				else if(Length>5)				{						TIM_SetCompare2(TIM3, 25);				}		}}

stm32 超声波感应开盖垃圾桶 效果展示

如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈
需要整个工程代码,欢迎大家打赏,评论区留上你的邮箱 or vx or qq。o( ̄︶ ̄)o

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

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

相关文章

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

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

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

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

    kelvinlee 评论0 收藏0
  • 基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立为自己所写)

    基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立为自己所写) 一.项目感触 完成这个项目自己一开始也是无法从本身上出发,看着这个最小系统板和这个电机驱动模块上面想着怎样实现让这两块板子实现四个电机上面转动呢,还要加入避障模块,自己一开始一头雾水,于是开始了漫长的借鉴之路,首先作为一个开发者,我觉得学习的地方首选是B站,所以我找了相关的做智能小车的视频 首先是B站智能小车教...

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

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

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

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

    taowen 评论0 收藏0

发表评论

0条评论

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