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口为PA0
	GPIO_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;//PA0
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出速度为50mhz
	GPIO_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=50hz
  while(1)
	{
		delay_ms(1000);//延迟1s
		TIM_SetCompare1(TIM2,5);//占空比为5/200,舵机角度为0°
		delay_ms(1000);//延时1s
		TIM_SetCompare1(TIM2,15);//占空比为15/200,舵机角度为90°
		delay_ms(1000);//延时1s
		TIM_SetCompare1(TIM2,25);//占空比为25/200,舵机角度为180°
		
	}
 }

5.问题总结

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

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

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

实验效果

stm32输出PWM驱动舵机

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Leetcode每日一刷】数组|双指针篇:977. 有序数组的平方、76. 最小覆盖子串(附滑动窗口法详解)

力扣每日刷题 一、977. 有序数组的平方1.1题目1.2、解题思路1.3、代码实现——C 二、76. 最小覆盖子串2.1&#xff1a;题目2.2、解题思路2.3&#xff1a;代码实现——c2.4&#xff1a;易错点 一、977. 有序数组的平方 1.1题目 [题目链接]( 1.2、解题思路 题型&#xff1a;双…

数据中台驱动:高效交付之道

如何保证数据中台高效交付&#xff1f; 在数据行业中&#xff0c;项目交付难题尤为突出&#xff0c;尤其在数据中台领域。数据中台项目交付面临诸多挑战&#xff0c;若不妥善解决&#xff0c;将会降低服务质量&#xff0c;影响企业数字化建设的顺利开展&#xff0c;甚至影响项目…

21 卷积层里的多输入多输出通道【李沐动手学深度学习v2课程笔记】

目录 1. 多输入输出通道&相应代码实现 1.1 多输入 1.2 多输出 1.3 1x1 卷积层 1.4 小结 1. 多输入输出通道&相应代码实现 1.1 多输入 为了加深理解&#xff0c;我们实现一下多输入通道互相关运算。 简而言之&#xff0c;我们所做的就是对每个通道执行互相关操作&a…

电磁兼容(EMC):一文读懂压敏电阻选型

目录 1 MOV 外观结构 2 MOV 常见品牌 3 MOV命名规则 4 MOV 工作原理 5 MOV基本特点 6 MOV典型应用 7 MOV电气参数说明 8 MOV 选型注意事项 8.1 压敏电压V1mA 8.2 峰值脉冲电流 IP&#xff0c;钳位电压VC 8.3 漏电流IR 8.4 结电容 9 有绝缘耐压测试要求时选型 10 …

预处理详解

目录 一&#xff1a;预定义符号 二&#xff1a;#define定义常量 三&#xff1a;#define定义宏 四&#xff1a;带有副作用的宏定义 五&#xff1a;宏的替换规则 六&#xff1a;宏函数的对比 七&#xff1a;# 和 ## 7.1 #运算 7.2 ##预算符 八&#xff1a;命名约定 九&…

mac电脑版MATLAB R2023b for Mac中文激活版

MATLAB R2023b for Mac&#xff1a;科学计算的终极工具 软件下载&#xff1a;MATLAB R2023b for Mac中文激活版下载 &#x1f52c; 探索科学&#xff0c;无限可能 MATLAB R2023b for Mac&#xff0c;助您深入挖掘科学计算的奥秘。从数据分析、算法设计到可视化展示&#xff0c;…

物联网导论

物联网起源 物联网&#xff1a;是一个基于互联网、传统电信网等信息承载体&#xff0c;让所有能够被独立寻址的普通物理对象实现互联互通的网络。它具有普通对象设备化、自治终端互联化和普适服务智能化三个重要特征。 按照规定的协议&#xff0c;将具有感知、通信、计算等功…

T2 小美的平衡矩阵(25分) - 美团编程题 题解

考试平台&#xff1a; 牛客网 题目类型&#xff1a; 30道单选题&#xff08;60分&#xff09; 2 道编程题 &#xff08;15分 25分&#xff09; 考试时间&#xff1a; 2024-03-09 &#xff08;两小时&#xff09; 题目描述 小美拿到了一个n*n的矩阵&#xff0c;其中每个元素是…

简单BFF架构设计

