10054|25

256

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

MSP430G2开发板触摸感应子卡学习心得 [复制链接]

在统统看完关于MSP430G2的资料后,犹豫不决。最后还是对我心爱的430下了狠手,做了触摸感应子卡的实验,移除了电容和电阻,进行的很顺利。没有烫坏我的板板,附图一张

连接USB,下载实验的程序,按下触摸感应键得到如下

 

之前查阅相关资料对本板是电容触摸还是电感触摸得到初步结论:应该是电感触摸。有兴趣的可以讨论下!

在大学课余的时间里玩着自己喜欢的控制板,乐哉!

下面附一程序

最新回复

这个触摸板为什么淘宝上买不到  详情 回复 发表于 2012-7-23 16:56

赞赏

1

查看全部赞赏

 
点赞 关注
个人签名追求卓越,成功就会在不经意间追上你

回复
举报

256

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

这是程序,相信有多人有了,我可是研究了很一段时间,新手在成长!呵呵

// Launchpad Touch Cap Sensing
// Touch Key code

#include
// Define User Configuration values //
//----------------------------------//
// Defines WDT SMCLK interval for sensor measurements
#define WDT_meas_setting (DIV_SMCLK_512)
// Defines WDT ACLK interval for delay between measurement cycles
#define WDT_delay_setting (DIV_ACLK_512)

// Sensor settings
#define Num_Sen     5                   // Defines number of sensors

// Definitions for use with the WDT settings
#define DIV_ACLK_32768  (WDT_ADLY_1000)  /* ACLK/32768 */
#define DIV_ACLK_8192   (WDT_ADLY_250)   /* ACLK/8192 */
#define DIV_ACLK_512    (WDT_ADLY_16)    /* ACLK/512 */
#define DIV_ACLK_64     (WDT_ADLY_1_9)   /* ACLK/64 */
#define DIV_SMCLK_32768 (WDT_MDLY_32)    /* SMCLK/32768 */
#define DIV_SMCLK_8192  (WDT_MDLY_8)     /* SMCLK/8192 */
#define DIV_SMCLK_512   (WDT_MDLY_0_5)   /* SMCLK/512 */
#define DIV_SMCLK_64    (WDT_MDLY_0_064) /* SMCLK/64 */

// Define Hardware Inputs/Outputs
#define CA_Out  (0x80)                 // Comparator output on P1.7
#define CA_Ref  (0x02)                 // Comparator reference on P1.1
#define TA_Clk  (0x01)                 // Timer_A clock input on P1.0

#define S_1   (0x04)                    // Sensor 1 P1.2
#define S_2   (0x08)                    // Sensor 2 P1.3
#define S_3   (0x10)                    // Sensor 3 P1.4
#define S_4   (0x20)                    // Sensor 4 P1.5
#define S_5   (0x40)                    // Sensor 4 P1.6

#define CA_1   (P2CA4)                  // Mux settings: CA+ Vref at CA1
#define CA_2   (P2CA2)                  // Mux settings: Sensor 1 at CA2
#define CA_3   (P2CA1+P2CA2)            // Mux settings: Sensor 2 at CA2
#define CA_4   (P2CA3)                  // Mux settings: Sensor 3 at CA2
#define CA_5   (P2CA1+P2CA3)            // Mux settings: Sensor 4 at CA2
#define CA_6   (P2CA2+P2CA3)            // Mux settings: Sensor 4 at CA2

#define LED1       (0x40)                  // P2.6
#define LED2       (0x80)                  // P2.7

// Global variables for sensing
unsigned int base_cnt[Num_Sen];
unsigned int meas_cnt[Num_Sen];
int delta_cnt[Num_Sen];
unsigned char key_press[Num_Sen];
const unsigned int KEY_lvl_S[5]={4000,40,40,90,100};
const unsigned int KEY_lvl_W[5]={4000,40,40,90,100};
char key_pressed, key_loc;
int cycles;
unsigned int LEDCount = 4000;
unsigned int LEDTimer = 10;
unsigned int swjudge = 0;

// System Routines
void measure_count(void);               // Measures each capacitive sensor
void pulse_LED(void);                   // LED gradient routine (for demo only)

