【STM32 PWM输出+串口调整PWM周期和占空比】

news2024/11/23 16:45:49

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、PWM是什么?
  • 1. PWM 图解
  • 二、认识STM32的PWM功能
    • 1.哪些定时器有PWM输出功能
      • 1.1 高级定时器,7路PWM输出,3组是互补输出,CH1与CH1N输出的波形相反,2*3=6;CH4是独立的1 6+1=7
      • 1.2通用定时器,4路独立输出
    • 2.STM32 PWM框图
      • 2.1高级定时器简介
      • 2.2高级定时器框图
      • 2.3高级定时器rcc时钟
      • 2.4 高级定时器时基
      • 2.5 PWM输出框图
  • 三、.配置PWM输出的步骤
    • 3.1 配置引脚
    • 3.2 配置PWM比较输出
    • 3.3 可以配置比较中断
      • 3.4高级定时器还有一个主使能输出
  • 四、参考程序
  • 五、实验测试
  • 六、串口控制PWM的周期和占空比
    • 6.1 思考如何改变周期和占空比
    • 6.2占空比的思考
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

上次学习了STM32的基本定时器功能,它只是最基本的功能,STM32的功能非常强大,定时器还有输出功能,即PWM。


提示:以下是本篇文章正文内容,下面案例可供参考

一、PWM是什么?

PWM是脉冲宽度调制,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

1. PWM 图解

在这里插入图片描述
T1:为高电平时间
T2:为低电平时间
T1+T2-=T
占空比为 = T/T *100%

二、认识STM32的PWM功能

1.哪些定时器有PWM输出功能

1.1 高级定时器,7路PWM输出,3组是互补输出,CH1与CH1N输出的波形相反,2*3=6;CH4是独立的1 6+1=7

在这里插入图片描述

1.2通用定时器,4路独立输出

在这里插入图片描述

2.STM32 PWM框图

2.1高级定时器简介

在这里插入图片描述

在这里插入图片描述

2.2高级定时器框图

在这里插入图片描述
1、2讲过了,重点在3

2.3高级定时器rcc时钟

1.RCC
在这里插入图片描述

2.4 高级定时器时基

在这里插入图片描述

在这里插入图片描述

2.5 PWM输出框图

在这里插入图片描述
PWM输出与 周期和比较值的关系
在这里插入图片描述
输出过程
在这里插入图片描述

三、.配置PWM输出的步骤

    1. 配置引脚
    1. 配置时钟
    1. 配置时基(PWM的周期)
    1. 配置比较值,配置输出极性,使能输出

3.1 配置引脚

在这里插入图片描述
在这里插入图片描述

void timer1_gpio_init()
{

    GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin=  GPIO_Pin_8;          //TX
	GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);   //&x
}

3.2 配置PWM比较输出

配置输出
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

