STM32呼吸灯PWM(Pulse Width Modulation)是一种常用的调制技术,用于在数字电路中生成模拟信号。它通过改变脉冲的宽度和周期来模拟连续的模拟信号。 PWM信号由一系列的脉冲组成,每个脉冲的宽度表示信号的幅度或占空比。占空比是指脉冲高电平时间与一个周期的比例。通过改变脉冲的宽度和周期,可以改变PWM信号的平均电平,从而模拟出不同的电压或电流值。 呼吸灯原理讲解**我们可以知道,假如我们的小灯是低电平触发的时候,我们的电平保持着低电平的状态,我们的小灯就会一直亮着。反之我们的小灯一直是低电平的时候,则我们的小灯就一直处于熄灭的状态。 **** 那如何实现小灯从亮到灭实现呼吸的效果呢? **** 下面画一个效果图 我们可以看到,在一段时间内,我们在灭灯状态中,不断的加大我们的亮灯时间,在这一个时间段,我们看见的灯不是变亮了吗!简单来说,我们需要在一个时间段,不断加大我们的亮灯时间,控制我们的亮灯时间,亮灯时间不断加大,我们就可以发现灯在不断从暗变亮的效果。 原理大致解释完了,接下来我们就要实践操作! 配置设置首先我们先打开我们上次配置LED小灯,后缀的ioc的图形化配置。** 好首先我们根据我们上次配置小灯的IO口,来找到PA5引脚。 通过刚才的分析,我们需要在一段时间内配置我们的小灯的亮灭时间,那么这一段时间要如何来呢? 这里就需要我们的定时器! 我们点击PA5,发现PA5有这么多状态可以配置,这里我们需要PA5定时器的通道1。我们点击进行配置。 可以发现PA5变黄了,说明我们还需要配置定时器。这里我们点击Enter User Lable,自定义用户命名我们修改为LED1。 我们可以知道刚才的选择,我们的小灯是定时器通道1,这里的CH1代表的是通道。 我们往下看,需要配置的三个参数,下面是关于PWM的计数模式,这里我们选择默认,以后需要的话,我们单独讲解。** **这里的PSC是配置我们的定时器预分频器,这里我们的频率为48M,我们设置为48-1,这里会让我们的频率降为1MHZ,这里讲一下为什么要减少1,为什么不能48M/48=1M呢?因为我们的定时器会有一个重装载的时间,就是说原本定时器要计算0-1000,但是1000要转换为0,也需要一段时间,这里我们的减1,是留给重装载的。不理解也没关系,简单记得就需要减少1. 这里的Count Period为计数周期。(ARR)** **这里我们用周期来理解我们的计算数,这里我们需要1kHZ的周期,所以我们需要将我们的1MHZ降为1KHZ,1M换算过来刚好是一百万,所以说这里我们需要除以1000,这里我们又因为重装载也需要一个周期,所以我们这里还需要减1。 *这里其实是有计算公式的:最终周期 = (PSC + 1) (ARR + 1) / 定时器输入时钟频率** Auto-reload preload 用于在定时器计数器溢出后自动重新加载预设的初始值。这里就是溢出的时候加到1001,之后要将我们的值重新赋值为0,硬件复位的效果。 最后点击右上角的CEBERARTE CODE 好软件的配置完成,接下来我们开启程序的编写。 程序编写这里我们需要开启我们的定时器PWM开始计数 这里需要填写俩个参数,第一个参数是定时器,第二个参数是定时器通道。** 这里通过指针来获取的定时器的基地址,&htimx,这里的x是根据我们的定时器几来决定的,所以这里我们填写了&htim1. **第二个参数是定时器通道,根据我们上面的讲解,这里我们只需要填写TIM_CHANNEL_1,定时器通道1,完成我们的设置。 根据我们的操作,我们可以知道,我们需要调节我们的其中的时间来实现我们的亮灭程度,所以我们需要一个宏定义函数来调节我们的高低电平的时间, 这里我定义了一个延时时间参数uint16_t time** **首先先介绍一下函数的使用 HAL_TIM_SET_COMPARE(**HANDLE**, **CHANNEL**, **COMPARE__);** 第一个参数为:定时器,第二个参数为:定时器通道1,第三个参数是PWM的高电平时间。** **这里我们就可以知道,在一个周期里,我们不断修改定时器时间,其中小灯的亮灭效果是有变化的。 因为一个周期是1000ms,所以我们不断修改其中高电平的时间,就能改变一个周期的时间,就能观察到小灯从亮开始慢慢变暗的过程,这里还需要一定的延时,因为没有延时的话,运行速度太快,我们观察不到小灯亮灭的效果。第二个for循环就是实现小灯从暗道亮的过程。 **这里我们就实现了小灯呼吸灯的效果,下次我们通过串口命令来控制小灯。 |
【狂欢三】STM32C031使用TIM定时器DMA方式实现PWM输出(二)
【狂欢三】STM32C031使用TIM定时器PWM输出
【STM32MP257】🥳STM32MP257-DK-开发板开箱体验
NUCLEO-U083RC学习历程-空闲中断+DMA接收不定长数据
刘氓兔的杂谈【001】-片上USB 高速PHY
【NUCLEO-WB09KE评测】+使用STM32CubeMX新建蓝牙工程
【NUCLEO-WB09KE评测】+基于STM32CubeMX创建工程点灯
刘氓兔的64位入门挑战【2】——MP257和cubemx
【NUCLEO-WB09KE评测】+实现读取温湿度传感器SHTC3数据
【NUCLEO-WB09KE评测】+实现串口printf打印和shell移植