stm32学习记录-5.2PWM输出控制sg90舵机角度

源码连接:https://gitee.com/HL12334/stm32-learning-code

前提知识:

1.定时器中断

1.关键概念

1.1pwm输出

1.常用术语

  • OC(output compare)输出比较
  • CNT(counter),定时器中用于计数的寄存器:当前定时器计数值
  • CCR(Capture/Compare),捕获比较寄存器:与CNT寄存器的值进行比较,用于确定PWM占空比
  • PSC(Prescaler),预分频器:降低定时器输入频率,可以进行更长时间的定时
  • ARR(Auto-Reload Register),自动重装寄存器: 用于确定PWM周期, 当CNT==ARR时,计数器重新开始计数

2.每个高级定时器和通用定时器都拥有4个输出比较通道。

3.高级定时器的前三个通道额外拥有死区生成和互补输出的功能,用于驱动三相无刷电机。

4.有效电平: 自行设置有效电平为高电平还是低电平,反正则为无效电平

5.输出比较模式,常用模式

  1.  PWM模式1
    向上计数时(一般使用向上计数):CNT<CCR时输出有效电平,CNT>=CCR时输出无效电平
    向下计数时:CNT>CCR时输出无效电平,CNT<=CCR时输出无效电平
  2.  PWM模式2
     与PWM模式1相反

6.参数计算(有效电平为高电平,向上计数模式,计数模式为PWM模式1,其他一样的道理)

  • PWM频率:Freq=CK_PSC/(PSC+1)/(ARR+1)
  • PWM占空比Duty=CCR/(ARR+1)

示例:ARR=99,CCR=30,使用向上计数,有效电平设置为高电平,使用PWM模式1。输出占空比为30%的PWM波。

向上计数在小于30时(CNT<CCR),由于计数模式是PWM模式1,所以输出有效电平(高电平),大于等于30时(CNT>=CCR)输出无效电平(低电平),当计数为99(CNT==ARR)时,计数器又重新开始计数(开始下一个脉冲)

1.2sg90舵机

驱动是直流电机,内部通过电位器确定当前角度,再通过内部电板控制使其运动到pwm波计算所得位置。

输入PWM要求,周期为20ms,高电平宽度为0.5ms~2.5ms。中间其他角度自行按比例计算。控制的是绝对角度。

接线,一般橙色是PWM控制线,黑色是地线,红色为vcc。

2.配置流程

1.GPIO配置:PWM输出引脚配置,根据所选定时器硬件确定的引脚,查询《STM32中文参考手册_V10》8.3.7章节

2.定时器配置:设置pwm周期
3.输出比较配置:

  1. 创建输出比较配置结构体TIM_OCInitTypeDef
  2. 给结构体赋初始值(增加代码通用性,高级定时器参数很多,未初始化的值使用时可能会导致其他问题)-TIM_OCStructInit
  3. 配置关键参数:输出比较模式(一般选择为PWM模式1)、有效电平、输出使能、CCR值
  4. 初始化结构体:TIM_OCYInit(TIMX, &TIM_OCInitStructure),配置定时器X的第Y个通道输出PWM

3.使用流程

1.初始化

2.修改占空比(修改CCR值):TIM_SetCompareX(TIMY),修改定时器Y的第X通道的CCR值。

4.代码

使用通用定时器2的通道1(PA0)驱动舵机转动,

pwm.c

#include "pwm.h"//通过通用定时器2通道1输出PWM控制舵机
void PWMInit(int psc,int arr){//1.GPIO初始化配置,定时器2通道1对应IO口为PA0GPIO_InitTypeDef GPIO_InitStructure;//创建gpio初始化结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA端口对应时钟GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//配置为复用推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//PA0GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出速度为50mhzGPIO_Init(GPIOA,&GPIO_InitStructure);//初始化端口PA0//2.定时器配置TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//创建定时器配置结构体RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能通用定时器2时钟TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);//初始化结构体参数,提高代码通用性TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Prescaler=psc-1;//设置预分频值TIM_TimeBaseInitStructure.TIM_Period=arr-1;//设置自动重装值TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化定时器//3.输出比较配置TIM_OCInitTypeDef TIM_OCInitStructure;//创建输出比较配置结构体TIM_OCStructInit(&TIM_OCInitStructure);//初始化比较配置结构体,方便配置其他定时器TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置输出比较模式为PWM1模式TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//有效电平为高电平TIM_OCInitStructure.TIM_Pulse=0;//设置比较寄存器值为0,后续在程序中动态修改TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//启用比较输出通道TIM_OC1Init(TIM2,&TIM_OCInitStructure);//初始化比较输出配置TIM_Cmd(TIM2, ENABLE);  //使能TIM2
}

