【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

相关文章

【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

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

如何将一个文件里不包含某个字符的行输出到另一个文件?

第一种: grep -v 'string' filename > newfilenamegrep -v 'string' filename >> newfilename 第二种: sed -n '/string/!'p filename > newfilenamesed -n '/string/!'p filename >> newfilename

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的