KL25Z TSI library

Dependents:   AccelerometerLedTsiDemo NRF24L01_sender TouchButton Wi-Go_IOT_Demo ... more

Fork of TSI by Emilio Monti

Legacy Warning

This is an mbed 2 library. To learn more about mbed OS 5, visit the docs.

Files at this revision

API Documentation at this revision

Comitter:
emilmont
Date:
Thu Oct 11 11:04:30 2012 +0000
Child:
1:4dd9262cac47
Commit message:
KL25Z TSI library

Changed in this revision

TSI_Sensor.cpp Show annotated file Show diff for this revision Revisions of this file
TSI_Sensor.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TSI_Sensor.cpp	Thu Oct 11 11:04:30 2012 +0000
@@ -0,0 +1,213 @@
+#include "mbed.h"
+#include "TSI_Sensor.h"
+
+#define NO_TOUCH                 0
+#define SLIDER_LENGTH           40 //LENGTH in mm
+#define TOTAL_ELECTRODE          2
+
+#define TSI0a        0
+#define TSI1         1
+#define TSI2         2
+#define TSI3         3
+#define TSI4         4
+#define TSI5         5
+#define TSI6         6
+#define TSI7         7
+#define TSI8         8
+#define TSI9         9
+#define TSI10        10
+#define TSI11        11
+#define TSI12        12
+#define TSI13        13
+#define TSI14        14
+#define TSI15        15
+
+/*Chose the correct TSI channel for the electrode number*/
+#define ELECTRODE0   TSI9
+#define ELECTRODE1   TSI10
+#define ELECTRODE2   TSI0a
+#define ELECTRODE3   TSI1
+#define ELECTRODE4   TSI2
+#define ELECTRODE5   TSI3
+#define ELECTRODE6   TSI4
+#define ELECTRODE7   TSI5
+#define ELECTRODE8   TSI6
+#define ELECTRODE9   TSI7
+#define ELECTRODE10  TSI8
+#define ELECTRODE11  TSI11
+#define ELECTRODE12  TSI12
+#define ELECTRODE13  TSI13
+#define ELECTRODE14  TSI14
+#define ELECTRODE15  TSI15
+
+#define THRESHOLD0   100
+#define THRESHOLD1   100
+#define THRESHOLD2   100
+#define THRESHOLD3   100
+#define THRESHOLD4   100
+#define THRESHOLD5   100
+#define THRESHOLD6   100
+#define THRESHOLD7   100
+#define THRESHOLD8   100
+#define THRESHOLD9   100
+#define THRESHOLD10   100
+#define THRESHOLD11   100
+#define THRESHOLD12   100
+#define THRESHOLD13   100
+#define THRESHOLD14   100
+#define THRESHOLD15   100
+
+static uint8_t total_electrode = TOTAL_ELECTRODE;
+static uint8_t elec_array[16]={    ELECTRODE0,ELECTRODE1,ELECTRODE2,ELECTRODE3,ELECTRODE4,ELECTRODE5,
+                                                                ELECTRODE6,ELECTRODE7,ELECTRODE8,ELECTRODE9,ELECTRODE10,ELECTRODE11,
+                                                                ELECTRODE12,ELECTRODE13,ELECTRODE14,ELECTRODE15};
+static uint16_t gu16TSICount[16];
+static uint16_t gu16Baseline[16];
+static uint16_t gu16Threshold[16]={THRESHOLD0,THRESHOLD1,THRESHOLD2,THRESHOLD3,THRESHOLD4,THRESHOLD5,
+                                THRESHOLD6,THRESHOLD7,THRESHOLD8,THRESHOLD9,THRESHOLD10,THRESHOLD11,
+                                THRESHOLD12,THRESHOLD13,THRESHOLD14,THRESHOLD15};
+static uint16_t gu16Delta[16];
+static uint8_t ongoing_elec;
+
+static uint8_t end_flag = 1;
+
+static uint8_t SliderPercentegePosition[2] = {NO_TOUCH,NO_TOUCH};
+static uint8_t SliderDistancePosition[2] = {NO_TOUCH,NO_TOUCH};
+
+
+static uint32_t AbsolutePercentegePosition = NO_TOUCH;
+static uint32_t AbsoluteDistancePosition = NO_TOUCH;
+
+static void tsi_irq();
+
+TSI_Sensor::TSI_Sensor() {
+    SIM->SCGC5 |= SIM_SCGC5_PORTB_MASK;
+    SIM->SCGC5 |= SIM_SCGC5_TSI_MASK;
+
+  TSI0->GENCS |= (TSI_GENCS_ESOR_MASK
+                   | TSI_GENCS_MODE(0)
+                   | TSI_GENCS_REFCHRG(4)
+                   | TSI_GENCS_DVOLT(0)
+                   | TSI_GENCS_EXTCHRG(7)
+                   | TSI_GENCS_PS(4)
+                   | TSI_GENCS_NSCN(11)
+                   | TSI_GENCS_TSIIEN_MASK
+                   | TSI_GENCS_STPE_MASK
+                   );
+
+  TSI0->GENCS |= TSI_GENCS_TSIEN_MASK;
+
+  NVIC_SetVector(TSI0_IRQn, (uint32_t)&tsi_irq);
+  NVIC_EnableIRQ(TSI0_IRQn);
+
+  self_calibration();
+}
+
+
+void TSI_Sensor::self_calibration(void)
+{
+  unsigned char cnt;
+  unsigned char trigger_backup;
+
+
+  TSI0->GENCS |= TSI_GENCS_EOSF_MASK;      // Clear End of Scan Flag
+  TSI0->GENCS &= ~TSI_GENCS_TSIEN_MASK;    // Disable TSI module
+
+  if(TSI0->GENCS & TSI_GENCS_STM_MASK)     // Back-up TSI Trigger mode from Application
+       trigger_backup = 1;
+  else
+       trigger_backup = 0;
+
+  TSI0->GENCS &= ~TSI_GENCS_STM_MASK;      // Use SW trigger
+  TSI0->GENCS &= ~TSI_GENCS_TSIIEN_MASK;    // Enable TSI interrupts
+
+  TSI0->GENCS |= TSI_GENCS_TSIEN_MASK;     // Enable TSI module
+
+  for(cnt=0; cnt < total_electrode; cnt++)  // Get Counts when Electrode not pressed
+  {
+    TSI0->DATA = ((elec_array[cnt] << TSI_DATA_TSICH_SHIFT) );
+    TSI0->DATA |= TSI_DATA_SWTS_MASK;
+    while(!(TSI0->GENCS & TSI_GENCS_EOSF_MASK));
+    TSI0->GENCS |= TSI_GENCS_EOSF_MASK;
+    gu16Baseline[cnt] = (TSI0->DATA & TSI_DATA_TSICNT_MASK);
+  }
+
+  TSI0->GENCS &= ~TSI_GENCS_TSIEN_MASK;    // Disable TSI module
+  TSI0->GENCS |= TSI_GENCS_TSIIEN_MASK;     // Enale TSI interrupt
+  if(trigger_backup)                      // Restore trigger mode
+    TSI0->GENCS |= TSI_GENCS_STM_MASK;
+  else
+    TSI0->GENCS &= ~TSI_GENCS_STM_MASK;
+
+    TSI0->GENCS |= TSI_GENCS_TSIEN_MASK;     // Enable TSI module
+
+  TSI0->DATA = ((elec_array[0]<<TSI_DATA_TSICH_SHIFT) );
+  TSI0->DATA |= TSI_DATA_SWTS_MASK;
+}
+
+
+void TSI_Sensor::SliderRead(void ) {
+     if(end_flag) {
+        end_flag = 0;
+
+        if((gu16Delta[0] > gu16Threshold[0])||(gu16Delta[1] > gu16Threshold[1])) {
+           SliderPercentegePosition[0] = (gu16Delta[0]*100)/(gu16Delta[0]+gu16Delta[1]);
+           SliderPercentegePosition[1] = (gu16Delta[1]*100)/(gu16Delta[0]+gu16Delta[1]);
+           SliderDistancePosition[0] = (SliderPercentegePosition[0]* SLIDER_LENGTH)/100;
+           SliderDistancePosition[1] = (SliderPercentegePosition[1]* SLIDER_LENGTH)/100;
+                     AbsolutePercentegePosition = ((100 - SliderPercentegePosition[0]) + SliderPercentegePosition[1])/2;
+                     AbsoluteDistancePosition = ((SLIDER_LENGTH - SliderDistancePosition[0]) + SliderDistancePosition[1])/2;
+
+         }else {
+            SliderPercentegePosition[0] = NO_TOUCH;
+            SliderPercentegePosition[1] = NO_TOUCH;
+            SliderDistancePosition[0] = NO_TOUCH;
+            SliderDistancePosition[1] = NO_TOUCH;
+            AbsolutePercentegePosition = NO_TOUCH;
+            AbsoluteDistancePosition = NO_TOUCH;
+         }
+      }
+}
+
+uint32_t TSI_Sensor::getPercentage() {
+        SliderRead();
+        return AbsolutePercentegePosition;
+}
+
+uint32_t TSI_Sensor::getDistance() {
+        SliderRead();
+        return AbsoluteDistancePosition;
+}
+
+
+static void change_electrode(void)
+{
+    int16_t u16temp_delta;
+
+    gu16TSICount[ongoing_elec] = (TSI0->DATA & TSI_DATA_TSICNT_MASK);          // Save Counts for current electrode
+    u16temp_delta = gu16TSICount[ongoing_elec] - gu16Baseline[ongoing_elec];  // Obtains Counts Delta from callibration reference
+    if(u16temp_delta < 0)
+            gu16Delta[ongoing_elec] = 0;
+    else
+      gu16Delta[ongoing_elec] = u16temp_delta;
+
+    if(total_electrode > 1)  //Change Electrode to Scan
+    {
+            if((total_electrode-1) > ongoing_elec)
+                                ongoing_elec++;
+            else
+                                ongoing_elec = 0;
+
+            TSI0->DATA = ((elec_array[ongoing_elec]<<TSI_DATA_TSICH_SHIFT) );
+            TSI0->DATA |= TSI_DATA_SWTS_MASK;
+    }
+}
+
+
+void tsi_irq(void)
+{
+  end_flag = 1;
+  TSI0->GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
+  change_electrode();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TSI_Sensor.h	Thu Oct 11 11:04:30 2012 +0000
@@ -0,0 +1,33 @@
+#ifndef TSI_SENSOR_H
+#define TSI_SENSOR_H
+
+
+//!Library for the TSI Touch sensor available on the KL25Z board
+class TSI_Sensor {
+public:
+    //!Creates an instance of the class.
+    /*!
+        Initialize the TSI touch sensor
+     */
+    TSI_Sensor();
+
+    /*
+     * Get Touch Sensor percentage value
+     *
+     * \returns percentage value
+     */
+    uint32_t getPercentage();
+
+    /*
+     * Get Touch Sensor distance
+     *
+     * \returns distance value
+     */
+    uint32_t getDistance();
+
+private:
+    void SliderRead(void);
+    void self_calibration(void);
+};
+
+#endif