查看: 1457|回复: 0

[原创] Kinetis K60系列之TSI触摸感应

[复制链接]

该用户从未签到

16

主题

78

帖子

0

注册会员

Rank: 2

积分
178
最后登录
2018-6-1
发表于 2016-9-12 08:36:24 | 显示全部楼层 |阅读模式
偶然发现kinetis有个TSI寄存器,关于电容触摸屏原理……手指接近会导致振荡器频率的变化
  1. #include "LED.h"


  2. void TSI_Init(void);
  3. void TSI_SelfAdjust(void);

  4. volatile U16 Adjust[4];

  5. void main(void)
  6. {

  7.     DisableInterrupts;

  8.     TSI_Init();
  9.    
  10.     init_LED();
  11.    
  12.     TSI_SelfAdjust();

  13.     EnableInterrupts;

  14.     while(1);   
  15. }

  16. void TSI_Init(void)
  17. {
  18.     SIM_SCGC5 |= (SIM_SCGC5_TSI_MASK | SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK);

  19.     PORTA_PCR4 = PORT_PCR_MUX(0);     
  20.     PORTB_PCR2 = PORT_PCR_MUX(0);     
  21.     PORTB_PCR3 = PORT_PCR_MUX(0);     
  22.     PORTB_PCR16 = PORT_PCR_MUX(0);   

  23.     TSI0_GENCS |= (TSI_GENCS_NSCN(10) | TSI_GENCS_PS(3)); //扫描数  振荡器分频
  24.     TSI0_SCANC |= (TSI_SCANC_EXTCHRG(3) | TSI_SCANC_REFCHRG(31) | TSI_SCANC_DELVOL(7) | TSI_SCANC_SMOD(0) | TSI_SCANC_AMPSC(0));
  25.               //外部电流                  参考电流                电压                  连续扫描            输入时钟分频
  26.     TSI0_PEN = TSI_PEN_PEN5_MASK | TSI_PEN_PEN7_MASK | TSI_PEN_PEN8_MASK | TSI_PEN_PEN9_MASK;
  27.               //打开相应TSI通道
  28.     TSI0_GENCS |= TSI_GENCS_TSIEN_MASK;  //打开TSI中断

  29.     enable_irq(83);
  30.    
  31. }

  32. void TSI_SelfAdjust(void) //自校正
  33. {
  34.     TSI0_GENCS |= TSI_GENCS_SWTS_MASK;         //软触发启动
  35.     while(!TSI0_GENCS & TSI_GENCS_EOSF_MASK);  //等待扫描结束
  36.     Delay(300);

  37.     //TSIx_CNTRn 高十六位存储的是通道n三角计数的值 低16位存储通道(n-1)的值
  38.     Adjust[0] = (TSI0_CNTR5>>16)&0x0000FFFF;  
  39.     Adjust[1] = (TSI0_CNTR7>>16)&0x0000FFFF;
  40.     Adjust[2] = (TSI0_CNTR9)&0x0000FFFF;
  41.     Adjust[3] = (TSI0_CNTR9>>16)&0x0000FFFF;


  42.     TSI0_GENCS &= ~TSI_GENCS_TSIEN_MASK;  //关闭TSI

  43.     TSI0_GENCS |= TSI_GENCS_STM_MASK;      
  44.     TSI0_GENCS |= (TSI_GENCS_TSIIE_MASK|TSI_GENCS_ESOR_MASK);
  45.     TSI0_GENCS |= TSI_GENCS_TSIEN_MASK;     
  46.    
  47. }
复制代码
中断服务函数
  1. #include "isr.h"
  2. #include "LED.h"

  3. #define VALVE1 800
  4. #define VALVE2 800
  5. #define VALVE3 800
  6. #define VALVE4 800

  7. extern volatile U16 Adjust[4];

  8. U8 LED_1 = 1,LED_2 = 1,LED_3 = 1,LED_4 = 1;

  9. void TSI_isr(void)
  10. {
  11.     U16 NOWCounter;

  12.     TSI0_GENCS |= TSI_GENCS_OUTRGF_MASK;  //清除数据
  13.     TSI0_GENCS |= TSI_GENCS_EOSF_MASK;    //扫描

  14.     NOWCounter = (TSI0_CNTR5>>16)&0x0000FFFF -VALVE1;  //获取周期
  15.    
  16.     if(NOWCounter>Adjust[0])
  17.     {
  18.         Delay(10);  //延迟消抖
  19.         NOWCounter = (TSI0_CNTR5>>16)&0x0000FFFF -VALVE1;
  20.         if(NOWCounter>Adjust[0])
  21.         {
  22.             LED_1 = !LED_1;
  23.             LED1(LED_1);
  24.             while(NOWCounter>Adjust[0])
  25.                 NOWCounter = (TSI0_CNTR5>>16)&0x0000FFFF -VALVE1;        
  26.         }
  27.     }
  28.    
  29.    
  30.     NOWCounter = (TSI0_CNTR7>>16)&0x0000FFFF -VALVE2;        
  31.    
  32.     if(NOWCounter>Adjust[1])
  33.     {
  34.         Delay(10);
  35.         NOWCounter = (TSI0_CNTR7>>16)&0x0000FFFF -VALVE2;        
  36.         if(NOWCounter>Adjust[1])
  37.         {
  38.             LED_2 = !LED_2;
  39.             LED2(LED_2);
  40.             while(NOWCounter>Adjust[1])
  41.                 NOWCounter = (TSI0_CNTR7>>16)&0x0000FFFF -VALVE2;        
  42.         }
  43.     }

  44.     NOWCounter = (TSI0_CNTR9)&0x0000FFFF -VALVE3;
  45.    
  46.     if(NOWCounter>Adjust[2])
  47.     {
  48.         Delay(10);
  49.         NOWCounter = (TSI0_CNTR9)&0x0000FFFF -VALVE3;   
  50.         if(NOWCounter>Adjust[2])
  51.         {
  52.             LED_3 = !LED_3;
  53.             LED3(LED_3);
  54.             while(NOWCounter>Adjust[2])
  55.                 NOWCounter = (TSI0_CNTR9)&0x0000FFFF -VALVE3;        
  56.         }
  57.     }   

  58.     NOWCounter = (TSI0_CNTR9>>16)&0x0000FFFF -VALVE4;        
  59.    
  60.     if(NOWCounter>Adjust[3])
  61.     {
  62.         Delay(10);
  63.         NOWCounter = (TSI0_CNTR9>>16)&0x0000FFFF -VALVE4;        
  64.         if(NOWCounter>Adjust[3])
  65.         {
  66.             LED_4 = !LED_4;
  67.             LED4(LED_4);
  68.             while(NOWCounter>Adjust[3])
  69.                 NOWCounter = (TSI0_CNTR9>>16)&0x0000FFFF -VALVE4;        
  70.         }
  71.     }   
  72.    
  73.     TSI0_STATUS = 0xFFFFFFFF;
  74. }
复制代码




回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-26 03:32 , Processed in 0.109556 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表