MSP430电容触摸转轮和LED PWM输出设计
扫描二维码
随时随地手机看文章
摘要
本应用文档介绍了使用MSP430 微控制器实现电容触摸转轮和多路独立LED 的PWM 软件驱动技术。方案通过4 路I/O 端口实现电容触摸转轮控制, I/O 端口配合三极管驱动LED, 实现LED 呼吸、轨迹灯等效果。本方案为需要电容触摸转轮控制和 LED 跟踪显示等绚丽灯效的产品提供了有效的低成本方案。
简介
电容触摸技术作为一种实用、时尚的人机交互方式,已经被广泛的应用到各种电子产品,小到电灯开关,大到平板电脑、触摸桌等。随之而来的是考验产品设计者如何发挥智慧,在把产品用户界面设计得方便简洁的同时,又能呈现产品绚丽的外观,从而带来良好的用户体验。
LED 显示由于界面友好,可以实时反映触摸的位置信息,在电容触摸产品设计中得到广泛应用。本设计正是利用了大量的LED 来实现呼吸灯、轨迹灯的特效,可以为例如灯光、音量、温度等带有调节功能的产品提供设计参考。
德州仪器的MSP430 系列单片机以低功耗和外设模块的丰富性而著称,而针对电容触摸应用,MSP430 的PIN RO 电容触摸检测方式支持IO 口直接连接检测电极,不需要任何外围器件,极大的简化了电路设计,而本设计文档中使用的MSP430G2XX5 更支持多达 32 个IO 口,可驱动24 个以上的LED 灯,达到理想的显示效果。
1. 电容触摸转轮实现方案
MSP430 电容触摸转轮方案通过4 个IO 口完成4 个通道的电容检测,配合特殊的电极图形,就可实现转轮的设计。
1.1 电容触摸实现原理
MSP430 根据型号的不同支持多种电容触摸检测方式,有RC 震荡、比较器、PIN RO,本设计使用的是PIN Relaxation Oscillator 方式,原理如图1,芯片管脚内部检测电路由施密特触发器、反向器,以及一个电阻组成,震荡信号经过施密特触发器变成脉冲信号,再通过反向器反馈回RC 电路,通过Timer_A对施密特触发器的输出进行记数,再通过设置测量窗口Gate 获得记数的结果。当手指触摸电极,电极上的C 产生变化,导致震荡频率改变,这样在定长的测量窗口就能获得不同的记数结果,一旦差值超过门限,结合一定的滤波算法判断就可以触发触摸事件。
图 1 PIN RO 原理图
1.2 转轮算法
将4 个按键电极按照图2 锯齿状交叉就形成了一个转轮的电极,转轮的大小根据产品设计的需要可进行适当的缩放,图 2 的图形设计适合30mm 左右直径的转轮。
图 2 转轮电极设计
当用户在转轮上操作的时候,在手指对应位置的电极会获得最高的信号值,手指临近的通道会有相对高的信号值,离手指最远的通道检测到的信号值最小,如图 3 所示:
图 3 手指触摸时不同电极上测量到的信号值
这时可以利用不同通道上信号值的不同计算出手指在转轮或滑条上的位置。位置计算步骤如下:
a. 用排序方法找出4 个电极中信号最大的电极
index = Dominant_Element(groupOfElements, &measCnt[0]);
b. 将找到的这个电极的信号加上相邻电极的信号
position = measCnt[index] + measCnt[index+1] + measCnt[index-1];
相加后的结果如果大于门限,就认为有触摸事件产生,继续后续的位置计算。把前后信号相加的原因是手指在操作的过程中有可能处于两个电极中间,这样两个电极上得到的信号都不会很高,需要把信号相加才可以与门限做比较。
c. 计算位置坐标时先根据筛选出的index 值得到一个大约的位置,再根据index 的相邻电极信号强度进行修正,得到最后的坐标值
position = index*(groupOfElements->points/groupOfElements->numElements);
position += (groupOfElements->points/groupOfElements->numElements)/2;
position += (measCnt[index+1]*(groupOfElements->points/groupOfElements->numElements))/100;
position -= (measCnt[index-1]*(groupOfElements->points/groupOfElements->numElements))/100;
d. 针对index 为0 或者3 的情况代码需要另外处理,不过计算方法和上述是一致的。
这里转轮的分辨率,即转轮一圈分为多少个段是根据points 设定的,假设用户只需要区分24 个位置,就可以设points 为24,当然也可以设为64,128,甚至更高,这取决于转轮的大小,电极图形的设计以及电极的多少,例如需要类似1024 这种高精度,需要增加电极数从4 个到8 个或者更多。
2. LED PWM 驱动方案实现
要实现LED 呼吸的效果,就要求LED 进行PWM 调光,而要实现轨迹灯的效果,每一路LED必须是独立的PWM 控制。
本应用由于使用了24 个LED 灯,需要24 路的PWM 输出控制,MSP430G2955 有32 个IO口,通过IO 口配合TIMER 定时器,足够支持24 路的软件PWM 输出。
3. 设计实例
本实例采用德州仪器MSP430G2955 ,通过6 个IO 完成电容触摸检测,24 个IO 驱动24路LED,并预留了通讯口。设计实例如图 4
图 4 实例演示图
3.1 电路设计
原理图设计如图 4, MCU 通过一个5V 转3.3V 的LDO 给VCC 供电,使用LDO 的目的是为了保证电源的稳定,让触摸电路在检测信号时不会因为电源的噪声产生过大的信号偏差。电极上串的电阻作为ESD 保护器件,如果在产品结构设计合理的情况下可以省去。电路中预留了UART 口与主控系统通讯。
图 5 MCU 电路
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 特效控制的场合,有很大的使用价值。