当前位置:首页 > 单片机 > 单片机
[导读]通用定时器可以输出四路互不影响的pwm信号,高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。所以stm32一共可以生成4*5+7*2=30路pwm信号。但功能上有区别:通用定时器的pwm信号比较简单,就是普通的

通用定时器可以输出四路互不影响的pwm信号,高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。所以stm32一共可以生成4*5+7*2=30路pwm信号。但功能上有区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率;高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,所以高级定时器的pwm通常用来控制电机的。

那么TIMx_ARR寄存器的值是怎样来确定pwm的频率的呢?

TIM_Period(即是TIMx_ARR寄存器的值) 的大小实际上表示的是需要经过TIM_Period 次计数后才会发生一次更新或中断。接下来需要设置时钟预分频数TIM_Prescaler,这里有一个公式,举例来说明:例如时钟频率=72MHZ/(时钟预分频+1)。(假设72MHZ为系统运行的频率,这里的时钟频率即是产生这个pwm的时钟的频率)说明当前设置的这个TIM_Prescaler,直接决定定时器的时钟频率。通俗点说,就是一秒钟能计数多少次。比如算出来的时钟频率是2000,也就是一秒钟会计数2000 次,而此时如果TIM_Period 设置为4000,即4000 次计数后就会中断一次。由于时钟频率是一秒钟计数2000 次,因此只要2 秒钟,就会中断一次。(一般采用向上计数模式)

STMx中PWM1和PWM2模式是时钟输出PWM波形控制的一个必选参数,使用库函数原型如下:

void TIMx_OC2Init(TIM2_OCMode_TypeDef TIM2_OCMode,

TIM2_OutputState_TypeDef TIM2_OutputState,

uint16_t TIM2_Pulse,

TIM2_OCPolarity_TypeDef TIM2_OCPolarity)

函数中的第一个参数TIM2_OCMode_TypeDef就是指定当前的 PWM波形模式是PWM1或PWM2,关于这两者的区别通俗点讲就是:

PWM1中空控制的是高电平的占空比,外接LED的时候灯光是随着TIMx_SetComparex()函数中占空比的

增大由最亮逐渐变最暗,当达到100%的占空比的时候最暗。

PWM2中空控制的是低电平的占空比,外接LED的时候灯光是随着TIMx_SetComparex()函数中占空比的

增大由最暗逐渐变最亮,当达到100%的占空比的时候最亮。


程序清单:(通过四路PWM加深对TIMx_OCMode、TIM_OCPolarity)的理解:

#include"pwm.h"


void TIM2_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}


void TIM2_Mode_Config(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_TimeBaseStructure.TIM_Period = 500-1;

TIM_TimeBaseStructure.TIM_Prescaler = 720-1;

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_Pulse = 200;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OC1Init(TIM2, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

TIM_OCInitStructure.TIM_Pulse = 200;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OC2Init(TIM2, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_Pulse = 200;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OC3Init(TIM2, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_Pulse = 400;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OC4Init(TIM2, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);


}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