MSP430 电容触摸转轮和LED PWM 输出设计
LED 驱动部分电路如图 5, 由于每一个LED 的电流在10mA 左右,24 个LED 如果同时亮就有240mA,无法通过MCU IO 口直接驱动,在每个LED 上加一个三极管以及限流电阻,实现24路LED 的控制。

图 6 LED 驱动电路
3.2 代码设计
3.2.1 LED驱动
在编写代码控制LED 点亮时序前,先定义好PWM 输出相关的规格:
• PWM 输出占空比设置为50%。
• 频率为5K Hz, 亮度的等级分为24 级,0 级的时候关闭LED, 23 的时候最亮。
• 使用2个TIMER 进行PWM 输出的控制
• TIMERA0 中断频率为24 X 5K Hz = 120K Hz.
• TIMERB中断间隔设为10ms,在TIMERB 中进行LED 亮度等级的改变
通过两个TIMER 的中断配合,就可以完成24 路独立PWM 输出的控制。当有触摸事件产生时,根据触摸位置对对应的LED 进行亮度等级赋值,然后在TIMERB 的中断中让亮度等级慢慢减少至零,这样就可以实现手指离开电极后,对应LED 慢慢变暗的效果。
在两个TIMER 中断里的程序流程图如下图 7 和图 8

图 7 TIMERB 流程图

图 8 TIMERA0 流程图
3.2.2 转轮
德州仪器的电容触摸软件库支持电容按键的信号检测以及转轮坐标的计算,通过软件库相关参数的配置以及函数的调用就可以得到当前触摸事件的位置值,可以参考德州仪器的触摸按键软件库(www.ti.com/capacitivetouch)获得详细介绍。
当用户在转轮上做滑动操作,LED 的轨迹显示应该是N 个灯同时被点亮,手指所在位置的灯最亮,之前滑过的轨迹上的灯一个比一个暗,N 的数值由操作者滑动的速度决定,如果滑的速度够快,24 个LED 灯会同时被点亮,只是亮度不同。
在滑动很快的操作时会带来一个问题,电容按键扫描的周期跟不上滑动的速度,导致坐标的变化不是连续的,结果就是LED 的轨迹不连贯,在连续的N 个LED 中有部分没有被点亮。为了解决这个问题需要在转轮坐标计算后加入一个插值算法,在用户操作过快的时候对被漏掉的坐标进行补值,使得LED 的轨迹连续。
插值的方法可以通过当前位置和上一次位置的比较,决定是否要进行插值,这里需要设置一个插值门限InterpolationThreshold,当位置跳动距离超过门限就不进行插值,反正误操作产生。
if((WheelPosition-LastPosition)
{
for (j=1;j=(WheelPosition-LastPosition+1);j++)
{
SetLightLevel(LastPosition+j);
}
}
除此之外,还需要对两个特殊情况做处理,及正向和反向滑动操作经过转轮坐标0 点。
4. 总结
本文介绍了使用MSP430G 系列单芯片实现电容触摸转轮和24 路独立PWM 输出LED 控制方案,在一些需要低成本的产品设计,又要对多种LED 特效控制的场合,有很大的使用价值。
评论