This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

msp430G2403 电容按键 baseline 问题 和 系统稳定性设计

最近测试发现,当mcu上电后直接采集baseline会有一定的偏差,导致误触。

大概需要大概10s的时间才能稳定到一个合理的范围,这样的话导致每次重启或上电都得等,不能满足需求

之前使用过一些集成好的电容按键芯片(不带晶体),基本上是上电直接用的。感觉原理应该一样,所以觉得以430的能力应该不会差那么多。

不知道是程序(底层使用ti的驱动库)的问题,还是硬件的问题?

另外,发现按键的异常(失效、误触、不断repeat等)除了与电源有关外,还与晶体所受干扰有直接关系,考虑到产品的稳定性和可靠性。不知道有什么方法能够避免异常?

之前本来想能把按键系统做成上电或重启即用,让用户感觉不到,但是感觉mcu上电需要一段稳定时间(现在看来有点长),所以没有办法实现。

请教各位专家,有没有好的办法能解决。

非常感谢!!!

  • 应该是baseline的算法有问题。不可能需要10s这么长的时间。初始的baseline是能够很快确定。后续的baseline也是根据不断采集到的数值进行更新。我想你应该是程序设计有问题。

  • 首先是对波形采集进行显示,看噪声水平如何。主要考虑的一个是硬件布板问题,按键大小,形状。另外可以适当使用软件滤波。msp430能够实现上电即用(当然不是在上电的时候一直就触碰着触摸按键)

  • 很感谢Peter_Zheng的指导!!

    如果是baseline算法的问题的话,因为我们自己用的是TI官方的demo程序。

    请问是不是能提供一些参考的算法?

    另外,关于PCB的问题,是不是能够通过一些硬件方面的修改(例如:增加一些滤波电容)增加一些系统可靠性?

  • 如果是TI库里面的算法,应该不至于需要那么长时间。您有几个按键,按键的振荡频率是多少,测量的窗口时间是多少?按键上的覆盖层有多厚?

  • 谢谢Peter_Zheng!!

    我有两种应用,一种是两个按键,一种是三个按键

    按键结构是:按键PCB不覆盖绿油和丝印,上面加了大概1.3mm左右的泛光片,上层还有4mm的钢化玻璃。由于安装等因素,钢化玻璃和泛光片之间可能会有0.1mm左右的空气。按键直径15mm(由于模具问题,三按键的相互间隔只有3mm左右)

    目前用于按键采集的时钟源是外部32768晶体,感觉很容易受到外部干扰。不知道晶振受到干扰后会对采集造成多大影响,是否会导致MCU重启。

    部分代码如下

    AA_CONST struct Element element1 =
    {
         .inputPxselRegister = (unsigned char *)&P2SEL,
         .inputPxsel2Register = (unsigned char *)&P2SEL2,
         .inputBits = BIT0,
        
         .maxResponse = 500 + 500,
         .threshold = 500
    };

    AA_CONST struct Sensor button1 =
    {

        .halDefinition = RO_PINOSC_TA0_WDTp, // Sensing Method
        .numElements = 1, // # of Elements
        .baseOffset = 0, // First element index = 0
       

         // Pointer to elements
        .arrayPtr[0] = &element1, // point to middle element
         // Timer Information
        .measGateSource= GATE_WDT_SMCLK, // 0->SMCLK, 1-> ACLK
        .accumulationCycles= WDTA_GATE_2G // 64 - Default

    };

    baseline灵敏度配置为:

    uint16_t ctsStatusReg = (DOI_INC+TRADOI_MED+TRIDOI_MED);

  • 请问您的片子是什么G2xxx那个型号的?

    一般不建议使用WDTA这种时间窗,如果有两个timer,则一个做时间窗,一个做计数。如果没有2个timer,则用for循环这种模拟一个时间窗。请使用内部DCO来作为时间窗。另外用示波器看一下触摸按键的振荡频率是多少。

  • 提供一段我自己修改过的代码给你参考,你也可以直接修改按键。

    code.rar
  • 在硬件方面,首先是走线,尽量减少走线过程中的其他干扰。可以在与I/O口比较近的地方加一个小电阻。我们走过十几厘米的线,而且进行干扰测试,都有可以通过。对于2,3个按键这种处理根本不是问题。请参考上面的代码。欢迎共同讨论。

  • 非常感谢Peter_Zheng!!!

    我先试试您给的代码。

    以后还得多多向您学习!!!

  • 不客气,一起学习。