又到周五了有了一个小时的闲暇时间简单写点东西&#xff0c;介绍一个简单的BFF的架构。BFF:Backends For Frontends,其实现在是个比较常见的前端架构设计的方案&#xff0c;其最大的优势便在于前端可以高度自由的在Node层做一些server端才可以做的东西&#xff0c;比如SSR、登录…

【JavaEE进阶】Spring中事务的实现

文章目录 &#x1f343;前言&#x1f334;事务简介&#x1f6a9; 什么是事务?&#x1f6a9;为什么需要事务?&#x1f6a9;事务的操作 &#x1f340;Spring 中事务的实现&#x1f6a9;Spring 编程式事务&#x1f6a9;Spring声明式事务Transactional&#x1f6a9;Transactional…

Using WebView from more than one process

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、问题过程源码追踪…

Pinctrl子系统_04_Pinctrl子系统主要数据结构

引言 本节说明Pinctrl子系统中主要的数据结构&#xff0c;对这些数据结构有所了解&#xff0c;也就是对Pinctrl子系统有所了解了。 前面说过&#xff0c;要使用Pinctrl子系统&#xff0c;就需要去配置设备树。 以内核面向对象的思想&#xff0c;设备树可以分为两部分&#x…

ssrf漏洞

SSRF漏洞概述和演示 SSRF&#xff08;Server-Side Request Forgery&#xff0c;服务器端请求伪造&#xff09;是一种常见的Web应用程序安全漏洞。它允许攻击者诱使服务器端应用程序发起任意HTTP(S)请求到内部系统或者网络&#xff0c;而这些请求通常是正常情况下服务器自身为了…

MYSQL | 数据库到底是怎么来的?

“以史为鉴&#xff0c;可以让我们更深刻地理解现在&#xff0c;预见未来。” 要想知道一件东西是怎么发生的, 我们不妨把时间拨回关系型数据库被提出前后来探索。在信息技术飞速发展的今天&#xff0c;回望数据库管理系统的演进之路&#xff0c;我们可以深刻理解到技术进步如…

产品推荐 - 基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板

综合图像处理硬件平台包括图像信号处理板2块&#xff0c;视频处理板1块&#xff0c;主控板1块&#xff0c;电源板1块&#xff0c;VPX背板1块。 一、板卡概述 图像信号处理板包括2片TI 多核DSP处理器-TMS320C6678&#xff0c;1片Xilinx FPGA XC7K420T-1FFG1156&#xff0c;1片…

20240309-1-校招前端面试常见问题-前端框架及常用工具

校招前端面试常见问题【5】——前端框架及常用工具 React Q&#xff1a;请简述一下虚拟 DOM 的概念&#xff1f; 基于 React 进行开发时所有的 DOM 构造都是通过虚拟 DOM 进行&#xff0c;每当数据变化时&#xff0c;React 都会重新构建整个 DOM 树&#xff0c;然后 React 将…

selenium之PO设计模式

初识PO模式 PO&#xff08;PageObject&#xff09;是一种设计模式。简单来说就是把一些繁琐的定位方法、元素操作方式等封装到类中&#xff0c;通过类与类之间的调用完成特定操作。 PO被认为是自动化测试项目开发实践的最佳设计模式之一。 在学习PO模式前&#xff0c;可以先…

力扣日记3.8-【回溯算法篇】37. 解数独

力扣日记&#xff1a;【回溯算法篇】37. 解数独 日期&#xff1a;2023.3.8 参考&#xff1a;代码随想录、力扣 37. 解数独 题目描述 难度&#xff1a;困难 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只…

存货计价方式 比较-移动平均和批次计价

SAP常用的存货计价方式有 标准价格移动平均价格批次计价 标准价格常用于制造企业&#xff0c;今天的方案比较主要集中在销售型企业常用的移动平均价和批次计价 批次计价&#xff1a; 移动平均&#xff1a; 两种计价方式的Pros&Cons 比较 批次计价 移动平均优点 1…

基于单片机的水平角度仪系统设计

目 录 摘 要 I Abstract II 引 言 1 1控制系统设计 3 1.1系统方案设计 3 1.2系统工作原理 4 2硬件设计 6 2.1单片机 6 2.1.1单片机最小系统 6 2.1.2 STC89C52单片机的性能 7 2.2角度采集电路 8 2.2.1 ADXL345传感器的工作原理 9 2.2.2 ADXL345传感器倾角测量的原理 9 2.2.3 AD…