STM32输出比较模式和PWM模式 比较

STM32 输出方波的方法有两种比较类似的,一个是PWM模式,一个是输出比较模式。下面来看看这两种模式的不同处在哪。

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

PWM模式:

输出比较模式

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

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

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

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

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

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

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

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

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

#include "pwm.h"

void TIM3_PWM_Init( u16 arr, u16 psc )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

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

    //设置TIM3 CH3 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOB, &GPIO_InitStructure );
    //初始化TIM3
    TIM_TimeBaseInitStructure.TIM_Period = arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );
    //初始化TIM3_CH3  PWM 模式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC3Init( TIM3, &TIM_OCInitStructure );
    //使能TIM3在CCR2上的预装载寄存器
    TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable );
    //使能TIM3
    TIM_Cmd( TIM3, ENABLE );
}

void TIM3_CMP_Init( u16 arr, u16 psc )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

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

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    //初始化TIM3
    TIM_TimeBaseInitStructure.TIM_Period = arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );

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

    //使能TIM3
    TIM_Cmd( TIM3, ENABLE );
}

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

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
// LED0  PA8  LED1 PD2
int main(void)
{
    u16 led_pwm_val=0;
	u8 dir=1;
    delay_init();       //延时函数初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    LED_Init();  
  
    LED0 = 1;
    LED1 = 1;
    delay_ms(500);
    LED0 = 0;
    LED1 = 0;
	//比较输出模式下:  ARR 决定输出频率  CCRx 决定每个通道的初始相位
	//PWM模式:		   ARR 决定输出频率  CCRx 决定输出 的高电平时长
    TIM3_PWM_Init(1000-1,72-1); 
	
	//比较翻转模式,一个周期只翻转一次,所以频率为 1/2 
	TIM3_CMP_Init(1000-1,71-1);	

	TIM_SetCompare3(TIM3,100);		//PWM 模式
	TIM_SetCompare4(TIM3,100);		//比较输出模式
    while(1)
    {
		delay_ms(200);
		LED0 = !LED0;			
    }
}

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

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

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

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

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

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

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

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

  • 90
    点赞
  • 323
    收藏
    觉得还不错? 一键收藏
  • 44
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值