前言:
目前你们对“pwm的主要技术指标”大约比较关怀,同学们都想要学习一些“pwm的主要技术指标”的相关知识。那么小编在网络上收集了一些关于“pwm的主要技术指标””的相关文章,希望我们能喜欢,看官们一起来学习一下吧!## 导论
在上一章我们介绍了定时器的定时模式,实现了定时器的基本用法,在本章将介绍定时器作为PWM输出的方法
## 什么是PWM
PWM的全称为:Pulse Width Modulation,简称脉宽调制
百度来的:脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
而简单的来说就是,我们可以使用处理器输出自己想要的占空比的矩形波,去达到控制模拟电路等目的
## 资源介绍
在STM32F407的芯片手册中有描述:12个16位的定时器,2个32位的定时器,每个定时器可以由4个通道去产生PWM
## 简单原理介绍
在上一章中我们说到定时器的计数模式有多种,而常用的时向上计数,当达到计数值时产生中断来处理相应的事件
而PWM的输出就是在此基础上添加了一个比较值当计数值大于比较值,或者小于比较值时将输出低电平(或者高电平,这是根据我们配置的PWM 输出有关)
## 通用定时器框图
我上面说的“比较值”就是TIM框图中比较部分的“Capture/Comparex register”比较寄存器,这个值就会决定输出引脚的电平。
从框图上可以看到,STM32通用定时器,用不同颜色的笔给划分了区域,分成了4个部分
时钟源
基本定时器
输入捕获
输出比较
分成了以上这四个部分:
1.时钟源
计数器时钟可由下列时钟源提供:
● 内部时钟 (CK_INT)
● 外部时钟模式 1:外部输入引脚 (TIx)
● 外部时钟模式 2:外部触发输入 (ETR),仅适用于 TIM2、TIM3 和 TIM4。
● 内部触发输入 (ITRx):使用一个定时器作为另一个定时器的预分频器,例如可以将定时器配置为定时器 2 的预分频器。(定时器的级联)
时钟源框图:
内部时钟框图(CK_INT)
如何选择内部时钟作为时钟源?
将TIMx_SMCR 寄存器中 SMS=000,ECE=0,当对 CEN 位写入 1 时,预分频器的时钟就由内部时钟 CK_INT 提供。内部时钟的频率为该定时器所在时钟线频率x2。
**一般常用内部时钟作为时钟源
外部时钟源模式1框图
如何选择外部时钟模式1作为时钟源?
当 TIMx_SMCR 寄存器中的 SMS=111 ,ECE=0时,可选择此模式。
选择作为时钟源后,可以通过配置SMCR的TS位来进一步选择时钟来源。
内部触发(其他定时器与之级联,这种级联方式的组合是ST规定的)
外部时钟源模式2框图
如何选择外部时钟模式2作为时钟源?
TIMx_SMCR 寄存器中的ECE位写入 1 可选择此模式。
选择之后,可以使用外部输入的脉冲信号作为定时器的时钟源,通过操作TIMx->SMCR的ETP、ETPS、ETF功能位,可以选择输入信号的极性、分频系数、滤波系数。
** 通用定时器的输出比较(PWM的输出)**
每个通用定时器至少有1个通道,每个通道对应一个IO引脚(若需要使用定时器的输入/输出功能,需要将该引脚复用成定时器通道)。每个通道可以用于输入 或 输出功能。
输出比较:根据计数器和比较寄存器值的大小关系,决定在对应的通道(引脚)上输出特定的电平。
输出比较的框图
对于输出比较的配置从这张框图上就能看出,首先
把通道配置成输出通道。 TIMx->CCMR1 中的 CC1S[0:1] 填00在这里插入图片描述
关闭CCR1的缓冲功能 ,也就是关闭影子功能。OCIE 清零在这里插入图片描述
设置输出比较模式为PWM1还是PWM2,TIMx->CCRM1的OC1M[0:2]位在这里插入图片描述
设置有效电平 是高电平有效还是低电平有效,手册上说的有点绕,这里我的理解,PWM1,有效电平为高电平。PWM2,有效电平为低电平。TIMx->CCER的CC1P位。 在这里插入图片描述
别忘了使能通道和给设置比较值。在这里插入图片描述在这里插入图片描述
PWM关键参数
先说PWM的关键指标:周期,以及占空比
1.PWM周期:就是通过配置定时器的溢出时间(即图中ARR的值),当计数器(CNT寄存器)计数的值与ARR的值相等时,计数归零,重新计数
2.PWM占空比:设置CRRx的值,作为比较值,CNT计数值与CRR做对比,因此衍生出PWM的模式,
如:在PWM模式1,当计数器CNT<CRR,输出通道设置的输出电平为有效电平,否则为无效电平
PWM 配置流程
四.PWM的配置流程如下
1.使能GPIO时钟,配置一个GPIO结构体变量(该GPIO上可以复用为定时器的输出),并进行初始化
2.将GPIO的引脚复用为TIM的输出
3.使能定时器时钟,配置一个TIM结构体变量,主要关注设置Arr的值,并进行初始化
4.配置TIM_OCInitTypeDef结构体,用于输出比较的结构体,
代码配置
此代码更具调节PWM的占空比来控制输出高电平的时间来达到呼吸灯的效果
#include"stm32f4xx.h"#include"sys.h"static GPIO_InitTypeDef GPIO_InitStructure;static TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;static TIM_OCInitTypeDef TIM_OCInitStructure;void delay_ms(uint32_t n){ while(n--) { SysTick->CTRL=0; SysTick->LOAD=(168000)-1; SysTick->VAL=0; SysTick->CTRL=5; while((SysTick->CTRL&0x10000)==0); } SysTick->CTRL=0;}void Time14_Init(void){ //是能硬件时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);//配置定时器数值,,分屏,,计数值//频率为100HZ TIM_TimeBaseStructure.TIM_Period = (10000/200)-1;// 计数值0~9999 计数10000次为一秒 决定定时时间 PLL_M==8才行 TIM_TimeBaseStructure.TIM_Prescaler =8400-1;//预分频值 自加1 84MHZ频率 进行8400预分频 分频后为10000HZ //TIM_TimeBaseStructure.TIM_ClockDivision = 0;//f407不支持 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式///向上技术 TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //配置定时器终端触法方式 //时间更新 // TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置PWM通道 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStructure. TIM_Pulse=100;//比较直 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low ;//电频有效方式 //计数值小于比较值输出有效电频 模式1 //计数值小于比较值输出无效电频 模式二 TIM_OC1Init(TIM14,&TIM_OCInitStructure); //使能定时器工作 TIM_Cmd(TIM14, ENABLE);}int main(void){ uint32_t TIM_Pwm; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF ; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOF,&GPIO_InitStructure); //PF9应交连接到定时器14 GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//将PF9连接到TIM4的PWM输出端 Time14_Init(); while(1){ for(TIM_Pwm=0;TIM_Pwm<=100;TIM_Pwm++) { TIM_SetCompare1(TIM14,TIM_Pwm); delay_ms(10); } for(TIM_Pwm=100;(int)TIM_Pwm>=0;TIM_Pwm--) { TIM_SetCompare1(TIM14,TIM_Pwm); delay_ms(10); } }}
标签: #pwm的主要技术指标 #pwm程序框图