// Main Function
void main(void)
{
  volatile unsigned int i,j;
  
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  BCSCTL1 = CALBC1_1MHZ;                // Set DCO to 1, 8, 12 or 16MHz
  DCOCTL = CALDCO_1MHZ;
  BCSCTL1 |= DIVA_0;                    // ACLK/(0:1,1:2,2:4,3:8)
  BCSCTL3 |= LFXT1S_2;                  // LFXT1 = VLO
  IE1 |= WDTIE;                         // enable WDT interrupt
  
  P1OUT = 0x00;                         // P1.x = 0
  P1DIR = 0xFE;                         // P1.0 = TACLK input
  P1SEL |= 0x81;                        // P1.0 = TACLK input, P1.7 = CAOUT
  P2OUT = 0x00;                         //
  P2SEL = 0x00;                         // No XTAL
  P2DIR |= LED1+LED2;
  P2OUT |= LED2;
  P2SEL |= LED1;
  
  CAPD =  CA_Ref;                       // disable input buffer for CA+ ref input
  CACTL2 = CA_1;                        // CA1 = CA+ Vref
  _EINT();                              // Enable interrupts
  
  measure_count();                      // Establish an initial baseline capacitance
  for (i = 0; i   {
    if(meas_cnt>1000)
      swjudge++;
  }
  for (i = 0; i     base_cnt = meas_cnt;
  
  for(i=15; i>0; i--)                   // Repeat and average base measurement
  { measure_count();
  for (j = 0; j     base_cnt[j] = (meas_cnt[j]+base_cnt[j])/2;
  }
  
  // Main loop starts here
  while (1)
  {
    key_pressed = 0;                    // Assume no keys are pressed
   
    measure_count();                    // Measure all sensors
    for (i = 0; i     { delta_cnt = base_cnt - meas_cnt;  // Calculate delta: c_change
   
    // Handle baseline measurment for a base C decrease
    if (delta_cnt < 0)             // If negative: result increased
    {                                 // beyond baseline, i.e. cap decreased
      delta_cnt = 0;             // Zero out delta for position determination
    }
    if(swjudge == 1)
    {
      if (delta_cnt > KEY_lvl_W)       // Determine if each key is pressed per a preset threshold
      {
        key_press = 1;               // Specific key pressed
        key_pressed = 1;                // Any key pressed
        P2OUT ^= LED2;
        while(LEDTimer--)
        {
          LEDCount -= 5;
          if(LEDCount<10)LEDCount=4000;
          pulse_LED();
        }
        LEDTimer=10;
      }
      else
        key_press = 0;
    }
    else if(swjudge == 2)
    {
      if (delta_cnt > KEY_lvl_S)       // Determine if each key is pressed per a preset threshold
      {
        key_press = 1;               // Specific key pressed
        key_pressed = 1;                // Any key pressed
        P2OUT ^= LED2;
        while(LEDTimer--)
        {
          LEDCount -= 5;
          if(LEDCount<10)LEDCount=4000;
          pulse_LED();
        }
        LEDTimer=10;
      }
      else
        key_press = 0;
    }
    else
      key_press = 0;
    }
    WDTCTL = WDT_delay_setting;         // WDT, ACLK, interval timer
   
    LPM3;                               // accomodate for genuine changes in sensor C
  }
} // End Main

// Measure count result (capacitance) of each sensor
// Routine setup for four sensors, not dependent on Num_Sen value!
void measure_count(void)
{     
  char i;
  
  TACTL = TASSEL_0+MC_2;                // TACLK, cont mode
  TACCTL1 = CM_3+CCIS_2+CAP;            // Pos&Neg,GND,Cap
  CACTL1 |= CAON;                       // Turn on comparator
  for (i = 0; i   {
    switch (i)
    {
    case 1: // Sensor 1
      CAPD = CA_Ref+S_1;        // Diable I/Os for CA1 ref, 1st sensor
      CACTL2 = CA_1+CA_2;       // CA1 ref, CAx sensor
      break;
    case 2: // Sensor 2
      CAPD = CA_Ref+S_2;        // Diable I/Os for CA1 ref, 2nd sensor
      CACTL2 = CA_1+CA_3;       // CA1 ref, CAx sensor
      break;
    case 3: // Sensor 3
      CAPD = CA_Ref+S_3;        // Diable I/Os for CA1 ref, 3rd sensor
      CACTL2 = CA_1+CA_4;       // CA1 ref, CAx sensor
      break;
    case 4: // Sensor 4
      CAPD = CA_Ref+S_4;        // Diable I/Os for CA1 ref, 4th sensor
      CACTL2 = CA_1+CA_5;       // CA1 ref, CAx sensor
      break;
    case 0: // Sensor 5
      CAPD = CA_Ref+S_5;        // Diable I/Os for CA1 ref, 4th sensor
      CACTL2 = CA_1+CA_6;       // CA1 ref, CAx sensor
      break;
    }
    WDTCTL = WDT_meas_setting;          // Set duration of sensor measurment
    TACTL |= TACLR;                     // Clear Timer_A TAR
    LPM0;                               // Wait for WDT interrupt
    meas_cnt = TACCR1;               // Save result
    WDTCTL = WDTPW + WDTHOLD;           // Stop watchdog timer
  }
  CACTL1 &= ~CAON;                      // Turn off comparator
  CAPD =  CA_Ref;                       // Re-init Mux: all sensors = GND
}
void pulse_LED(void)
{        
  TACTL = TACLR;
  CCR0 = 5000;
  CCTL0 = OUTMOD_4;//+CCIE;
  CCR1 = LEDCount;
  CCTL1 = OUTMOD_4+CCIE;
  TACTL = TASSEL_2 + MC_3;
  _BIS_SR(LPM0_bits + GIE);             // Enter LPM0 w/ interrupt
}
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
  TACCTL1 ^= CCIS0;                     // Create SW capture of CCR1
  LPM3_EXIT;                            // Exit LPM3 on reti
}

// Timer A1 interrupt service routine
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1 (void)
{
  TACCTL1 &= ~CCIE;                   // interrupt disbled   
  LPM0_EXIT;
}
 
个人签名追求卓越,成功就会在不经意间追上你
 

回复

256

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
发代码,发失误了,sorry
 
个人签名追求卓越,成功就会在不经意间追上你
 
 

回复

4138

帖子

0

TA的资源

五彩晶圆(中级)

4
 
你这代码有点尴尬,大家都看不清楚啊哈哈哈
 
 
 

回复

1282

帖子

10

TA的资源

五彩晶圆(初级)

5
 
很神奇的感应卡啊
 
 
 

回复

7231

帖子

192

TA的资源

五彩晶圆(高级)

6
 

回复 板凳 孤独剑 的帖子

yaobu要不楼主直接上传个代码TXT也可以哇
 
 
 

回复

6066

帖子

92

TA的资源

裸片初长成(初级)

7
 

回复 板凳 孤独剑 的帖子

请问一下,你是从的什么浏览器,如果是IE的,是IE几呢
 
 
 

回复

256

帖子

0

TA的资源

一粒金砂(高级)

8
 

回复 7楼 maylove 的帖子

IE8吧,这个有关系吗?
 
个人签名追求卓越,成功就会在不经意间追上你
 
 

回复

6066

帖子

92

TA的资源

裸片初长成(初级)

9
 

回复 8楼 孤独剑 的帖子

我的浏览器是IE8的,也是不能换行,有网友是用IE6的能换行!
火狐的也能换行,具体我还没有明白怎么回事,碰巧今天负责这块的技术不再,等技术回来,我让他看看!
 
 
 

回复

256

帖子

0

TA的资源

一粒金砂(高级)

10
 

回复 9楼 maylove 的帖子

 
个人签名追求卓越,成功就会在不经意间追上你
 
 

回复

6066

帖子

92

TA的资源

裸片初长成(初级)

11
 

回复 10楼 孤独剑 的帖子

技术已经解决了这个问题哟!
 
 
 

回复

256

帖子

0

TA的资源

一粒金砂(高级)

12
 

回复 11楼 maylove 的帖子

谢谢啦
 
个人签名追求卓越,成功就会在不经意间追上你
 
 

回复

4138

帖子

0

TA的资源

五彩晶圆(中级)

13
 
我用360浏览器哈哈哈不用ie
 
 
 

回复

918

帖子

0

TA的资源

纯净的硅(中级)

14
 

回复 楼主 孤独剑 的帖子

必须要移除电阻或电容什么的吗?
 
 
 

回复

996

帖子

0

TA的资源

一粒金砂(高级)

15
 
怎么个感应啊,不太清楚1~
 
 
 

回复

256

帖子

0

TA的资源

一粒金砂(高级)

16
 

回复 15楼 larrybirdkobe 的帖子

我给你解释下
 
个人签名追求卓越,成功就会在不经意间追上你
 
 

回复

1282

帖子

10

TA的资源

五彩晶圆(初级)

17
 

回复 13楼 鑫海宝贝 的帖子

最新的IE9很好用,那个程序读的有些费尽
 
 
 

回复

1908

帖子

8

TA的资源

五彩晶圆(高级)

18
 
请问兄弟又iar的破解版本或者注册号吗?最近也在研究430
 
 
 

回复

256

帖子

0

TA的资源

一粒金砂(高级)

19
 

回复 18楼 sjl2001 的帖子

直接上TI上下载啊,我给你链接网址
https://estore.ti.com/MSP-EXP430 ... ment-kit-P2031.aspx
那个界面上点击IAR Embedded Workbench Kickstart 就行了
 
个人签名追求卓越,成功就会在不经意间追上你
 
 

回复

256

帖子

0

TA的资源

一粒金砂(高级)

20
 

回复 18楼 sjl2001 的帖子

我刚才回复了一个链接,不知道通过论坛审核没有,进TI网站,我这儿也 有现成的,给我个地址我发给你也行,100多兆
 
个人签名追求卓越,成功就会在不经意间追上你
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表