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

2023-11-08 06:36

本文主要是介绍【STM32 PWM输出+串口调整PWM周期和占空比】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

文章目录

  • 前言
  • 一、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;          //TXGPIO_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时钟   72MHz2.配置定时器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;          //TXGPIO_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时钟   72MHz2.配置定时器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++);

总结

这篇关于【STM32 PWM输出+串口调整PWM周期和占空比】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Python批量调整Word文档中的字体、段落间距及格式

《Python批量调整Word文档中的字体、段落间距及格式》这篇文章主要为大家详细介绍了如何使用Python的docx库来批量处理Word文档,包括设置首行缩进、字体、字号、行间距、段落对齐方式等,需... 目录关键代码一级标题设置  正文设置完整代码运行结果最近关于批处理格式的问题我查了很多资料,但是都没

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,