一、基本配置
首先来基本的配置
1.将debug 改为 模拟输出
3.开始配置引脚
4.配置时钟树(省略)
这里我设置72HZ
5.最后的收尾设置(前面一期有讲)
正式开始PWM的配置
1、PWM的设置需要 定时器的时钟 来控制频率(具体的可以看另一期文章)
这里以TIM3的Channel1为例介绍。
2、先开启内部时钟,然后选择PWM的模式一
可以看到PA6被设置 TIM_CH1
3、接着配置参数
前面提到时钟树72MHZ ,也就是7200万脉冲每秒,为了方便计算,可以将它72分频,这样定时器便是每秒计数1000000次。
可以将自动重装载值设置为数100次,每秒就会有一万次从0数到99的过程,也就是说一秒钟就会输出1万组PWM波形,这就是PWM的频率,10000HZ。
从0数到99这一过程所用的时间也就是PWM的周期,万分之一秒,0.1ms。
由于自动重装值设置为了100-1,所以比较寄存器的值只能在0-99中赋值。
比如这里给50。那么初始的占空比,就是50/100=50%.
之后写代码改变 比较寄存器 的值时候,改的就是这个 50.
如果ARR给2000-1,那么你的比较寄存器的值就是在0-1999之间设置。占空比计算同理。
注意
PWM是模拟电压输出,如果你通过上面的设置为周期1s ,它就会每一秒去给你输出一个电压,这样的话,灯泡你看起来就是一闪一闪的。
但是你要是那个时间设的很短的话,比如说你通过调整这两个数字,使它调整到那个时间是0.1ms,一个非常小的数字的话,那么实际上它还是噔噔噔噔噔不断在闪,但是因为它时间太短了,闪闪的时间太短了,咱们肉眼看不出来,所以就咱们肉眼就认为它是一种常亮状态。
4、NVIC使能(图略)
至此基本配置结束。后面再收尾生成代码即可。
二、在keil5中编写代码 改变PWM的占空比
找中断服务函数和回调函数的过程不在赘述,在前面 定时器中断 那里有介绍。
这里也是利用 定时器内部中断的方式 来控制PWM的占空比。
这是使能的代码。
下面来看具体的函数实现部分。
int i = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim -> Instance == TIM3)
{
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,i+=20);
if(i == 100)
{
i = 0;
}
}
}
这样就可以实现 一个定时器产生中断,每秒触发一次中断,在中断服务程序中,改变PWM的占空比,实现LED亮度的周期性变化。
这里提一下,LED的引脚 应该负极接地,正极链接到PWM的输出口。
---------------------------------------------------------------------------------------------------------------
文章结束,记录stm32学习。