导读:开启新的专栏啦~希望大家可以多多支持呀!!!《蓝桥杯嵌入式》专栏文章是博主在自学stm32期间所做的学习笔记,同时为了备战蓝桥杯比赛,博主在学习期间所用的开发板为蓝桥杯嵌入式专用开发板。菜鸟思维,写的可能会有一点繁琐,但是我觉得学习是要一步一步来的,也希望自己可以把每一点都弄懂。希望可以对初学者有些帮助,如有错误,欢迎评论区留言指正哦~
明确几个点:
- 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
}
二、代码说明
1、PWM模式下4个通道产生的PWM波的频率只能是一致的。
2、关于arr = 1000000 / freq;//计算频率对应的周期值(计数值)
这行代码的说明:定时器的设置是72分频,定时器输入频率为72MHZ,那么对应的机器周期就是72/72MHZ,计一个数的时间为一个机器周期,计数频率是freq,那么计数周期就是1/freq,计数周期内的计数个数就等于:计数周期/机器周期,也就是1000000/freq。
3、注意端口模式为复用推挽输出,PA0和PA1是具有复用功能的GPIO口,所以要设置为复用推挽输出。
4、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为无效状态(inative)
低极性:低电平0为有效状态(active),高电平1为无效状态(inactive)
希望大家可以多多点赞收藏,也不要忘记点一个大大的关注哦~感谢大家!!
祝您2021大吉大利,升职加薪~~