|
本帖最后由 kkhkbb 于 2018-3-14 13:35 编辑 一、 概述 1、 PWM简介 PWM即脉冲宽度调制,是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。 PWM的主要应用:在STM32中如调节屏幕亮度、音调等应用都可以通过PWM控制占空比进行实现。下面我们会为大家举例介绍如何利用PWM控制LED的亮暗,以实现呼吸灯的效果。 2、PWM的工作原理 脉宽调制基本原理:其控制方式就是对电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变电路输出电压的大小,也可改变输出频率。 (1)脉宽调制原理 脉宽调制调制模式可以生产一个由TIMx_ARR寄存器确定频率,由TIMx_CCRx确定占空比的信号。如下图所示:
图8_0脉宽调制原理示意图 图中可知0到t2为一个周期时间,而占空比由CCRx值决定。一个周期时间可以由以下公式计算:
其中:ARR为重新装载值;PSC为预分频系数;TCLK为定时器时钟频率。如本次实验中TCLk为84M,选择ARR为499,PSC为83,其一个周期为0.5ms。 (2)脉宽调制原理 PWM主要工作过程如下:
图8_1 PWM工作过程示意图 PWM工作步骤解析: a. CCR1捕获比较值寄存器设置比较值,将其与当前值寄存器的值比较,要说明的是修改TIM_CCMR1寄存器的OC1M[2:0]位可控制 PWM模式,方法如下:
b. 经过输出控制器后,得到OC1ref电平还要经过一个选择,其由TIMx_CCRE寄存器的CC1P位控制:输入/捕获1输出极性。0:高 电平有效。1:低电平有效 c. 选择完成后经过输出电路来输出,输出电路由TIM_xCCRE寄存器的CC1E位控制。 控制方式为0:关闭 1:打开。 二、 实验原理 STM32的定时器有PWM功能,iCore3的三个LED都连接在定时器的输出接口上,可以通过定时器的PWM输出控制LED的亮度,从而实现呼吸灯的功能。硬件连接示意图如下图所示:
图8_2 驱动示意图 三、源代码 1、主函数
2.PWM初始化 以下是TIM8初始化及PWM设置程序:
3.修改占空比函数
4.小知识 在上面程序中有一段函数为: GPIO_PinAFConfig(GPIOI,GPIO_PinSource5,GPIO_AF_TIM8); 它的功能是将PI5复用为TIM8_CH1,初学者可能会问了为什么PI5可以复用为TIM8_CH1,其他引角可不可以。这就要借助该芯片的数据手册了,芯片上众多引角他们往往带有自己特殊的使命,如以下从数据手册上的截屏:
图8_3 芯片引脚功能示意图 其在数据手册的Pinouts and pin description——STM32F40xxx pin and ball definitions目录下。前面六列为该芯片手册包含的芯片类型,接下来第七列是引脚的名称,第八列是引脚类型如可以输入输出的I/O口,第八列中有FT标识的引脚表示能承受5V电压,第九列是注释,第十列为可复用功能如PI5要复用为TIM8_CH1功能则可通过刚刚介绍的函数实现,第十一列为可重映射功能。 四、 实验现象: iCore3 双核心板红色LED灯亮度从亮到暗,然后从暗到亮。 五、 代码包下载链接 |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版
temp = sin(PI / 99.0 * brightness) * 0.5 + 0.5;
反过来看:
data = (int)temp;
这里是强转 因为后者是浮点型 他的好处是可以sin保留小数点后面
temp *= 499;
因为init是499,所以前面temp是0--1之间的小数。
本来 sin(PI / 99.0 * brightness)就可以了
用
temp = sin(PI / 99.0 * brightness) * 0.5 + 0.5;
他的temp min是0.5 也就是灯不会全灭 max是1也就是最亮
sin(PI / 99.0 * brightness)
这个正弦函数跟亮度是什么关系?
pwm.set_compare(data);把这个数值放到ccnx吧 动态改变占空比 完成亮度时间切换 实现呼吸灯