A compilation of some hardware sensors and their shared programming interfaces.

Committer:
mgottscho
Date:
Wed Mar 19 00:35:31 2014 +0000
Revision:
1:15396cab58d1
Parent:
0:8d34cc2ff388
Updated for most recent UtilityLib.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mgottscho 0:8d34cc2ff388 1 /* Freescale Semiconductor Inc.
mgottscho 0:8d34cc2ff388 2 * (c) Copyright 2004-2005 Freescale Semiconductor, Inc.
mgottscho 0:8d34cc2ff388 3 * (c) Copyright 2001-2004 Motorola, Inc.
mgottscho 0:8d34cc2ff388 4 *
mgottscho 0:8d34cc2ff388 5 * mbed Microcontroller Library
mgottscho 0:8d34cc2ff388 6 * (c) Copyright 2009-2012 ARM Limited.
mgottscho 0:8d34cc2ff388 7 *
mgottscho 0:8d34cc2ff388 8 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
mgottscho 0:8d34cc2ff388 9 * and associated documentation files (the "Software"), to deal in the Software without
mgottscho 0:8d34cc2ff388 10 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
mgottscho 0:8d34cc2ff388 11 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
mgottscho 0:8d34cc2ff388 12 * Software is furnished to do so, subject to the following conditions:
mgottscho 0:8d34cc2ff388 13 *
mgottscho 0:8d34cc2ff388 14 * The above copyright notice and this permission notice shall be included in all copies or
mgottscho 0:8d34cc2ff388 15 * substantial portions of the Software.
mgottscho 0:8d34cc2ff388 16 *
mgottscho 0:8d34cc2ff388 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
mgottscho 0:8d34cc2ff388 18 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
mgottscho 0:8d34cc2ff388 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
mgottscho 0:8d34cc2ff388 20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mgottscho 0:8d34cc2ff388 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
mgottscho 0:8d34cc2ff388 22 */
mgottscho 0:8d34cc2ff388 23
mgottscho 0:8d34cc2ff388 24 #include "mbed.h"
mgottscho 0:8d34cc2ff388 25 #include "TSISensor.h"
mgottscho 0:8d34cc2ff388 26
mgottscho 0:8d34cc2ff388 27 #define NO_TOUCH 0
mgottscho 0:8d34cc2ff388 28 #define SLIDER_LENGTH 40 //LENGTH in mm
mgottscho 0:8d34cc2ff388 29 #define TOTAL_ELECTRODE 2
mgottscho 0:8d34cc2ff388 30
mgottscho 0:8d34cc2ff388 31 #define TSI0a 0
mgottscho 0:8d34cc2ff388 32 #define TSI1 1
mgottscho 0:8d34cc2ff388 33 #define TSI2 2
mgottscho 0:8d34cc2ff388 34 #define TSI3 3
mgottscho 0:8d34cc2ff388 35 #define TSI4 4
mgottscho 0:8d34cc2ff388 36 #define TSI5 5
mgottscho 0:8d34cc2ff388 37 #define TSI6 6
mgottscho 0:8d34cc2ff388 38 #define TSI7 7
mgottscho 0:8d34cc2ff388 39 #define TSI8 8
mgottscho 0:8d34cc2ff388 40 #define TSI9 9
mgottscho 0:8d34cc2ff388 41 #define TSI10 10
mgottscho 0:8d34cc2ff388 42 #define TSI11 11
mgottscho 0:8d34cc2ff388 43 #define TSI12 12
mgottscho 0:8d34cc2ff388 44 #define TSI13 13
mgottscho 0:8d34cc2ff388 45 #define TSI14 14
mgottscho 0:8d34cc2ff388 46 #define TSI15 15
mgottscho 0:8d34cc2ff388 47
mgottscho 0:8d34cc2ff388 48 /*Chose the correct TSI channel for the electrode number*/
mgottscho 0:8d34cc2ff388 49 #define ELECTRODE0 TSI9
mgottscho 0:8d34cc2ff388 50 #define ELECTRODE1 TSI10
mgottscho 0:8d34cc2ff388 51 #define ELECTRODE2 TSI0a
mgottscho 0:8d34cc2ff388 52 #define ELECTRODE3 TSI1
mgottscho 0:8d34cc2ff388 53 #define ELECTRODE4 TSI2
mgottscho 0:8d34cc2ff388 54 #define ELECTRODE5 TSI3
mgottscho 0:8d34cc2ff388 55 #define ELECTRODE6 TSI4
mgottscho 0:8d34cc2ff388 56 #define ELECTRODE7 TSI5
mgottscho 0:8d34cc2ff388 57 #define ELECTRODE8 TSI6
mgottscho 0:8d34cc2ff388 58 #define ELECTRODE9 TSI7
mgottscho 0:8d34cc2ff388 59 #define ELECTRODE10 TSI8
mgottscho 0:8d34cc2ff388 60 #define ELECTRODE11 TSI11
mgottscho 0:8d34cc2ff388 61 #define ELECTRODE12 TSI12
mgottscho 0:8d34cc2ff388 62 #define ELECTRODE13 TSI13
mgottscho 0:8d34cc2ff388 63 #define ELECTRODE14 TSI14
mgottscho 0:8d34cc2ff388 64 #define ELECTRODE15 TSI15
mgottscho 0:8d34cc2ff388 65
mgottscho 0:8d34cc2ff388 66 #define THRESHOLD0 100
mgottscho 0:8d34cc2ff388 67 #define THRESHOLD1 100
mgottscho 0:8d34cc2ff388 68 #define THRESHOLD2 100
mgottscho 0:8d34cc2ff388 69 #define THRESHOLD3 100
mgottscho 0:8d34cc2ff388 70 #define THRESHOLD4 100
mgottscho 0:8d34cc2ff388 71 #define THRESHOLD5 100
mgottscho 0:8d34cc2ff388 72 #define THRESHOLD6 100
mgottscho 0:8d34cc2ff388 73 #define THRESHOLD7 100
mgottscho 0:8d34cc2ff388 74 #define THRESHOLD8 100
mgottscho 0:8d34cc2ff388 75 #define THRESHOLD9 100
mgottscho 0:8d34cc2ff388 76 #define THRESHOLD10 100
mgottscho 0:8d34cc2ff388 77 #define THRESHOLD11 100
mgottscho 0:8d34cc2ff388 78 #define THRESHOLD12 100
mgottscho 0:8d34cc2ff388 79 #define THRESHOLD13 100
mgottscho 0:8d34cc2ff388 80 #define THRESHOLD14 100
mgottscho 0:8d34cc2ff388 81 #define THRESHOLD15 100
mgottscho 0:8d34cc2ff388 82
mgottscho 0:8d34cc2ff388 83 static uint8_t total_electrode = TOTAL_ELECTRODE;
mgottscho 0:8d34cc2ff388 84 static uint8_t elec_array[16]={ELECTRODE0,ELECTRODE1,ELECTRODE2,ELECTRODE3,ELECTRODE4,ELECTRODE5,
mgottscho 0:8d34cc2ff388 85 ELECTRODE6,ELECTRODE7,ELECTRODE8,ELECTRODE9,ELECTRODE10,ELECTRODE11,
mgottscho 0:8d34cc2ff388 86 ELECTRODE12,ELECTRODE13,ELECTRODE14,ELECTRODE15};
mgottscho 0:8d34cc2ff388 87 static uint16_t gu16TSICount[16];
mgottscho 0:8d34cc2ff388 88 static uint16_t gu16Baseline[16];
mgottscho 0:8d34cc2ff388 89 static uint16_t gu16Threshold[16]={THRESHOLD0,THRESHOLD1,THRESHOLD2,THRESHOLD3,THRESHOLD4,THRESHOLD5,
mgottscho 0:8d34cc2ff388 90 THRESHOLD6,THRESHOLD7,THRESHOLD8,THRESHOLD9,THRESHOLD10,THRESHOLD11,
mgottscho 0:8d34cc2ff388 91 THRESHOLD12,THRESHOLD13,THRESHOLD14,THRESHOLD15};
mgottscho 0:8d34cc2ff388 92 static uint16_t gu16Delta[16];
mgottscho 0:8d34cc2ff388 93 static uint8_t ongoing_elec;
mgottscho 0:8d34cc2ff388 94 static uint8_t end_flag = 1;
mgottscho 0:8d34cc2ff388 95
mgottscho 0:8d34cc2ff388 96 static uint8_t SliderPercentegePosition[2] = {NO_TOUCH,NO_TOUCH};
mgottscho 0:8d34cc2ff388 97 static uint8_t SliderDistancePosition[2] = {NO_TOUCH,NO_TOUCH};
mgottscho 0:8d34cc2ff388 98 static uint32_t AbsolutePercentegePosition = NO_TOUCH;
mgottscho 0:8d34cc2ff388 99 static uint32_t AbsoluteDistancePosition = NO_TOUCH;
mgottscho 0:8d34cc2ff388 100
mgottscho 0:8d34cc2ff388 101 static void tsi_irq();
mgottscho 0:8d34cc2ff388 102
mgottscho 0:8d34cc2ff388 103 TSISensor::TSISensor() {
mgottscho 0:8d34cc2ff388 104 SIM->SCGC5 |= SIM_SCGC5_PORTB_MASK;
mgottscho 0:8d34cc2ff388 105 SIM->SCGC5 |= SIM_SCGC5_TSI_MASK;
mgottscho 0:8d34cc2ff388 106
mgottscho 0:8d34cc2ff388 107 TSI0->GENCS |= (TSI_GENCS_ESOR_MASK
mgottscho 0:8d34cc2ff388 108 | TSI_GENCS_MODE(0)
mgottscho 0:8d34cc2ff388 109 | TSI_GENCS_REFCHRG(4)
mgottscho 0:8d34cc2ff388 110 | TSI_GENCS_DVOLT(0)
mgottscho 0:8d34cc2ff388 111 | TSI_GENCS_EXTCHRG(7)
mgottscho 0:8d34cc2ff388 112 | TSI_GENCS_PS(4)
mgottscho 0:8d34cc2ff388 113 | TSI_GENCS_NSCN(11)
mgottscho 0:8d34cc2ff388 114 | TSI_GENCS_TSIIEN_MASK
mgottscho 0:8d34cc2ff388 115 | TSI_GENCS_STPE_MASK
mgottscho 0:8d34cc2ff388 116 );
mgottscho 0:8d34cc2ff388 117
mgottscho 0:8d34cc2ff388 118 TSI0->GENCS |= TSI_GENCS_TSIEN_MASK;
mgottscho 0:8d34cc2ff388 119
mgottscho 0:8d34cc2ff388 120 NVIC_SetVector(TSI0_IRQn, (uint32_t)&tsi_irq);
mgottscho 0:8d34cc2ff388 121 NVIC_EnableIRQ(TSI0_IRQn);
mgottscho 0:8d34cc2ff388 122
mgottscho 0:8d34cc2ff388 123 selfCalibration();
mgottscho 0:8d34cc2ff388 124 }
mgottscho 0:8d34cc2ff388 125
mgottscho 0:8d34cc2ff388 126 void TSISensor::selfCalibration(void)
mgottscho 0:8d34cc2ff388 127 {
mgottscho 0:8d34cc2ff388 128 unsigned char cnt;
mgottscho 0:8d34cc2ff388 129 unsigned char trigger_backup;
mgottscho 0:8d34cc2ff388 130
mgottscho 0:8d34cc2ff388 131 TSI0->GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
mgottscho 0:8d34cc2ff388 132 TSI0->GENCS &= ~TSI_GENCS_TSIEN_MASK; // Disable TSI module
mgottscho 0:8d34cc2ff388 133
mgottscho 0:8d34cc2ff388 134 if(TSI0->GENCS & TSI_GENCS_STM_MASK) // Back-up TSI Trigger mode from Application
mgottscho 0:8d34cc2ff388 135 trigger_backup = 1;
mgottscho 0:8d34cc2ff388 136 else
mgottscho 0:8d34cc2ff388 137 trigger_backup = 0;
mgottscho 0:8d34cc2ff388 138
mgottscho 0:8d34cc2ff388 139 TSI0->GENCS &= ~TSI_GENCS_STM_MASK; // Use SW trigger
mgottscho 0:8d34cc2ff388 140 TSI0->GENCS &= ~TSI_GENCS_TSIIEN_MASK; // Enable TSI interrupts
mgottscho 0:8d34cc2ff388 141
mgottscho 0:8d34cc2ff388 142 TSI0->GENCS |= TSI_GENCS_TSIEN_MASK; // Enable TSI module
mgottscho 0:8d34cc2ff388 143
mgottscho 0:8d34cc2ff388 144 for(cnt=0; cnt < total_electrode; cnt++) // Get Counts when Electrode not pressed
mgottscho 0:8d34cc2ff388 145 {
mgottscho 0:8d34cc2ff388 146 TSI0->DATA = ((elec_array[cnt] << TSI_DATA_TSICH_SHIFT) );
mgottscho 0:8d34cc2ff388 147 TSI0->DATA |= TSI_DATA_SWTS_MASK;
mgottscho 0:8d34cc2ff388 148 while(!(TSI0->GENCS & TSI_GENCS_EOSF_MASK));
mgottscho 0:8d34cc2ff388 149 TSI0->GENCS |= TSI_GENCS_EOSF_MASK;
mgottscho 0:8d34cc2ff388 150 gu16Baseline[cnt] = (TSI0->DATA & TSI_DATA_TSICNT_MASK);
mgottscho 0:8d34cc2ff388 151 }
mgottscho 0:8d34cc2ff388 152
mgottscho 0:8d34cc2ff388 153 TSI0->GENCS &= ~TSI_GENCS_TSIEN_MASK; // Disable TSI module
mgottscho 0:8d34cc2ff388 154 TSI0->GENCS |= TSI_GENCS_TSIIEN_MASK; // Enale TSI interrupt
mgottscho 0:8d34cc2ff388 155 if(trigger_backup) // Restore trigger mode
mgottscho 0:8d34cc2ff388 156 TSI0->GENCS |= TSI_GENCS_STM_MASK;
mgottscho 0:8d34cc2ff388 157 else
mgottscho 0:8d34cc2ff388 158 TSI0->GENCS &= ~TSI_GENCS_STM_MASK;
mgottscho 0:8d34cc2ff388 159
mgottscho 0:8d34cc2ff388 160 TSI0->GENCS |= TSI_GENCS_TSIEN_MASK; // Enable TSI module
mgottscho 0:8d34cc2ff388 161
mgottscho 0:8d34cc2ff388 162 TSI0->DATA = ((elec_array[0]<<TSI_DATA_TSICH_SHIFT) );
mgottscho 0:8d34cc2ff388 163 TSI0->DATA |= TSI_DATA_SWTS_MASK;
mgottscho 0:8d34cc2ff388 164 }
mgottscho 0:8d34cc2ff388 165
mgottscho 0:8d34cc2ff388 166 void TSISensor::sliderRead(void ) {
mgottscho 0:8d34cc2ff388 167 if(end_flag) {
mgottscho 0:8d34cc2ff388 168 end_flag = 0;
mgottscho 0:8d34cc2ff388 169 if((gu16Delta[0] > gu16Threshold[0])||(gu16Delta[1] > gu16Threshold[1])) {
mgottscho 0:8d34cc2ff388 170 SliderPercentegePosition[0] = (gu16Delta[0]*100)/(gu16Delta[0]+gu16Delta[1]);
mgottscho 0:8d34cc2ff388 171 SliderPercentegePosition[1] = (gu16Delta[1]*100)/(gu16Delta[0]+gu16Delta[1]);
mgottscho 0:8d34cc2ff388 172 SliderDistancePosition[0] = (SliderPercentegePosition[0]* SLIDER_LENGTH)/100;
mgottscho 0:8d34cc2ff388 173 SliderDistancePosition[1] = (SliderPercentegePosition[1]* SLIDER_LENGTH)/100;
mgottscho 0:8d34cc2ff388 174 AbsolutePercentegePosition = ((100 - SliderPercentegePosition[0]) + SliderPercentegePosition[1])/2;
mgottscho 0:8d34cc2ff388 175 AbsoluteDistancePosition = ((SLIDER_LENGTH - SliderDistancePosition[0]) + SliderDistancePosition[1])/2;
mgottscho 0:8d34cc2ff388 176 } else {
mgottscho 0:8d34cc2ff388 177 SliderPercentegePosition[0] = NO_TOUCH;
mgottscho 0:8d34cc2ff388 178 SliderPercentegePosition[1] = NO_TOUCH;
mgottscho 0:8d34cc2ff388 179 SliderDistancePosition[0] = NO_TOUCH;
mgottscho 0:8d34cc2ff388 180 SliderDistancePosition[1] = NO_TOUCH;
mgottscho 0:8d34cc2ff388 181 AbsolutePercentegePosition = NO_TOUCH;
mgottscho 0:8d34cc2ff388 182 AbsoluteDistancePosition = NO_TOUCH;
mgottscho 0:8d34cc2ff388 183 }
mgottscho 0:8d34cc2ff388 184 }
mgottscho 0:8d34cc2ff388 185 }
mgottscho 0:8d34cc2ff388 186
mgottscho 0:8d34cc2ff388 187 float TSISensor::readPercentage() {
mgottscho 0:8d34cc2ff388 188 sliderRead();
mgottscho 0:8d34cc2ff388 189 return (float)AbsolutePercentegePosition/100.0;
mgottscho 0:8d34cc2ff388 190 }
mgottscho 0:8d34cc2ff388 191
mgottscho 0:8d34cc2ff388 192 uint8_t TSISensor::readDistance() {
mgottscho 0:8d34cc2ff388 193 sliderRead();
mgottscho 0:8d34cc2ff388 194 return AbsoluteDistancePosition;
mgottscho 0:8d34cc2ff388 195 }
mgottscho 0:8d34cc2ff388 196
mgottscho 0:8d34cc2ff388 197 static void changeElectrode(void)
mgottscho 0:8d34cc2ff388 198 {
mgottscho 0:8d34cc2ff388 199 int16_t u16temp_delta;
mgottscho 0:8d34cc2ff388 200
mgottscho 0:8d34cc2ff388 201 gu16TSICount[ongoing_elec] = (TSI0->DATA & TSI_DATA_TSICNT_MASK); // Save Counts for current electrode
mgottscho 0:8d34cc2ff388 202 u16temp_delta = gu16TSICount[ongoing_elec] - gu16Baseline[ongoing_elec]; // Obtains Counts Delta from callibration reference
mgottscho 0:8d34cc2ff388 203 if(u16temp_delta < 0)
mgottscho 0:8d34cc2ff388 204 gu16Delta[ongoing_elec] = 0;
mgottscho 0:8d34cc2ff388 205 else
mgottscho 0:8d34cc2ff388 206 gu16Delta[ongoing_elec] = u16temp_delta;
mgottscho 0:8d34cc2ff388 207
mgottscho 0:8d34cc2ff388 208 //Change Electrode to Scan
mgottscho 0:8d34cc2ff388 209 if(total_electrode > 1)
mgottscho 0:8d34cc2ff388 210 {
mgottscho 0:8d34cc2ff388 211 if((total_electrode-1) > ongoing_elec)
mgottscho 0:8d34cc2ff388 212 ongoing_elec++;
mgottscho 0:8d34cc2ff388 213 else
mgottscho 0:8d34cc2ff388 214 ongoing_elec = 0;
mgottscho 0:8d34cc2ff388 215
mgottscho 0:8d34cc2ff388 216 TSI0->DATA = ((elec_array[ongoing_elec]<<TSI_DATA_TSICH_SHIFT) );
mgottscho 0:8d34cc2ff388 217 TSI0->DATA |= TSI_DATA_SWTS_MASK;
mgottscho 0:8d34cc2ff388 218 }
mgottscho 0:8d34cc2ff388 219 }
mgottscho 0:8d34cc2ff388 220
mgottscho 0:8d34cc2ff388 221 void tsi_irq(void)
mgottscho 0:8d34cc2ff388 222 {
mgottscho 0:8d34cc2ff388 223 end_flag = 1;
mgottscho 0:8d34cc2ff388 224 TSI0->GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
mgottscho 0:8d34cc2ff388 225 changeElectrode();
mgottscho 0:8d34cc2ff388 226 }