你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32输出比较模式和PWM模式 比较

[复制链接]
STMCU小助手 发布时间:2022-3-22 13:00
STM32 输出方波的方法有两种比较类似的,一个是PWM模式,一个是输出比较模式。下面来看看这两种模式的不同处在哪。

先看看官方对两种模式的介绍

PWM模式:

V30DM{2]NF%PD5A}0HKMHXG.png

输出比较模式

B3{YZ$B0B2ZPL%9YHG`9I(F.png
7K%P0Z9X9IA`)Q%7~~DOLMX.png

通过两种模式的介绍,好像不能直观的看出来具体差别在哪,再看看两种模式设置时寄存器里面的介绍。

YA3$G]KQJA~[LV]XQSS$RRC.png

通过CCMR寄存器中的OCM位可以看出来这两种模式的一点区别。

输出比较模式下: CCR = CNT 时,翻转输出电平。

PWM模式下:   CNT < CCR时输出一种电平,CNT > CCR时输出相反的电平。

通过图片来直观的看看这两种模式的区别。

NNAP8IQTH))Y2[NVH7_9QF0.png

PWM模式下: ARR 决定输出频率 ,CCR决定输出占空比。

9R@UP408E2U4A%Y]$PVP`2G.png

输出比较模式下:  ARR 决定输出频率  CCRx 决定每个通道的初始相位。

两种模式下最主要的差别就是CCR值代表的含义不一样。PWM模式下CCR可以控制占空比。输出比较模式下CCR可以控制初始相位。

下面通过一个程序来对比一下这两种模式

  1. #include "pwm.h"

  2. void TIM3_PWM_Init( u16 arr, u16 psc )
  3. {
  4.     GPIO_InitTypeDef GPIO_InitStructure;
  5.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  6.     TIM_OCInitTypeDef TIM_OCInitStructure;

  7.     RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );                                                        //使能定时器3时钟
  8.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIO和AFIO复用功能模块时钟

  9.     //设置TIM3 CH3
  10.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  11.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.     GPIO_Init( GPIOB, &GPIO_InitStructure );
  14.     //初始化TIM3
  15.     TIM_TimeBaseInitStructure.TIM_Period = arr;
  16.     TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
  17.     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  18.     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  19.     TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );
  20.     //初始化TIM3_CH3  PWM 模式
  21.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  22.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  23.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  24.     TIM_OC3Init( TIM3, &TIM_OCInitStructure );
  25.     //使能TIM3在CCR2上的预装载寄存器
  26.     TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable );
  27.     //使能TIM3
  28.     TIM_Cmd( TIM3, ENABLE );
  29. }

  30. void TIM3_CMP_Init( u16 arr, u16 psc )
  31. {
  32.     GPIO_InitTypeDef GPIO_InitStructure;
  33.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  34.     TIM_OCInitTypeDef TIM_OCInitStructure;

  35.     RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );        //使能定时器3时钟  
  36.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE );        //使能GPIOC时钟

  37.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  38.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  39.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  40.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  41.     //初始化TIM3
  42.     TIM_TimeBaseInitStructure.TIM_Period = arr;
  43.     TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
  44.     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  45.     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  46.     TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );

  47.     //初始化TIM3_CH4 比较 模式  输出比较翻转触发模式(当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平)   
  48.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  49.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  50.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  51.                
  52.     TIM_OC4Init( TIM3, &TIM_OCInitStructure );
  53.     TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Enable );

  54.     //使能TIM3
  55.     TIM_Cmd( TIM3, ENABLE );
  56. }
复制代码

将定时器3通道3设置为PWM输出模式,定时器3通道4设置为输出比较模式。

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "pwm.h"
  6. // LED0  PA8  LED1 PD2
  7. int main(void)
  8. {
  9.     u16 led_pwm_val=0;
  10.         u8 dir=1;
  11.     delay_init();       //延时函数初始化
  12.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  13.     LED_Init();  

  14.     LED0 = 1;
  15.     LED1 = 1;
  16.     delay_ms(500);
  17.     LED0 = 0;
  18.     LED1 = 0;
  19.         //比较输出模式下:  ARR 决定输出频率  CCRx 决定每个通道的初始相位
  20.         //PWM模式:                   ARR 决定输出频率  CCRx 决定输出 的高电平时长
  21.     TIM3_PWM_Init(1000-1,72-1);
  22.         
  23.         //比较翻转模式,一个周期只翻转一次,所以频率为 1/2
  24.         TIM3_CMP_Init(1000-1,71-1);        

  25.         TIM_SetCompare3(TIM3,100);                //PWM 模式
  26.         TIM_SetCompare4(TIM3,100);                //比较输出模式
  27.     while(1)
  28.     {
  29.                 delay_ms(200);
  30.                 LED0 = !LED0;                        
  31.     }
  32. }
复制代码

主函数中分别初始化两种模式,然后设置CCR值为相同值,看看输出波形的区别。

M$SP[M_Q0JPJ(UCQ_1@@CCI.png

蓝色波形为 PWM模式输出的波形,粉色为输出比较模式输出的波形。可以看到同样的设置参数,PWM输出方波频率为1KHz,输出比较输出的方波为500Hz,说明输出比较模式的频率为PWM模式频率的1/2。

%GSC{SKEV66`XQECSRD7TMN.png

PWM输出波形的高电平为100us,周期为1000us,占空比为10%,和主函数中设置的一样。

输出比较模式输出的波形起始相位滞后于PWM波形100us,滞后相位差为PWM波形的10%,滞后相位差为本身输出波形的20%。

输出比较模式的占空比为50%,是固定的不能修改占空比。

通过上面实验可以看到,这两种模式的主要差别是。

PWM模式: ARR设置频率,CCR设置占空比,频率和占空比可以任意设置,起始相位不能设置。

输出比较模式:ARR设置频率,CCR设置相位,频率和起始相位可以任意设置,占空比不能设置。输出频率为理论计算值一半。



收藏 评论0 发布时间:2022-3-22 13:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版