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…

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&…

自研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;那就带者这…

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…

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;…

[nlp入门论文精读] | Transformer

写在前面 最近工作从CV转向了NLP&#xff0c;于是空余时间便跟着哔哩哔哩李沐老师的视频学习。其实研一NLP课程讲论文的时候&#xff0c;我们小组就选择了经典的Attention和Bert&#xff0c;但还有很多细节并不完全理解&#xff0c;实际使用时也很困惑。 因此这个系列就来记…

红队专题-开源漏扫-巡风xunfeng源码剖析与应用

开源漏扫-巡风xunfeng 介绍主体两部分:网络资产识别引擎,漏洞检测引擎。代码赏析插件编写JSON标示符Python脚本此外系统内嵌了辅助验证功能文件结构功能 模块添加IP三. 进行扫描在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/de587a6f6f694…

ai写作一键生成文章速度快

ai写作是一种基于人工智能技术的自动写作工具&#xff0c;它可以根据用户提供的主题或关键词&#xff0c;快速一键生成文章。与传统的手动写作相比&#xff0c;ai写作的速度更快&#xff0c;效率更高。下面小编就带大家一起来见识下ai写作一键生成文章的速度是如何之快&#xf…

【CSP试题回顾】202012-1-期末预测之安全指数

CSP-202012-1-期末预测之安全指数 解题代码 #include <iostream> #include <algorithm> using namespace std;int n, sum;int main() {cin >> n;for (int i 0; i < n; i){int w, s;cin >> w >> s;sum w * s;}sum max(sum, 0);cout <&…

Electron-builder打包安装包——编译篇

突然有一天想打包个桌面程序&#xff0c;没有打包过&#xff0c;经过九牛二虎之力终于打包出来&#xff0c;在此感谢那些热于分享的前辈&#xff01; 本篇只讲打包运行和出现的问题 一、准备工作&#xff1a;提前下载相关资源包&#xff0c;否则在国内环境下可能因为网络问题…

ECharts 简要介绍及简单实例代码

ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求。 ECharts 提供了丰富的图表类型和交互能力&#xff0c;使用户能够通过简单的配置生成各种各样的图表&#xff0c;包括但不限于折线图、柱状图、散点图、饼图、雷达图、…

Lwip之TCP服务端示例记录(1对多)

前言 实现多个客户端同时连接初步代码结构已经实现完成(通过轮训的方式) // // Created by shchl on 2024/3/8. // #if 1#include <string.h> #include "lwip/api.h" #include "FreeRTOS.h" #include "task.h" #include "usart.h&…