【STM32学习】PWM脉冲宽度调制学习笔记,(一)基本原理及配置 |
您所在的位置:网站首页 › 脉冲宽度调制电路工作原理 › 【STM32学习】PWM脉冲宽度调制学习笔记,(一)基本原理及配置 |
1、概述
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,PWM是一种用于控制电子设备的技术,通过调整信号的脉冲宽度和周期,可以模拟出不同的电压或功率级别。 在具有惯性的系统中,通过一系列的脉宽调制,可获得等效的所需的模拟参量。 PWM常见参数有频率(1/周期Ts),占空比(高电平占整个周期的比例:Ton/Ts),分辨率(占空比变化最小单位)。 如下图,输出一系列高低电平变化的信号,等效于输出一个虚线状态的模拟信号。 高低电平变化所需要的时间,单位: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信号。 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 |