pwm.h

#ifndef __PWM_H
#define __PWM_H
#include "sys.h"void PWMInit(int psc,int arr);//初始化函数#endif

main.c

#include "stm32f10x.h"
#include "pwm.h"
#include "delay.h"int main(void){	delay_init();//延时函数初始化PWMInit(7200,200);//初始化定时器,频率为72mhz/7200/200=50hzwhile(1){delay_ms(1000);//延迟1sTIM_SetCompare1(TIM2,5);//占空比为5/200,舵机角度为0°delay_ms(1000);//延时1sTIM_SetCompare1(TIM2,15);//占空比为15/200,舵机角度为90°delay_ms(1000);//延时1sTIM_SetCompare1(TIM2,25);//占空比为25/200,舵机角度为180°}}

5.问题总结

1.同一定时器输出多路PWM波形都是一样的吗
  同一个定时器所以频率、相位一样,占空比由各自输出比较配置确定

2.输出PWM错误
1.端口输出模式要配置为复用推挽输出。 2.检查定时器是否选择错误,通道端口号是否正确

3.使用定时器高级定时器无法输出PWM
高级定时器还要进行主输出使能, TIM_CtrlPWMOutputs

实验效果

stm32输出PWM驱动舵机

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/731799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时序报告Report_timing_summary之一步精通配置选项使用

目录 一、前言 二、配置选项概览图 三、配置选项 3.1 Options 3.1.1 report 3.1.2 path limits 3.1.3 path display 3.2 Advanced 3.2.1 report 3.2.3 miscellaneous 3.3 Timer Settings 3.4 共有部分 四、工程示例 4.1 工程设计代码 4.2 约束文件 4.3 Option…

Nginx常用命令总结及常见问题排查

连续更新挑战第4天… 目录 常用启停命令Nginx 常见问题Nginx 如何忽略非标准http头检测?Nginx websocket代理Nginx 临时缓存不够导致下载文件失败Nginx 没有临时缓存目录权限导致下载文件失败Nginx非root用户启动无法使用80端口或者报无权限异常路由重写怎么配置?nginx 根据…

Linux系统架构----nginx的访问控制

nginx的访问控制 一、nginx基于授权的访问控制概述 Nginx与Apache一样&#xff0c;可以实现基于用户权限的访问控制&#xff0c;当客户端想要访问相应的网站或者目录时&#xff0c;要求用户输入用户名和密码&#xff0c;才能正常访问配置步骤生成用户密码认证文件 &#xff1…

qt带后缀单位的QLineEdit

QLineEditUnit.h #pragma once #include <QLineEdit> #include <QPushButton>class QLineEditUnit : public QLineEdit {Q_OBJECT public:QLineEditUnit(QWidget* parent Q_NULLPTR);~QLineEditUnit();//获取编辑框单位QString UnitText()const;//设置编辑框单位…

STM32的启动流程分析 和 一些底层控制的原理

阅读引言&#xff1a; 阅读本文之后&#xff0c; 你将对单片机&#xff0c; 甚至是嵌入式系统&#xff0c; 或者是传统的PC机系统的启动流程有一个大致的了解&#xff0c; 本文更加偏向于单片机的启动流程分析。 目录 一、基础知识 1.STM32系列的微控制器&#xff08;mcu&…

Flink入门之DataStream实现word count

以下是一个从无界数据源读取数据计算word count的示例 pom配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

自研cloud框架专题–web模块(三)

项目特点一:框架集成 1.引入核心依赖2.配置相关功能 二:功能介绍 1.swagger支持并提供swagger快速配置2.knife增强swagger支持3.全局请求参数校验(Validation)支持4.字段脱敏支持5.默认jackson序列化6.xss,cors支持7.访问日志支持8.全局异常处理,统一返回结果9.系统关键及常用信…

数据结构之deque双端队列

一、概念&#xff1a; 众所周知&#xff0c;数据结构是用来存储数据&#xff0c;deque也不例外&#xff0c;他是集结了队列和栈的性质而成的结构&#xff0c;他几乎拥有所有数据结构能有的操作&#xff0c;看似已经大杀四方&#xff0c;可实际情况如何呢&#xff0c;那就带者这…

