【STM32学习】PWM脉冲宽度调制学习笔记,(一)基本原理及配置

您所在的位置:网站首页 脉冲宽度调制电路工作原理 【STM32学习】PWM脉冲宽度调制学习笔记,(一)基本原理及配置

【STM32学习】PWM脉冲宽度调制学习笔记,(一)基本原理及配置

2024-06-29 07:55| 来源: 网络整理| 查看: 265

1、概述

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,PWM是一种用于控制电子设备的技术,通过调整信号的脉冲宽度和周期,可以模拟出不同的电压或功率级别。

在具有惯性的系统中,通过一系列的脉宽调制,可获得等效的所需的模拟参量。

PWM常见参数有频率(1/周期Ts),占空比(高电平占整个周期的比例:Ton/Ts),分辨率(占空比变化最小单位)。

如下图,输出一系列高低电平变化的信号,等效于输出一个虚线状态的模拟信号。

2、参数 2.1、周期

高低电平变化所需要的时间,单位:ms Ts=1/f T是周期,f是频率。

2.2、频率

1s内测周期次数等于频率。f = 1 / Ts。

在1秒钟内,信号从高电平到低电平再回到高电平的次数,单位Hz。 例如:如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期。

2.3占空比

占空比:在一个周期内,高电平的时间占整个周期时间的比例,单位是% (0%-100%)。

脉宽时间: 高电平时间。

占空比越大,等效的模拟电压就越趋近于高电平,占空比越小,等效的模拟电压就越趋近于低电平。假设高电平是5v,50%的占空比,那等效输出2.5v的电压;20%的占空比就等效于1v。

比方说周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms 总的占空比 8/(8+2)= 80%。这就是占空比为80%的脉冲信号。

2.4分辨率

占空比变化的最小单位,单位%。

如信号能以1%调节占空比,这的分辨率就是1%。

2.5参数计算

CK_PSC:是系统时钟经过预分频器后生成的频率,PSC表示几分频 ARR:表示自动重装值 CCR:表示捕获比较值,与ARR一起配置占空比。

2.6、PWM结构

上图为生成PWM的基本结构流程:

从系统时钟出来再经过预分频器,可生成一定频率的信号。经过计数器/自动重装器和捕获比较器,可生成固定占空比的信号,再从GPIO口输出,就是PWM信号了。

3、软件程序(PWM驱动LED呼吸灯) 3.1介绍

目标:单片机输出一个PWM信号,驱动LED呼吸亮灭。PWM占空比高,则LED更亮;PWM占空比低,则LED更暗;

如下图为实物连接图,在PA0引脚输出PWM信号。

3.2程序运行思路分析:

1)打开时钟(TIM和GPIO的时钟)

2)初始化GPIO(指定某个引脚输出PWM信号)

3)初始化定时器时基单元,(为了设置定时器参数,如频率,计数模式,ARR自动重装值,PSC预分频器等)

4)初始化定时器输出比较,(配置某个定时器的某个通道,模式,极性,使能,和CCR捕获比较寄存器)

5)开启定时器

6)函数调用

3.3程序

下图的程序为输出50%占空比PWM 信号。使用时,直接在主函数,调用PWM_Init ();

void PWM_Init (void) { RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;// TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInitStruct.TIM_Period = 100-1; //ARR TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1; //PSC TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 50; //CCR ,ARR,PSC,CCR,共同设置PWM的占空比 TIM_OC1Init(TIM2,&TIM_OCInitStructure); TIM_Cmd(TIM1,ENABLE); }

若要设置不断更改PWM占空比,则需要调用更改CCR的函数TIM_SetCompare1,

然后再在主函数中调用函数,写入自己想要的值,

如:在主函数中调用,功能为,更改CCR 的值从小变大,再从大变小,不断循环。

运行LED效果:变亮变暗不断循环,实现呼吸灯效果

void PWM_SetCompare(uint16_t Compare1) { TIM_SetCompare1(TIM2,Compare1); } //以上是调用的函数 //下面可以在主函数中调用,功能为,更改CCR 的值从小变大,再从大变小,不断循环 while(1) { for (i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3