明确几个点:
- STM32的四个通用定时器:TIM2、TIM3、TIM4、TIM5。
- 定时器输出PWM波的几种方式:PWM输出模式、输出比较模式。
- 每个通用定时器有4路捕获/比较通道,可产生四路PWM波。
- 利用TIM2的通道1和通道2产生PWM波的代码(PWM模式产生PWM波):
void PWM2_Init(u8 duty1, u8 duty2)//利用TIM2的通道1(左电机)和通道2(右电机)产生PWM波
{
u32 arr;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
arr = 1000000 / freq;//计算频率对应的周期值(计数值)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用强推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;//72分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseStructure.TIM_Period = arr - 1;//周期值,自动重装载计数值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//不分频
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//TIM2定时器
//对通道1和通道2配置为PWM输出模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//输出模式配置为PWM2模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//低极性
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能输出状态
TIM_OCInitStructure.TIM_Pulse = (arr-1) * duty1 / 100;//占空比
TIM_OC1Init(TIM2, &TIM_OCInitStructure);//TIM2_CH1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//输出模式配置为PWM2模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//低极性
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能输出状态
TIM_OCInitStructure.TIM_Pulse = (arr-1) * duty2 / 100;//占空比
TIM_OC2Init(TIM2, &TIM_OCInitStructure);//TIM2_CH2
TIM_Cmd(TIM2, ENABLE);//使能TIM2
}
- 代码说明
- PWM模式下4个通道产生的PWM波的频率只能是一致的。
- 关于
arr = 1000000 / freq;//计算频率对应的周期值(计数值)
这行代码的说明:定时器的设置是72分频,定时器输入频率为72MHZ,那么对应的机器周期就是72/72MHZ,计一个数的时间为一个机器周期,计数频率是freq,那么计数周期就是1/freq,计数周期内的计数个数就等于:计数周期/机器周期,也就是1000000/freq。 - 注意端口模式为复用推挽输出,PA0和PA1是具有复用功能的GPIO口,所以要设置为复用推挽输出。
- PWM输出模式配置中,输出模式配置与极性配置:常用搭配TIM_OCMode_PWM1和TIM_OCPolarity_High、TIM_OCMode_PWM2和TIM_OCPolarity_Low,如此搭配,输出的是正逻辑(比如设占空比为60%,则高电平持续时间占60%)下面是图示(图上的占空比就是高电平占的时间)。
正逻辑:TIM_OCMode_PWM1和 TIM_OCPolarity_High、TIM_OCMode_PWM2和TIM_OCPolarity_Low
负逻辑:TIM_OCMode_PWM1和 TIM_OCPolarity_Low、TIM_OCMode_PWM2和TIM_OCPolarity_High
输出模式:
PWM1:CNT<CRRx为有效电平,CNT>CRRx为无效电平。
PWM2:CNT>CRRx为有效电平,CNT<CRRx为无效电平。
极性:
高极性:高电平1为有效状态(active),低电平0为无效状态(inactive)
低极性:低电平0为有效状态(active),高电平1为无效状态(inactive)