判断矩阵是否是魔方矩阵

给定程序中&#xff0c;函数fun的功能是&#xff1a;判定形参a所指的NxN&#xff08;规定N为奇数&#xff09;的矩阵是否是"魔方"&#xff0c;若是&#xff0c;函数返回值为1&#xff1b;不是&#xff0c;函数返回值为0。“幻方"的判定条件是&#xff1a;矩阵每…

解决npm install 时出现的.git can‘t be found (see https://git.io/Jc3F9)问题

解决npm install 时出现的.git can‘t be found (see https://git.io/Jc3F9)问题 问题: 今天使用webstream npm instatll之后报错 .git can‘t be found (see https://git.io/Jc3F9) 原因 一般来说就是你使用ws打开的文件夹位置中不是.git文件夹的所在的文件夹相同的位置 举个…

Day 8.TCP包头和HTTP

TCP包头 1.序号&#xff1a;发送端发送数据包的编号 2.确认号&#xff1a;已经确认接收到的数据的编号&#xff08;只有当ACK为1时、确认号才有用&#xff09;&#xff1b; TCP为什么安全可靠 1.在通信前建立三次握手 SYP SYPACK ACK 2.在通信过程中通过序列号和确认号和…

前端javascript的DOM对象操作技巧,全场景解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端泛海 景天的主页&#xff1a;景天科技苑 文章目录 1.js的DOM介绍2.节点元素层级关系3.通过js修改&#xff0c;清空节点…

【棘手问题】Spring JPA一级缓存导致获取不到数据库表中的最新数据,对象地址不发生改变

【棘手问题】Spring JPA一级缓存导致获取不到数据库表中的最新数据&#xff0c;对象地址不发生改变 一、问题背景二、解决步骤2.1 debug2.2 原因分析2.2.1 数据步骤2.2.2 大模型解释2.2.3 解释举例2.2.4 关键函数 2.3 解决方案 三、Spring JPA一级缓存 一、问题背景 项目的数据…

STM32 通过Modbus协议更改内部Flash(模仿EEPROM)的运行参数

main.c测试 uint8_t uart1RxBuf[64]{0};uint8_t Adc1ConvEnd0; uint8_t Adc2ConvEnd0;int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initial…

编程笔记 html5cssjs 001 第一个网页

编程笔记 html5&css&js 001 第一个网页 一、代码二、解释 这是第一个网页&#xff0c;也是一个模板。 一、代码 <!-- 声明文档类型 --> <!DOCTYPE html> <html lang "zh-cn" ><!-- 页面头部开始 --><head ><!-- 设置页面…

C++ 智能指针深度剖析

文章目录 1. 前言2. 为什么需要智能指针&#xff1f;3. 内存泄漏3.1 内存泄漏的概念及危害3.2 内存泄漏的分类3.3 如何检测内存泄漏3.4 如何避免内存泄漏 4. 智能指针的使用及原理4.1 RAII思想4.2 智能指针的原理4.3 C智能指针发展历史4.4 std::auto_ptr4.5 std::unique_ptr4.6…

掌握MySQL,看完这篇文章就够了!

1. MySQL MySQL是一种广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;目前属于甲骨文公司&#xff08;Oracle Corporation&#xff09;。 MySQL使用结构化查询语言&#xff08;SQL&#xff09;进行数据库管理…

C++的面向诗篇:类的叙事与对象的旋律

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、面向对象的定义 学习C语言时&#xff0c;我们就经常听说C语言是面向过程的&#xff0c;…

Linux安装Whisper-Jax

博客 如需私有化部署欢迎咨询&#xff0c;包含whisper,whisper jax,faster whisper。 一、前提条件 ubuntu 20.04 python 3.9 cuda 11.8 nvidia-cublas-cu11 11.11.3.6 nvidia-cuda-cupti-cu11 11.8.87 nvidia-cuda-nvcc-cu11 11.8.89 nvidia-cuda-nvrtc-cu11 1…

掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)

目录 一、C#的基础知识1. 数据类型与变量2. 条件与循环3. 函数与模块 二、C#的实用技能1. 面向对象编程&#xff08;OOP&#xff09;2. 异常处理3. LINQ查询 三、C#的重要性与应用场景结语 欢迎阅读本篇博客&#xff0c;我们将深入探讨C#语言的基础知识与实用技能&#xff0c;旨…