分享

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

 笔录收藏 2020-07-06

1、PWM是什么?

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

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

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


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

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

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

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

 

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

当CNT<CCRx时,引脚输出0,当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的原理图:

  1. //①根据原理图找到4个引脚:
  2.        PF9可以使用TIM14_CH1,表示可以使用定时器14的通道1产生PWM输出。
  3. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; // 定义的TIM属性结构体变量
  4.       GPIO_InitTypeDef GPIO_InitStruct; // 定义GPIO类型变量
  5.        TIM_OCInitTypeDef TIM_OCInitStruct; // 定义复用功能的变量
  6.        ②// 1.初始化时钟:TIM14 和 PF9
  7.        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
  8.        /* TIM3 clock enable */
  9.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
  10.        // 2.配GPIO引脚为复用功能
  11.        /* GPIOC Configuration: TIM14 CH1 (PF9) */
  12.        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; // 选择引脚为PF9
  13.        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 设置为复用功能
  14.        GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed; // 设置输出速度为100MHz
  15.        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 设置为推挽输出
  16.        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 设置为上拉输出
  17.        GPIO_Init(GPIOC, &GPIO_InitStruct);  // 安装参数
  18.        // 3.将TIM和引脚的复用功能连接:TIM14和PF9连接起来
  19.        GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);
  20.        // 4.配置TIM定时器的参数
  21.        TIM_TimeBaseInitStruct.TIM_Period = 100-1; // 设置重装载值 ARR(控制频率)
  22.        TIM_TimeBaseInitStruct.TIM_Prescaler = 8400-1; // 设置预分频系数:周期(次) 100Hz == 100us
  23.        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 设置再分频值:TIM_CKD_DIV1就是不分频
  24.        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 设置计数模式
  25.        TIM_TimeBaseInit(TIM14, &TIM_TimeBaseInitStruct);
  26.        // 5.配置复用功能:PWM
  27.        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // 配置为PWM模式1
  28.        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; // 开启输出使能
  29.        //TIM_OCInitStruct.TIM_Pulse = CCR1_Val; // 初始化配置比较值寄存器
  30.        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 配置为高电平有效
  31.        // 6.TIM14通道1初始化
  32.        TIM_OC1Init(TIM14, &TIM_OCInitStruct); // TIM14通道1初始化
  33.        // 7.设置自动重载比较值CCR1初值,不断产生PWM脉冲
  34.        TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
  35.        // 8.设置自动重装载值(ARR),不断产生PWM脉冲
  36.        TIM_ARRPreloadConfig(TIM14, ENABLE);
  37.        /* 9.使能定时器14 */
  38.        TIM_Cmd(TIM14, ENABLE);
  39.        // 10.使能TIM1PWM输出(高级定时器)
  40.        //TIM_CtrlPWMOutputs(TIM1, ENABLE)

设置比较值函数

void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Comparex);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多