K20 EVM - Kinetis Cortex-M4 K20 TSI 정전용량 스위치 테스트
요즘 출시되는 대부분의 MCU들은 정전용량 터치센서를 위한 하드웨어 블럭을 기본으로 제공하는것 같다. 사용해 보았던 CAP Sensor MCU 중에는 가장 사용하기 편리하고 기능이 풍부한것 같다.
K20 TSI 테스트 동영상
K20 TSI 블록도
K20 EVM 보드에서 TSI9(PB16), TSI10(PB17) 포트를 이용하여 테스트 했다.
K20 TSI 초기화 함수 소스코드
void TSI_Init(void)
{
//PORTB, TSI클럭 enable
SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK | SIM_SCGC5_TSI_MASK;
//PORT 할당
PORTA_PCR16 = PORT_PCR_MUX(0);
PORTA_PCR17 = PORT_PCR_MUX(0);
// Clear the EOSF (End of Scan) flag
TSI0_GENCS |= TSI_GENCS_EOSF_MASK;
TSI0_GENCS |= TSI_GENCS_NSCN(10) | // Set number of consecutive scans per electrode to 11
TSI_GENCS_PS(4) | // Set electrode oscillator prescaler to divide by 16
TSI_GENCS_STPE_MASK | // Keep TSI running when MCU goes into low power mode
TSI_GENCS_LPSCNITV(7); // Low power mode scan interval is set to 50 msec
TSI0_SCANC |= (TSI_SCANC_EXTCHRG(8) | // Set ext oscillator charge current to 18 uA
TSI_SCANC_REFCHRG(15) | // Set reference osc charge current to 32 uA
TSI_SCANC_SMOD(10) | // Set scan period modulus to 10
TSI_SCANC_AMPSC(1) | // Divide input clock by 2
TSI_SCANC_AMCLKS(0)); // Set active mode clock source to LPOSCCLK
//TSI0_GENCS |= TSI_GENCS_LPCLKS_MASK; // Set low power clock source to VLPOSCCLK
TSI0_PEN = TSI_PEN_PEN9_MASK | TSI_PEN_PEN10_MASK;
//low power mode only one pin may be active
TSI0_PEN |= TSI_PEN_LPSP(9);
// Enables TSI
TSI0_GENCS |= TSI_GENCS_TSIEN_MASK;
}
TSIx_CNTR
터치센서의 감도는 TSIxCNTR 레제스터에서 오실레이션 카운트값을 읽으면 알 수 있다.
2 채널당 하나의 레지스터를 할당하고 있다.
K20 TSI 카운트값 리드 함수
unsigned int ReadTSI(int Number)
{
//Software Trigger Start
TSI0_GENCS |= TSI_GENCS_SWTS_MASK;
while(!(TSI0_GENCS & TSI_GENCS_EOSF_MASK));
// Clear the EOSF (End of Scan) flag
TSI0_GENCS |= TSI_GENCS_EOSF_MASK;
return *(electrodeHW[Number].counterRegister);
}