如何把定时器设置成PWM模式,从而产生相应频率,相应占空比的PWM波
蓝桥杯主要考的定时器也就三个TIM1,TIM2,TIM3
TIM3如何配置PWM波
PA6对应通道一,PA7对应通道2
//pwm.h
#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h"
void TIM3_PWM_Init(u16 pwm_fre,u8 ch1_duty,u8 ch2_duty);
#endif
#include "pwm.h"
void TIM3_PWM_Init(u16 pwm_fre,u8 ch1_duty,u8 ch2_duty)
{
u16 arr;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
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);
arr=1000000/pwm_fre;
TIM_TimeBaseStructure.TIM_Period = arr-1; //计数值
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; //分频系数 72分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //向上计数
TIM_TimeBaseStructure.TIM_CounterMode = 0x0; //不分频
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (arr-1)*ch1_duty/100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (arr-1)*ch2_duty/100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM3,ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
stm32f1的主频是72MHZ,那么在我们不分频的情况下,TIM3的主频也是72M,那么72M的计数速度我们觉得太快了,同时也不方面我们进行计算,所以让TIM3的时钟进行72分频,那么分频系数就是72 - 1。分频后我们的定时器将以1M的速度进行计数,那么这个计数值是非常方面计算的。能换算一下,1MHZ的计数频率,我们换算成周期那么就是1us,也就是说我们的计数值是每过1us加一。我们在初始化函数里传入一个入口参数代表我们设定的频率值(单位是HZ),我们把频率值换算成计数值,也就是1000000/pwm_fre
TIM_Pulse则代表的是你的电平翻转值
我们画一个简图,假设我们的计数值为2000,pulse为1000
当我们的计数值到2000后就会清零不断的进行向上计数,假如当前计数值小于pulse,那么输出的为高电平,假如当前技术值大于pulse,那么输出就为低电平,这样的能够实现50%占空比的PWM波了。
就简单的来说,pulse就是用来设置你的占空比的,我们只需要把pulse设置成 计数值x 占空比就可以了
我们先把频率设置成1000HZ,PA6产生40%占空比的方波,PA7产生80%占空比的方波
那么再来设置成5000HZ,PA6产生10%占空比的方波,PA7产生30%占空比的方波
//main.c
#include "stm32f10x.h"
#include "lcd.h"
#include "pwm.h"
u32 TimingDelay = 0;
void Delay_Ms(u32 nTime);
//Main Body
int main(void)
{
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SysTick_Config(SystemCoreClock/1000);
TIM3_PWM_Init(5000,10,30);
while(1)
{
}
}
//
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
使用PWM模式有一个缺点:同一定时器中,不同的通道下,输出的频率固定,占空比可变。也就是说,假如我们通道1输出1KHZ方波,那么通道同样也是1KHZ 方波。
这种PWM模式在对于我们日常的控制使用上是没有问题的,但是你看蓝桥杯历年赛题的时候,会看到许多题目要你使用一个定时器,不同通道上让你产生不同频率,不同占空比的方波,甚至还有题目让你产生相位不同的方波,那么在这种情况下显然PWM模式时达不到这种效果的,我们就要换一种方式
STM32固件库v3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\PWM_Output