STM32使用PWM实现led亮度变化

简介: STM32使用PWM实现led亮度变化

1.序言

这里我以stm32F103c8te为例,讲解一下pwm如何输出,

pwm又是如何控制led灯的亮度变化,以及具体代码又是

如何是实现的。最后结语中也给出了一个小练习。

2.频率

首先我们搞清楚一个概念什么是频率。比如我们stm32F103的系统频率是72M

就是指1秒钟能产生的72M的脉冲(高电平或者低电平)次数。

而对于定时器的时钟频率,就是指定时器1秒钟产生的脉冲(低电平或者高电平)的次数。

所以频率越高,led灯就不容易闪烁(速度够快,肉眼察觉不到,感觉是一直亮着)。

3.占空比

什么是占空比?就是在一个周期内,高电平所占时间的比例。

比如周期是一秒,有600ms是高电平,400ms是低电平。

则占空比是60%(下图),而这个占空比起什么作用呢?

与频率有什么区别?就拿上述占空比举例,

如:高电平电压位3.3V 占空比是60%则平均电压是3.3乘于60%=1.96V。

可以用万用表测量。所以占空比实际上是影响输出电压大小的。

led灯的输入电压变小(电压不足),led灯自然就没那么亮了。

所以就在一定周期内,占空比越大,引脚输出的电压就越大。

4.控制led亮度变化原理

有了上述二个概念,我们就能知道在一定频率下,修改占空比就能实现led亮度变化。

5.代码实例

这里我使用的是stm32F103c8T6定时器1的通道1,输出引脚为PA8。

这里我们用PA8输出PWM波控制led灯亮度变化。

如果是其他开发板,查询相关开发板原理图,找到对应的PWM输出引脚

5.1 初始化引脚

这里我使用的是c8t6的的通道1为PA8引脚。这里配置为复用推挽输出

#define ARR 900-1
#define CCR 300
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  
GPIO_InitTypeDef GPIO_InitStructure;
//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

5.2 配置定时器1

配置为80khz,向上计数。

// 使能定时器1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
//72M/900=80KHZ,其实就是频率
TIM_TimeBaseStructure.TIM_Period = ARR; //设置为900-1
//设置用来作为TIMx时钟频率除数的预分频值,不分频
TIM_TimeBaseStructure.TIM_Prescaler =psc;   
//设置时钟分割:不分割
TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
//TIM向上计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 

5.3配置输出PWM

配置输出占空比为1/3的pwm波

TIM_OCInitTypeDef  TIM_OCInitStructure;
/*选择定时器模式:TIM脉冲宽度调制模式1
PWM1 其实就是计数值小于CCR的值就输出有效电平,
下面第四句话设置了有效电平是高电平
所以小于CCR的值就输出高电平.*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
//设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_Pulse = 0; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_Pulse = CCR;//设置CCR的值为300
//所以占空比为CCR/ARR= 300/900=1/3 电压就是3.3 乘于 1/3=1.1V
//根据TIM_OCInitStruct中指定的参数初始化外设TIM1通道1
TIM_OC1Init(TIM1, &TIM_OCInitStructure); 
TIM_CtrlPWMOutputs(TIM1,ENABLE);  //MOE 主输出使能 
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能  
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM1, ENABLE);  //使能TIM1
//我们可以通过 TIM_SetCompare1(TIM1,CCR);重新设置CCR的大小改变占空比
}

6.结语

我们的功能到这里已经实现了,我们可以在需要修改占空比的地方调用 TIM_SetCompare1(TIM1,CCR)函数

修改占空比,改变led灯亮度。最后你们学会了吗?自己也可以动手做个小实验。

比如使用PWM修改风扇的风速大小。快动手去试一试吧!

目录
相关文章
|
7月前
|
芯片
最详细STM32,cubeMX 按键点亮 led
最详细STM32,cubeMX 按键点亮 led
117 0
|
7月前
|
传感器 芯片
最详细STM32,cubeMX 点亮 led
最详细STM32,cubeMX 点亮 led
85 0
|
4月前
|
存储
【STM32基础 CubeMX】PWM输出
【STM32基础 CubeMX】PWM输出
193 0
|
10月前
STM32F103C8 TIM输出比较与PWM
STM32F103C8 TIM输出比较与PWM
65 0
|
8月前
STM32F0单片机 PWM + ADC 控制有刷电机
STM32F0单片机 PWM + ADC 控制有刷电机
No.6 STM32F429IGT6 LED按键检测 按键点灯 (STM32F429/F767/H743)
No.6 STM32F429IGT6 LED按键检测 按键点灯 (STM32F429/F767/H743)
No.5 STM32F429IGT6 标准库实战GPIO输出LED灯 点亮闪烁(STM32F429/F767/H743)
No.5 STM32F429IGT6 标准库实战GPIO输出LED灯 点亮闪烁(STM32F429/F767/H743)
|
9月前
STM32使用PWM脉冲呼吸灯
对于灯等来说有很多种方法,前面介绍了一些基础的点灯方法,比如直接点灯,按键控制点灯,按键中断点灯,但都是比较简单的一些方法也很基础,要问我有没有什么高级点的点灯方法,答案是有的,在这我要介绍一种高级点灯的方法就是使用PWM进行点灯。
141 0
STM32使用PWM脉冲呼吸灯
|
11月前
使用STM32CubeMX实现LED闪烁
使用STM32CubeMX实现LED闪烁
137 0
|
11月前
|
存储 IDE 安全
STM32CubeMX开发教程(2)— 使用教程(点亮LED灯)
STM32CubeMX开发教程(2)— 使用教程(点亮LED灯)
422 0