PWM原理
TIMx_APR寄存器 确定频率
TIMx_CCRx寄存器 确定占空比的信号
TIMx_ARR寄存器是自动重载值
占空比中占时指高电平持续的时间A,空是指低电平持续的时间B,占空比=A / (A + B)
PWM程序-控制小灯渐亮渐灭渐亮
注:小灯->PB5 以TIM3为计时器
TIM3计时器有四个通道,
图片.png我们可以看到为了让小灯PB5端口输出PWM的电平,我们需要将TIM3的2通道部分重印象
1.将端口B使能为了小灯,将TIM3定时器使能,将时钟复用端口使能
SystemInit();//将系统时钟打开
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//将B端口的时钟打开,方便打开小灯
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//将TIM3的时钟打开
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//将功能复用时钟打开
2.配置B端口5管脚(小灯),使得其是复用推挽输出
//对小灯的B端口的5管脚进行使能
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//初始B端口的五号引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置时钟是50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//设置为复用推挽输出,以前LED小灯是推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure);
3.将定时器TIM3配置进行初始化
//设置定时器
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//百度说特殊场合有用,做一些延迟
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置向上计数模式
TIM_TimeBaseStructure.TIM_Period = 899;//设置多少次循环一次 默认加1
TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频,你这个数默认加1 ,现在是72MHZ,这个数会默认加1
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
4.进行部分重映射,将PWM的输出的端口映射到一个具体的端口
//端口映射
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
5.将TIM3的通道2来进行初始化,来达到输出PWM的目的
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择PWM的通道1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//当比较符合条件,就输出低电位
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//给输出使能
TIM_OC2Init(TIM3,&TIM_OCInitStructure);//TIM3的2通道初始化,上面已经进行了部分重映射,所以此时PWM输出的是PB5端口
6.开启TIM3的2通道的CCR寄存器预转载功能
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使得在更新TIM3,2通道的CCR寄存器后,可以在下一个更新事件之后生效
7.打开定时器TIM3
//打开定时器
TIM_Cmd(TIM3,ENABLE);
配置已经成功,PB5管脚已经可以输出PWM波形,但是如何在主程序中使用?
使用TIM_SetCompare2(TIM3,400);//设置比较信号
函数可以来设置比较信号,控制占空比。
//我的main函数,学习视频写的
u8 led_fx = 1;
u16 led_dt=0;
RCC_Configuration();
GPIO_Configuration();
//NVIC_Configuration();
TIM3_Configuration();
while(1)
{
Delay_ms(10);
if(led_fx == 1)
{
led_dt++;
}
else{
led_dt--;
}
if(led_dt > 800) led_fx = 0;
if(led_dt == 0) led_fx = 1;
TIM_SetCompare2(TIM3,led_dt);//设置比较信号
}
PWM1模式和PWM2模式的区别
[PWM1&PWM2模式;输出极性高低的含义]
110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为
无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否
则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为
有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电
平输出比较极性的指的是你在比较匹配之后输出口输出的极性。
这个函数就是让你设置有效极性,也就是设置比较输出的有效电平。你可以设置为高电平有效或者低电平有效。
如果设置为高电平有效,那么当定时器比较匹配之后,输出口输出高电平,否则就反一下。
网友评论