【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调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用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,

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2