想实现一个用开发板上的滑块控制下边六个灯亮度的小实验。
首先想到的是用MCU上的定时器硬件资源,看了数据手册,板子上有PWM功能的总共有八组独立的PWM和六组复用的PWM,共14组。
关于外设资源的描述,数据手册上写的已经足够理解了,还配备有外设示例代码,大多数情况下可以先跑起来示例代码,再回头看数据手册,以下是官方提供的PWM初始化程序。
虽然周期和它注释描述的完全不一致,还有关闭PWM4 PWM3中断应该是IE1 &= ~0x20,不过还是能跑起来的。
下面是数据手册对于寄存器的描述,可以加深对这段外设驱动代码的理解。
关闭PWM对应的IO口输出,仅把PWM当作一个定时器来使用
PWMCFG = 0x00;
配置独立模式,时钟不分频,使能模块。
PWMCON0 = 0x80
需要允许PWM产生溢出中断
IE1 |= 0x02
对PWM0进行初始化然后设置周期和占空比进行测试,
PWM的时钟频率是固定的32MHz,因此如果像设置周期时间是1us,只需要用1us * 32MHz - 1 = 31
占空比如果想设置成50%,只要把PDT0x设置成周期的一半,
这里PWM0的初始化是31和50%
波形测试结果如下
不过看下来这么多组PWM外设的一大缺陷就是中断资源不够用,14组PWM信号只有一个中断溢出信号,只有计数值超过定时器的溢出值时才会产生中断,因为时钟频率是固定的32MHz并且所有PWM周期都只能设置成同一个值,这是不会冲突的。因此在pcb设计时就考虑到了要用PWM外设,把PWM输出引脚连接到了灯或者电机上。
另外一个实现思路是纯软件的方式,如果指令能运行的足够快的话,效果也是不错的,
以下是SysFunVarDefine.c中的更改,在Slider处理函数中添加软件定时器比较值的更改。
注释掉原先触摸按键TK的灯光显示。
链接:
提取码:9f2q
--来自百度网盘超级会员V5的分享
|