微控制器的电容控制面板PCB设计有哪些需要注意

描述

在之前的项目文章中,我介绍了使用TI MSP430FR2633定制电容式触摸接口的基本电路设计注意事项。在本文中,我们将仔细研究PCB设计考虑因素和器件编程。

Myinterface由两块电路板组成:一块四层电路板,内置微控制器和支持电路,以及带有电容式触摸屏和指示灯LED的双层电路板。

MSP430FR2633的PCB布局注意事项

主电路板是具有内部接地平面和阴影电源平面的四层叠层。阴影线有助于减少可能对电容式触摸感应性能产生负面影响的寄生电容。

除ESD二极管和USB连接器外,元件安装在电路板的顶部。 USB连接器安装在电路板的底部,以避免微型USB连接器和CP2102N之间的差分对线路交叉,并利用电路板和外壳之间未使用的空间。

我订购此板的制造公司,MacroFab,为单面和双面板充电。

上面显示的是四个电路板层的自上而下的图像。

I关注电容式触摸引脚的迹线与下面的层之间的电容耦合。为了最大限度地减小电容效应,我使用了5密耳的连接和一个阴影填充,固定的走线宽度和不同的层间空间宽度。

这不是必须这样做,但我想要抵消阴影填充不同的图层。不幸的是,这不是我的PCB设计程序(Diptrace)的一个功能,并且手动移动阴影填充提供了不一致的结果。在附近的电源层上使用带阴影填充的最小迹线宽度电容式触摸感应线,意味着降低电容式触摸引脚上的电容。

电路板的第二层(Vcc)可以看到红色。阴影填充和细线跟踪用于减少电容耦合的影响。

阴影填充连接到与实心填充相同的网。我在实心填充中添加了额外的点,以创建第二个阴影铜区域填充的负空间。使用Diptrace,定义正负区域可防止实心填充填充阴影区域。

LED注意事项

电容式控制面板的底部

用于驱动LED的信号状态的变化可以被微控制器检测为电容的变化。为避免意外激活,TI建议将数字和电容信号线分开至少4 mm。此外,当在不同的层上交叉时,它们应该以直角交叉。

我选择使用反向安装,而不是通过将LED放置在与按钮和旋转轮相同的层上的过孔来布线。 LED通过电路板上的孔发光。

CP2102N编程

CP2102N使用Silicon Labs的Simplicity Studio Express配置工具进行编程。两个GPIO引脚用于指示MSP430FR2633和CP2102N之间的UART数据传输。这些LED与实际数据传输位于不同的网络上,LED显示为发送的字节和数据串,而不是单个数据位。

请参阅我的另一篇文章,了解如何克服CP2102N的编程难度。

MSP430FR2633编程

正如我在第一篇文章中提到的,CapTIvate Design Center是一个图形化软件工具,可以生成运行该项目所需的大部分代码。它确实需要知道哪些按钮和滑块存在以及它们连接到哪些引脚。该软件生成运行微控制器和电容式触摸界面所需的所有C源代码,头文件和库。

pcb

pcb

下载代码

不幸的是,此时软件还不知道我已将指示灯LED添加到我的主板上。所以我很遗憾不能简单地构建代码并将其上传到微控制器。我首先需要告诉MSP430FR2633它有一些LED连接,然后想出一种方法来打开和关闭它们。

我选择通过bitmasking来做到这一点。我在控制面板的左上角,左下角,中间角,右上角和右下角有五个LED,我想创建三种方式来控制它们 - 开,关和切换。

为MSP执行此操作的方法是将LED视为内存中特定位置的位。写1并且LED亮;写一个0然后它会关闭;反转该值,您将切换LED状态。引脚映射到各种寄存器中的位。这些位位置由微芯片上的引脚排列决定。例如,GPIO引脚P2.3位于寄存器2的第3位。要打开和关闭LED,只需操作寄存器2的第3位。寄存器位置P2在另一个特定于微控制器的文件中定义。

幸运的是,基本结构包含在Code Composer Studio中MSP430FR2633的示例草图中。我所要做的只是为我的LED复制和修改它。

LED_UL代表控制面板左上角的LED。


                    #define LED_UL_POUT                  (P2OUT)
#define LED_UL_PDIR                   (P2DIR)
#define LED_UL_PIN                    (BIT3)
#define LED_UL_ON                    (LED_UL_POUT |= LED_UL_PIN)
#define LED_UL_OFF                    (LED_UL_POUT &= ~LED_UL_PIN)
#define LED_UL_TOGGLE                (LED_UL_POUT ^= LED_UL_PIN)

