9、STM32的PWM的原理与使用(内附代码)

发布者:ziyunting最新更新时间:2022-04-21 来源: eefocus关键字:STM32  PWM 手机看文章 扫描二维码
随时随地手机看文章

1、PWM是什么?


是脉冲宽度调制,简称脉宽调制。利用微处理器数字输出对模拟电路进行控制的一种有效的技术,就是对脉冲宽度的控制。


这里说的脉冲,就是我们产生的方波。方波就是N个这样的周期连续的产生。

一个周期内高电平持续的时间就是脉冲宽度(脉宽),而PWM(脉冲宽度调制)就是控制一个周期内的高电平的持续时间。


2、简单的PWM的原理示意图

CNT:是当前值寄存器,计数寄存器。


ARR:是自动重载寄存器(初始化设定)。


CCRx:比较值寄存器(TIM_SetCompare1()设定修改占空比)。


假定定时器工作在向上计数PWM模式下:


当CNT=CCRx时,引脚输出1。


当CNT的值小于CCRx的时候,IO输出低电平(0),


当CNT值大于或等于CCRx的时候,IO输出高电平(1),


当CNT的值达到ARR的时候,就会重新归零,然后重新向上计数,依次循环。


改变CCRx的值就可以改变PWM的输出的占空比。改变ARR的值,就可以改变PWM的输出的频率,这就是PWM的输出原理。


3、寄存器工作流程:

PWM 模式


脉冲宽度调制模式可以生成一个信号,该信号频率由 TIMx_ARR 寄存器值决定,其占空比由 TIMx_CCRx 寄存器值决定。


通过向 TIMx_CCMRx 寄存器中的 OCxM 位写入 110(PWM 模式 1)或 111(PWM 模式 2) ,可以独立选择各通道 (每个 OCx 输出对应一个 PWM)的 PWM 模式。必须通过将TIMx_CCMRx 寄存器中的 OCxPE 位置 1 使能相应预装载寄存器,最后通过将 TIMx_CR1寄存器中的 ARPE 位置 1 使能自动重载预装载寄存器(在递增计数或中心对齐模式下)。


由于只有在发生更新事件时预装载寄存器才会传送到影子寄存器,因此启动计数器之前,必须通过将 TIMx_EGR 寄存器中的 UG 位置 1 来初始化所有寄存器。OCx 极性可使用 TIMx_CCER 寄存器的 CCxP 位来编程。既可以设为高电平有效,也可以设为低电平有效。 OCx 输出通过将 TIMx_CCER 寄存器中的 CCxE 位置 1 来使能。有关详细信息,请参见 TIMx_CCERx 寄存器说明在 PWM 模式(1 或 2)下, TIMx_CNT 总是与 TIMx_CCRx 进行比较,以确定是TIMx_CNT =< TIMx_CCRx。


因为计数器采用递增方式计数,所以定时器能够在边沿对齐模式下生成 PWM。


4、PWM 边沿对齐模式


以下以 PWM 模式 1 为例。只要 TIMx_CNT < TIMx_CCRx, PWM 参考信号 OCxREF 便为高电平,否则为低电平。如果 TIMx_CCRx 中的比较值大于自动重载值(TIMx_ARR 中),则 OCxREF 保持为“1”。如果比较值为 0, 则 OCxRef 保持为“0”。 图 183 举例介绍边沿对齐模式的一些 PWM 波形 (TIMx_ARR=8)。

5、PWM步骤-灯光亮度控制:


查看LED的原理图:

        //①根据原理图找到4个引脚:

       PF9可以使用TIM14_CH1,表示可以使用定时器14的通道1产生PWM输出。

        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; // 定义的TIM属性结构体变量

      GPIO_InitTypeDef GPIO_InitStruct; // 定义GPIO类型变量

       TIM_OCInitTypeDef TIM_OCInitStruct; // 定义复用功能的变量

     

       ②// 1.初始化时钟:TIM14 和 PF9

       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

 

       /* TIM3 clock enable */

     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);

    

       // 2.配GPIO引脚为复用功能

       /* GPIOC Configuration: TIM14 CH1 (PF9) */

       GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; // 选择引脚为PF9

       GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 设置为复用功能

       GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed; // 设置输出速度为100MHz

       GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 设置为推挽输出

       GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 设置为上拉输出

       GPIO_Init(GPIOC, &GPIO_InitStruct);  // 安装参数

 

       // 3.将TIM和引脚的复用功能连接:TIM14和PF9连接起来

       GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);

 

       // 4.配置TIM定时器的参数

       TIM_TimeBaseInitStruct.TIM_Period = 100-1; // 设置重装载值 ARR(控制频率)

       TIM_TimeBaseInitStruct.TIM_Prescaler = 8400-1; // 设置预分频系数:周期(次) 100Hz == 100us

       TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 设置再分频值:TIM_CKD_DIV1就是不分频

       TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 设置计数模式

       TIM_TimeBaseInit(TIM14, &TIM_TimeBaseInitStruct);

      

       // 5.配置复用功能:PWM

       TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // 配置为PWM模式1

       TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; // 开启输出使能

       //TIM_OCInitStruct.TIM_Pulse = CCR1_Val; // 初始化配置比较值寄存器

       TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 配置为高电平有效

 

       // 6.TIM14通道1初始化

       TIM_OC1Init(TIM14, &TIM_OCInitStruct); // TIM14通道1初始化

 

       // 7.设置自动重载比较值CCR1初值,不断产生PWM脉冲

       TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);

 

 

       // 8.设置自动重装载值(ARR),不断产生PWM脉冲

       TIM_ARRPreloadConfig(TIM14, ENABLE);

 

       /* 9.使能定时器14 */

       TIM_Cmd(TIM14, ENABLE);

 

       // 10.使能TIM1PWM输出(高级定时器)

       //TIM_CtrlPWMOutputs(TIM1, ENABLE)

 

设置比较值函数


void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Comparex);

关键字:STM32  PWM 引用地址:9、STM32的PWM的原理与使用(内附代码)

上一篇:8、STM32定时器原理与使用(内附代码)
下一篇:2.1、STM32怎么创建工程:如何创建第一个工程模板(基于固件库)

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved