蓝桥杯嵌入式开发经验分享(9.PWM模式配置)

作者:马一飞                                                         QQ:791729359       

 

 

        让stm32产生PWM波实际上有很多种方法,这个文档主要是讲解,如何把定时器设置成PWM模式,从而产生相应频率,相应占空比的PWM波。那么我们配置PWM之前,肯定还是先要了解stm32的定时器。

        根据历届赛题的分析,蓝桥杯主要考的定时器也就三个TIM1,TIM2,TIM3。TIM1为高级定时器,这个比较少考,历届这么多年也只考过一次TIM1,也是用来产生互补PWM波的,因为只有高级定时器才能产生互补PWM波。 所以蓝桥杯大部分都会考TIM2,TIM3。出到的频率很高,几乎每年都会有PWM波的产生或PWM波的捕获这类的题型,其实TIM2,TIM3是一样的,都是通用定时器,我们掌握其中一个,那么另外一个也是相同的配置,只不过是对应的复用引脚不同。

        那么我们这份文档主要就来讲解TIM3如何配置PWM波。首先我们能看到CT117E开发板按键旁有一串引出来的IO口,分别是PA1~PA7,那么我们在数据手册里找找这些引脚有哪些可以复用为TIM3的。

蓝桥杯嵌入式开发经验分享(9.PWM模式配置)_第1张图片

我们可以把PA6,PA7,复用为TIM3,同时PA6对应通道一,PA7对应通道2

接下来就可以开始编写代码,看看如何利用TIM3产生PWM。

 

1. 首先还是得先使能PA时钟和TIM3时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    TIM3是属于APB1总线上的资源。

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); 

2. 我们要用PA6,PA7引脚产生PWM波,因此我们要配置为复用推挽输出模式。

arr = 1000000 / pwm_fre;  
TIM_TimeBaseInitStructure.TIM_Period = arr - 1; //计数值
TIM_TimeBaseInitStructure.TIM_Prescaler = 71; //分频系数 72分频
TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0; //向上计数
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0; //不分频
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);

3. 接下来我们配置定时器。我们为什么要让计数值arr = 1000000 / pwm_fre;  

        首先我们要先要知道,stm32f1的主频是72MHZ,那么在我们不分频的情况下,TIM3的主频也是72M,那么72M的计数速度我们觉得太快了,同时也不方面我们进行计算,所以让TIM3的时钟进行72分频,那么分频系数就是72 - 1。分频后我们的定时器将以1M的速度进行计数,那么这个计数值是非常方面计算的。能换算一下,1MHZ的计数频率,我们换算成周期那么就是1us,也就是说我们的计数值是每过1us加一。我们在初始化函数里传入一个入口参数代表我们设定的频率值(单位是HZ),我们把频率值换算成计数值,也就是1000000/pwm_fre 。(具体的换算方法大家可以斟酌一下或者私聊)

然后计数方式TIM_CounterMode当然是要向上计数了

蓝桥杯嵌入式开发经验分享(9.PWM模式配置)_第2张图片

0x0代表的就是向上计数方式

同时下面的分频系数我们也不需要再分频了。

4.对通道1和通道2配置为PWM输出模式。

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (arr - 1) * ch1_duty / 100;
TIM_OC1Init( TIM3, &TIM_OCInitStructure);
		
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (arr - 1) * ch2_duty / 100;
TIM_OC2Init( TIM3, &TIM_OCInitStructure);

        输出模式配置为PWM2模式,极性为低极性,同时使能输出状态,TIM_Pulse则代表的是你的电平翻转值。

我们画一个简图,假设我们的计数值为2000,pulse为1000。

 

蓝桥杯嵌入式开发经验分享(9.PWM模式配置)_第3张图片

当我们的计数值到2000后就会清零不断的进行向上计数,假如当前计数值小于pulse,那么输出的为高电平,假如当前技术值大于pulse,那么输出就为低电平,这样的能够实现50%占空比的PWM波了。 就简单的来说,pulse就是用来设置你的占空比的,我们只需要把pulse设置成 计数值x 占空比就可以了。

5. 使能PWM输出,使能TIM3

TIM_CtrlPWMOutputs(TIM3, ENABLE);
TIM_Cmd( TIM3,ENABLE);

那么我们的PWM模式就配置成功了,我们来烧录看看是不是达到我们想要的效果。

我们先把频率设置成1000HZ,PA6产生40%占空比的方波,PA7产生80%占空比的方波

TIM3_PWM_Init(1000,40,80);

用逻辑分析仪测量一下PA6引脚的波形。

蓝桥杯嵌入式开发经验分享(9.PWM模式配置)_第4张图片

和PA7引脚的波形。

蓝桥杯嵌入式开发经验分享(9.PWM模式配置)_第5张图片

我们能够看到基本上能达到我们所设定的要求,但是占空比有微小的偏差,这个不影响我们使用。

那么再来设置成5000HZ,PA6产生10%占空比的方波,PA7产生30%占空比的方波

TIM3_PWM_Init(5000,10,30);

用逻辑分析仪测量一下PA6引脚的波形。

蓝桥杯嵌入式开发经验分享(9.PWM模式配置)_第6张图片

和PA7引脚的波形。

蓝桥杯嵌入式开发经验分享(9.PWM模式配置)_第7张图片

我们能够观察到,依然符合我们设定的要求。

不过占空比仍然有一点偏差,我们可以在pulse的设定再改进一下,那么这个任务就交给你们了。

使用PWM模式有一个缺点同一定时器中,不同的通道下,输出的频率固定,占空比可变。也就是说,假如我们通道1输出1KHZ方波,那么通道同样也是1KHZ 方波。

这种PWM模式在对于我们日常的控制使用上是没有问题的,但是你看蓝桥杯历年赛题的时候,会看到许多题目要你使用一个定时器,不同通道上让你产生不同频率,不同占空比的方波,甚至还有题目让你产生相位不同的方波,那么在这种情况下显然PWM模式时达不到这种效果的,我们就要换一种方式,这个就是下一部分的内容了。

                                                                                                                                       (以上仅属于个人观点) 

 

你可能感兴趣的:(蓝桥杯)