void timer1(u16 period,u16 prescaler)
{
      /*
	
	1.开启APB1时钟   72MHz
	2.配置定时器6    TimeInit()  72预分配,0-65535     1000000us/50000us =CNT=20         定时时间/中断溢出时间=计数值
	3.中断配置       分组,优先级 。开启中断源
	4.中断服务函数   计数值, 1us  ,计数20次后让一个LED取反
	*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef  TIM_OCInitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	
	//TIM_TimeBaseInitStruct.TIM_ClockDivision=
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=period-1;//50000-1;
	TIM_TimeBaseInitStruct.TIM_Prescaler=prescaler-1;// 72-1;
	//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=
	
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
	
	 //TIM_OCInitStruct.TIM_OCIdleState=	 
	// TIM_OCInitStruct.TIM_OCNIdleState=
	  TIM_OCInitStruct.TIM_OCMode= TIM_OCMode_PWM1;
	  TIM_OCInitStruct.TIM_OCPolarity= TIM_OCPolarity_High;
	//  TIM_OCInitStruct.TIM_OCNPolarity=
	//  TIM_OCInitStruct.TIM_OutputNState=
	  TIM_OCInitStruct.TIM_OutputState= TIM_OutputState_Enable;
	  TIM_OCInitStruct.TIM_Pulse= period/2; //百分之50占空比
		 	
	TIM_OC1Init(TIM1, &TIM_OCInitStruct);
	
	TIM_CtrlPWMOutputs(TIM1, ENABLE);
	
	
	//开启中断:
	TIM_ITConfig( TIM1, TIM_IT_CC1, ENABLE);
	
	TIM_Cmd( TIM1, ENABLE);      //使能
	
}

3.3 可以配置比较中断

在这里插入图片描述

TIM_ITConfig( TIM1, TIM_IT_CC1, ENABLE);

3.4高级定时器还有一个主使能输出

在这里插入图片描述
在这里插入图片描述

TIM_CtrlPWMOutputs(TIM1, ENABLE);

四、参考程序

void timer1_gpio_init()
{

    GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin=  GPIO_Pin_8;          //TX
	GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);   //&x
}


void timer1(u16 period,u16 prescaler)
{
      /*
	
	1.开启APB1时钟   72MHz
	2.配置定时器6    TimeInit()  72预分配,0-65535     1000000us/50000us =CNT=20         定时时间/中断溢出时间=计数值
	3.中断配置       分组,优先级 。开启中断源
	4.中断服务函数   计数值, 1us  ,计数20次后让一个LED取反
	*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef  TIM_OCInitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	
	//TIM_TimeBaseInitStruct.TIM_ClockDivision=
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=period-1;//50000-1;
	TIM_TimeBaseInitStruct.TIM_Prescaler=prescaler-1;// 72-1;
	//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=
	
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
	
	 //TIM_OCInitStruct.TIM_OCIdleState=	 
	// TIM_OCInitStruct.TIM_OCNIdleState=
	  TIM_OCInitStruct.TIM_OCMode= TIM_OCMode_PWM1;
	  TIM_OCInitStruct.TIM_OCPolarity= TIM_OCPolarity_High;
	//  TIM_OCInitStruct.TIM_OCNPolarity=
	//  TIM_OCInitStruct.TIM_OutputNState=
	  TIM_OCInitStruct.TIM_OutputState= TIM_OutputState_Enable;
	  TIM_OCInitStruct.TIM_Pulse= period/2; //百分之50占空比
		 	
	TIM_OC1Init(TIM1, &TIM_OCInitStruct);
	
	TIM_CtrlPWMOutputs(TIM1, ENABLE);
	
	
	//开启中断:
	TIM_ITConfig( TIM1, TIM_IT_CC1, ENABLE);
	
	TIM_Cmd( TIM1, ENABLE);      //使能
	
}

五、实验测试

六、串口控制PWM的周期和占空比

6.1 思考如何改变周期和占空比


周期->是由时基来决定的。
时基->是由预分频和周期决定的
RCC时钟也是关键,最高设置为了72MHz

公式 1:72000000=分频系数*周期数

分频系数的范围是 0-65535
周期数的范围是:0-65535。
所以公式1 将得到很多种可能,这正是STM32预分频的神奇之处


之前定时1s实现,

72000000 =72*(5000020)
20是在定时器中断里面放变量自加的。现在配置PWM没有这个内容,根据大小值都不能超过65535的原则,将20分给预分频
timer1(50000,72
20);
方法1:写一个函数 关联公式1


6.2占空比的思考

通过看图,占空比就是改变比较值,所以改变比较值就可以了

在这里插入图片描述

TIM_SetCompare1(TIM1, i++);

总结

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

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

相关文章

Node.js如何处理多个请求?

前言 在计算机科学领域,关于并发和并行的概念经常被提及。然而,这两个术语常常被混为一谈,导致很多人对它们的理解存在着很多混淆。本文小编将通过对并发和并行的深入解析,帮助读者更好地理解它们之间的不同特点和应用场景。同时…

一种可以实现安全便捷文件摆渡的跨网文件安全交换软件

为了保护数据的安全性和完整性,很多企业都采用了内外网物理隔离的方式,防止核心数据泄露或被恶意篡改。然而,这也给企业内部或与外部合作伙伴之间的文件交换带来了很多不便和挑战。如何在保证数据安全的前提下,实现跨网文件的快速…

【验证码系列】利用深度学习构建字符型验证码自动识别模型与算法

文章目录 1. 写在前面2. CSCI级设计决策2.1. 字符型验证码识别智能体流程关联2.2. 字符型验证码识别行为设计 3. 字符型验证码识别智能体结构设计3.1. 智能体部件组成3.2. 智能体结构 4. 接口设计4.1. 字符型验证码识别智能体交互 5. 智能体算法设计细节5.1. 算法目标5.2. 字符…

判断两个对象是否不相等operator.ne()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断两个对象是否不相等 operator.ne() 选择题 下列代码执行输出的结果是? import operator print("【执行】operator.ne(8,8)") print(operator.ne(8,8)) print("【执行】…

SpringCloud——消息总线——Bus

1.什么是总线? 我们在微服务的项目中,通常会构建一个共同的消息主题,然后需要的服务可以连接上来,该主题中产生的消息会被监听和消费,这种我们称为消息总线。 SpringCloud Bus 配合SpringCloud Config使用可以实现配置…

社区分享|杭银消费金融基于MeterSphere开展接口自动化测试

杭银消费金融有限公司(以下简称“杭银消费金融”)成立于2015年12月,是经中国银保监会批准,由杭州银行作为主发起人,联合滴滴出行、中国银泰等企业组建的持牌消费金融机构,注册资本为25.61亿元。杭银消费金融…

Apifox日常使用(一键本地联调)

背景说明:现在的项目一般都是前后分离,线上出bug或者在进行联调时,有些时候后端需要重复模拟前端数据格式,在使用Apifox的情况下,如何快速造出后端需要的数据呢? 随便找一个网站,点开f12&#…

Cause: unable to find valid certification path to requested target

前话:最近,已经两个月没有怎么打开Android studio开发工具了,只因工作原因到后端帮忙干了两个月,期间由于c盘不堪重负,还经历了对系统盘进行迁移,后面打开之前的As项目,运行报错,报错…

CUDA学习笔记7——CUDA内存组织

CUDA内存组织 CUDA设备内存的分类与特征 内存类型物理位置访问权限可见范围生命周期1全局内存芯片外可读写所有线程和主机端由主机分配与释放2常量内存芯片外只读所有线程和主机端由主机分配与释放3纹理和表面内存芯片外一般只读所有线程和主机端由主机分配与释放4寄存器内存…

【C++数据结构】顶层父类的创建与类族结构的进化

文章目录 前言一、为什么需要创建顶层父类二、创建顶层父类Object的意义三、创建顶层父类Object3.1 顶层父类接口3.2 Object具体实现new和delete运算符重载的实现 和 ! 的运算符重载实现 3.3 纯虚析构函数实现 四、类族的结构进化4.1 怎样进化4.2 SmartPointer的进化4.3 Except…

什么是Target Plus EDI?

“Target Plus” 是美国知名零售商Target(塔吉特)推出的一个合作伙伴计划。这个计划允许第三方卖家在Target.com(塔吉特官方网站)上销售他们的商品。通过Target Plus,第三方卖家可以将他们的产品列在Target.com上&…

uni-app 、Spring Boot 、ant Design 打造的一款跨平台包含小说(仿真翻页、段落听书)、短视频、壁纸等功能含完备后台管理的移动应用

简介 咪哩快看,为用户提供优质阅读,短视频,共同记录美好生活的移动应用,并含有一套完备的后台管理体系,助力开发者快速数字化,开启你的财富之门! 官网: https://miliqkdoc.motopa.…

Antd Procomponent 之 proForm - 高级表单

本文作者系360奇舞团前端开发工程师 ProForm 在原来的 Form 基础上增加一些语法糖和更多的布局设置,帮助我们快速的开发一个表单。同时添加一些默认行为,让我们的表单默认好用。分步表单,Modal 表单,Drawer 表单,查询表…

DC电源模块的价格因素是什么?如何进行成本优化?

BOSHIDA DC电源模块的价格因素是什么?如何进行成本优化? DC电源模块是一种用于直流电路中的电源转换器,主要用于将输入电源的电压、电流和频率转换为适合设备的直流电源。随着电子设备的广泛应用,DC电源模块的需求也日益增加。而…

含泪整理的超全窗口函数:数据开发必备

最近在搞一些面试和课程答辩的时候,问什么是窗口函数,知道哪些窗口函数?最多的答案就是row_number、rank、dense_rank,在问一下还有其他的吗?这时同学就蒙了,还有其他的窗口函数?其实上面的回答也只是专用窗口函数&am…

多门店自助点餐+外卖二合一小程序源码系统 带完整搭建教程

随着餐饮业的快速发展和互联网技术的不断进步,越来越多的餐厅开始采用自助点餐和外卖服务。市场上许多的外卖小程序APP应运而生。下面罗峰来给大家介绍一款多门店自助点餐外卖二合一小程序源码系统。该系统结合了自助点餐和外卖服务的优势,为餐厅提供了一…

照明灯具哪个品牌好?照明灯具十大排行榜

现在儿童近视率越来越高了,用眼过度疲劳是导致近视的主要因素,学习环境的光线是否合适,都会直接影响用眼的疲劳程度。所以给孩子营造一个良好的学习环境非常重要!一款护眼台灯可以很好的预防近视,为大家推荐五款护眼台…

【今日文章】:如何用css 实现星空效果

【今日文章】:如何用css 实现星空效果 需求实现tips: 需求 用CSS 实现星空效果的需求: 屏幕上有“星星”,且向上移动。移动的时候,动画效果要连贯,不能出现闪一下的样子。 实现 这里我们需要知道,“星星”是…

复杂逻辑的开发利器—Mendix快速实现AQL质量抽检

Mendix低代码开发平台适用于复杂的业务逻辑场景,这句话大家早有耳闻,本期小编就为您打开智慧之光,仅从AQL小侧面,来管窥一二——Mendix如何形成第五代编程语言,来完成数据逻辑与建模、业务算法逻辑与建模的。&#xff…

Excel下拉填充时,如何使得数字不递增?

问题描述:Excel下拉填充时,如何使得数字不递增? 解决办法:先下拉填充数据之后,看到最后一个单元格的右下角有个填充设置的符号,右键选择复制单元格即可。其中这里的填充序列就是递增数字的操作。