在main()函数中,需要插入一个小命令来禁用GPIO引脚高阻模式。如果您正在为自己的项目进行操作,请在看门狗定时器停止或LED永不点亮后插入命令。


                    Void main(void){
  WDTCTL = WDTPW | WDTHOLD;     // Stop watchdog timer
  PM5CTL0 &= ~LOCKLPM5;          // Disable Power-On High-Impedance mode

}

最后,我需要编写一个使用电容式触摸界面传感器位置点亮LED的功能。


                    void my_slider_callback(tSensor* pSensor)
{
  // FIRST CHECK IF THERE IS VALID TOUCH
  if(pSensor->bSensorTouch == true)
  {
    // THEN GET THE CURRENT TOUCH POSITION ON THE SLIDER/WHEEL
    position = (uint16_t)((tSliderSensorParams*)pSensor->pSensorParams)->SliderPosition.ui16Natural;
    // Even though it is storing the data in a 16-bit integer, the numbers never exceed 8 bits in length
    // Use the position to generate eight cases -- illuminate one of four corners, or illuminate one of four sides.
    // Mask bits 5:7 thenshift them to become bits 0:2
    // case8 = (position & 0x00E0) >> 5;
    // add an integer offset if lights are rotated from wheel positions
    case8 = ((position & 0x00E0)>>5) + 3 ) % 7     
   switch(case8)
    {
    case 0: // Light Upper Left Corner
      LED_UL_ON;LED_UR_OFF;LED_BR_OFF;LED_BL_OFF;
      break;
    case 1: // Light Top Side
      LED_UL_ON;LED_UR_ON;LED_BR_OFF;LED_BL_OFF;
      break;
    case 2: // Light Upper Right Corner
      LED_UL_OFF;LED_UR_ON;LED_BR_OFF;LED_BL_OFF;
      break;
    case 3: // Light Right Side
      LED_UL_OFF;LED_UR_ON;LED_BR_ON;LED_BL_OFF;
      break;
    case 4: // Light Bottom Right Corner
      LED_UL_OFF;LED_UR_OFF;LED_BR_ON;LED_BL_OFF;
      break;
    case 5: // Light Bottom Side
      LED_UL_OFF;LED_UR_OFF;LED_BR_ON;LED_BL_ON;
      break;
    case 6: // Light Bottom Left Corner
      LED_UL_OFF;LED_UR_OFF;LED_BR_OFF;LED_BL_ON;
      break;
    case 7: // Light Left Side
      LED_UL_ON;LED_UR_OFF;LED_BR_OFF;LED_BL_ON;
      break;
    Default: // Turn corner lights off and toggle center LED
      LED_UL_OFF;LED_UR_OFF;LED_BR_OFF;LED_BL_OFF;LED_C_TOGGLE;
      break;
    }
  }
}

JTAG故障排除

在完美的世界中,我可以立即上传代码并开始试验。但这不是一种简单的方法。

我最初尝试对电路板进行编程失败,并显示一条错误消息,表明没有连接任何设备。我开始使用示波器解决问题并看到以下JTAG事务。

pcb

上面显示的是一个无效的JTAG事务。测试,TMS,TCK,TDO,TDI和nRST状态在示波器中基于1.51 V阈值定义为低/高。

对于那些对JTAG编程不熟悉的人,根本不是你期望JTAG事务的样子。理想情况下,有一个入口序列,然后是TDO和TDI线上的时钟信号和数据转换的快速转换。

出于好奇,我决定在我的调查中添加一个普通的模拟探头,看看是什么信号正在更详细地进行。模拟探针迹线如下所示为黄色。

pcb

上面以白色显示的是MSP430FR2633的完整JTAG事务。黄色迹线是正常的模拟测量,它复制了TDI信号线。

现在,我有一些黄色探针迹线的其他有趣信息。信号并不总是处于逻辑高或逻辑低状态。还有一些东西正在与信号线相互作用,并保持一个干扰编程信号的~2 V电位差。

同时,我意识到我选择用于USB的两个引脚 - 串行接口(UCA0TXD,UCA0RXD)分别成为TCK VREF +和TMS的两倍。因此,当连接到JTAG接口时,绝对没有办法测试USB到串行接口,并且CP2102N很可能主动干扰JTAG编程。

不幸的是,我需要重新设计电路板,将CP2102N的Tx/Rx引脚重新定位到UCA1RXD和UCA1TXD线。

pcb

MSP430FR2633更好的JTAG交易

收到我的新电路板并挂钩这取决于我的JTAG程序员,我有最后一个障碍。我很沮丧地仍然无法编程,直到我对程序员进行了固件升级。

但是,毕竟,我终于有一个项目可以让我更好地理解和编程电容式环形滑块。

德州仪器(TI)MSP430用户指南演示了多种访问电容式滑块和按钮的方法,而这只是其中之一。但是,这种方法可以帮助您在下一个设计中使用电容式触摸滑块开始自己尝试。我希望你喜欢它。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分