Sami Kanderian / Mbed 2 deprecated AnalogInDataLogger

Dependencies:   mbed

Fork of TestAnalogInPins by Sami Kanderian

Committer:
skanderian
Date:
Thu Jan 19 15:32:08 2017 +0000
Revision:
9:4b45cc112a16
Parent:
8:c06ce18ad746
Child:
10:7e91529ec75f
Fixed pin#s

Who changed what in which revision?

UserRevisionLine numberNew contents of line
skanderian 3:3b45e830ebe1 1 /*TestAnalogInPins: written by Sami Kanderian, last updated on 11 May 2016. It continuously reads
skanderian 3:3b45e830ebe1 2 and prints 16 Analog Input Pin voltages on the NPX Freescale FRDM-KL25Z microprocessor board via
skanderian 5:b98a0f60f700 3 serial inputs registered via an RX Interrupt trigger that changes the value of charCCIn, where
skanderian 3:3b45e830ebe1 4 charCCIn goes from '00' to '16'. charCCIn should be preceeded by a '#'. Serial baud rate is 9600.
skanderian 4:9e93bf4863cb 5 The data acquisition rate whereby voltage readings are updated is defined by the variable updatePeriodMs.
skanderian 3:3b45e830ebe1 6
skanderian 3:3b45e830ebe1 7 Serial inputs followed by Carriage Return:
skanderian 3:3b45e830ebe1 8 '#00': print analog input voltages on all pins (deafault printout on startup)
skanderian 3:3b45e830ebe1 9 '#01': print analog input voltage on pin PTE20
skanderian 7:78e7984909f4 10 '#02': print analog input voltage on pin PTB0
skanderian 8:c06ce18ad746 11 '#03': print analog input voltage on pin PTB1
skanderian 8:c06ce18ad746 12 '#04': print analog input voltage on pin PTE22
skanderian 8:c06ce18ad746 13 '#05': print analog input voltage on pin PTB2
skanderian 8:c06ce18ad746 14 '#06': print analog input voltage on pin PTE23
skanderian 8:c06ce18ad746 15 '#07': print analog input voltage on pin PTB3
skanderian 8:c06ce18ad746 16 '#08': print analog input voltage on pin PTE29
skanderian 8:c06ce18ad746 17 '#09': print analog input voltage on pin PTC2
skanderian 8:c06ce18ad746 18 '#10': print analog input voltage on pin PTE30
skanderian 8:c06ce18ad746 19 '#11': print analog input voltage on pin PTC1
skanderian 8:c06ce18ad746 20 '#12': print analog input voltage on pin PTC0
skanderian 8:c06ce18ad746 21 '#13': print analog input voltage on pin PTD5
skanderian 8:c06ce18ad746 22 '#14': print analog input voltage on pin PTD6
skanderian 3:3b45e830ebe1 23 */
skanderian 3:3b45e830ebe1 24
skanderian 0:ce79b04fc2ca 25 #include "mbed.h"
skanderian 6:214e2180c586 26 #define MAXINT 2147483647
skanderian 0:ce79b04fc2ca 27 //Declare hardware inputs
skanderian 3:3b45e830ebe1 28 Serial serial(USBTX, USBRX);
skanderian 0:ce79b04fc2ca 29 Timer timer;
skanderian 2:f2583b56777e 30
skanderian 8:c06ce18ad746 31 //IMPORTANT NOTE: PTA1 and PTA2 ARE RESERVED FOR SERIAL COMMUNICATION VIA SDA USB!!! DO NOT USE FOR SENSOR/ACTUATOR I/O!!! PTD1 IS USED FOR ON BOARD LED
skanderian 8:c06ce18ad746 32 //PTE21 should be 16 bit ADC but doesnt work as ADC on mbed. Instead PTE21 reads whatever analog reading is input to PTE29
skanderian 2:f2583b56777e 33 //Analog inputs : 0-3.3V
skanderian 3:3b45e830ebe1 34 AnalogIn pin1(PTE20);//works as 16 bit ADC
skanderian 3:3b45e830ebe1 35 AnalogIn pin2(PTB0); //works as 12 bit ADC
skanderian 8:c06ce18ad746 36 AnalogIn pin3(PTB1); //works as 12 bit ADC
skanderian 8:c06ce18ad746 37 AnalogIn pin4(PTE22);//works as 12 bit ADC
skanderian 8:c06ce18ad746 38 AnalogIn pin5(PTB2);//works as 12 bit ADC
skanderian 8:c06ce18ad746 39 AnalogIn pin6(PTE23);//works as 12 bit ADC
skanderian 8:c06ce18ad746 40 AnalogIn pin7(PTB3); //works as 12 bit ADC
skanderian 8:c06ce18ad746 41 AnalogIn pin8(PTE29);//works as 12 bit ADC
skanderian 8:c06ce18ad746 42 AnalogIn pin9(PTC2);//works as 12 bit ADC
skanderian 8:c06ce18ad746 43 AnalogIn pin10(PTE30);//works as 12 bit ADC
skanderian 8:c06ce18ad746 44 AnalogIn pin11(PTC1);//works as 12 bit ADC
skanderian 8:c06ce18ad746 45 AnalogIn pin12(PTC0);//works as 12 bit ADC
skanderian 8:c06ce18ad746 46 AnalogIn pin13(PTD5);//works as 12 bit ADC
skanderian 8:c06ce18ad746 47 AnalogIn pin14(PTD6);//works as 12 bit ADC
skanderian 2:f2583b56777e 48
skanderian 2:f2583b56777e 49 //Built in LEDs
skanderian 2:f2583b56777e 50 PwmOut rLed(LED_RED);
skanderian 2:f2583b56777e 51 PwmOut gLed(LED_GREEN);
skanderian 2:f2583b56777e 52 PwmOut bLed(LED_BLUE);
skanderian 2:f2583b56777e 53
skanderian 2:f2583b56777e 54 //New globals for RxInterrupt routine
skanderian 2:f2583b56777e 55 const int bufferSize = 256;
skanderian 2:f2583b56777e 56 char rxBuffer[bufferSize];
skanderian 2:f2583b56777e 57 char txBuffer[bufferSize];
skanderian 2:f2583b56777e 58 volatile int rxIn = 0;
skanderian 2:f2583b56777e 59 volatile int rxOut = 0;
skanderian 2:f2583b56777e 60 bool rxFlag = 0;
skanderian 0:ce79b04fc2ca 61
skanderian 3:3b45e830ebe1 62 //other globals
skanderian 6:214e2180c586 63 char charCCIn[3];
skanderian 8:c06ce18ad746 64 int decCCIn=0; //by default, output all analog pins on startup
skanderian 3:3b45e830ebe1 65 int updatePeriodMs = 1000;
skanderian 2:f2583b56777e 66
skanderian 2:f2583b56777e 67 void ledConfirmSent()//Light up blue LED 10%
skanderian 2:f2583b56777e 68 {
skanderian 2:f2583b56777e 69 rLed = 1;
skanderian 2:f2583b56777e 70 gLed = 1;
skanderian 2:f2583b56777e 71 bLed = 0.9;
skanderian 2:f2583b56777e 72 }
skanderian 2:f2583b56777e 73
skanderian 2:f2583b56777e 74 void ledConfirmReceive()//Light up green LED 10%
skanderian 2:f2583b56777e 75 {
skanderian 2:f2583b56777e 76 rLed = 1;
skanderian 2:f2583b56777e 77 gLed = 0.9;
skanderian 2:f2583b56777e 78 bLed = 1;
skanderian 2:f2583b56777e 79 }
skanderian 0:ce79b04fc2ca 80
skanderian 3:3b45e830ebe1 81 void sendAnalogIn(int pinNum) //send Analog input in V.
skanderian 3:3b45e830ebe1 82 //Pin inputs are normalized to have a max value of 1 so a 3.3 multiplier is used to convert back to voltage
skanderian 6:214e2180c586 83 {
skanderian 2:f2583b56777e 84 if (pinNum == 0 || pinNum == 1) {
skanderian 3:3b45e830ebe1 85 serial.printf("%s%03.1f%s\r\n", "#PTE20: ", 3.3f*pin1.read(), "V");
skanderian 2:f2583b56777e 86 }
skanderian 2:f2583b56777e 87 if (pinNum == 0 || pinNum == 2) {
skanderian 3:3b45e830ebe1 88 serial.printf("%s%03.1f%s\r\n", "#PTB0: ", 3.3f*pin2.read(), "V");
skanderian 8:c06ce18ad746 89 }
skanderian 2:f2583b56777e 90 if (pinNum == 0 || pinNum == 3) {
skanderian 9:4b45cc112a16 91 serial.printf("%s%03.1f%s\r\n", "#PTB1: ", 3.3f*pin3.read(), "V");
skanderian 2:f2583b56777e 92 }
skanderian 2:f2583b56777e 93 if (pinNum == 0 || pinNum == 4) {
skanderian 9:4b45cc112a16 94 serial.printf("%s%03.1f%s\r\n", "#PTE22: ", 3.3f*pin4.read(), "V");
skanderian 2:f2583b56777e 95 }
skanderian 8:c06ce18ad746 96 if (pinNum == 0 || pinNum == 5) {
skanderian 9:4b45cc112a16 97 serial.printf("%s%03.1f%s\r\n", "#PTB2: ", 3.3f*pin5.read(), "V");
skanderian 8:c06ce18ad746 98 }
skanderian 2:f2583b56777e 99 if (pinNum == 0 || pinNum == 6) {
skanderian 9:4b45cc112a16 100 serial.printf("%s%03.1f%s\r\n", "#PTE23: ", 3.3f*pin6.read(), "V");
skanderian 2:f2583b56777e 101 }
skanderian 2:f2583b56777e 102 if (pinNum == 0 || pinNum == 7) {
skanderian 9:4b45cc112a16 103 serial.printf("%s%03.1f%s\r\n", "#PTB3: ", 3.3f*pin7.read(), "V");
skanderian 2:f2583b56777e 104 }
skanderian 2:f2583b56777e 105 if (pinNum == 0 || pinNum == 8) {
skanderian 9:4b45cc112a16 106 serial.printf("%s%03.1f%s\r\n", "#PTE29: ", 3.3f*pin8.read(), "V");
skanderian 2:f2583b56777e 107 }
skanderian 8:c06ce18ad746 108 if (pinNum == 0 || pinNum == 9) {
skanderian 9:4b45cc112a16 109 serial.printf("%s%03.1f%s\r\n", "#PTC2: ", 3.3f*pin9.read(), "V");
skanderian 8:c06ce18ad746 110 }
skanderian 2:f2583b56777e 111 if (pinNum == 0 || pinNum == 10) {
skanderian 9:4b45cc112a16 112 serial.printf("%s%03.1f%s\r\n", "#PTE30: ", 3.3f*pin10.read(), "V");
skanderian 2:f2583b56777e 113 }
skanderian 2:f2583b56777e 114 if (pinNum == 0 || pinNum == 11) {
skanderian 9:4b45cc112a16 115 serial.printf("%s%03.1f%s\r\n", "#PTC1: ", 3.3f*pin11.read(), "V");
skanderian 2:f2583b56777e 116 }
skanderian 2:f2583b56777e 117 if (pinNum == 0 || pinNum == 12) {
skanderian 9:4b45cc112a16 118 serial.printf("%s%03.1f%s\r\n", "#PTC0: ", 3.3f*pin12.read(), "V");
skanderian 2:f2583b56777e 119 }
skanderian 2:f2583b56777e 120 if (pinNum == 0 || pinNum == 13) {
skanderian 9:4b45cc112a16 121 serial.printf("%s%03.1f%s\r\n", "#PTD5: ", 3.3f*pin13.read(), "V");
skanderian 2:f2583b56777e 122 }
skanderian 2:f2583b56777e 123 if (pinNum == 0 || pinNum == 14) {
skanderian 9:4b45cc112a16 124 serial.printf("%s%03.1f%s\r\n", "#PTD6: ", 3.3f*pin14.read(), "V");
skanderian 8:c06ce18ad746 125 }
skanderian 2:f2583b56777e 126 ledConfirmSent();
skanderian 0:ce79b04fc2ca 127 }
skanderian 0:ce79b04fc2ca 128
skanderian 6:214e2180c586 129 void runWhenNewSerialIn()
skanderian 6:214e2180c586 130 {
skanderian 3:3b45e830ebe1 131 if (rxBuffer[0] !='#') {
skanderian 3:3b45e830ebe1 132 serial.printf("%s\r\n", "Input format should be '#XX'. First input character should be '#'");
skanderian 8:c06ce18ad746 133 serial.printf("%s\r\n", "followed by XX where XX goes from '00' to '14'");
skanderian 6:214e2180c586 134 }
skanderian 3:3b45e830ebe1 135 for (int i = 0; i < 2; i++) {
skanderian 6:214e2180c586 136 charCCIn[i] = rxBuffer[i+1];
skanderian 2:f2583b56777e 137 }
skanderian 6:214e2180c586 138 decCCIn=strtol(charCCIn,NULL,10);// this line converts char to int
skanderian 3:3b45e830ebe1 139 //decCCIn= 10*((int)(charCCIn[0])-48)+ ((int)(charCCIn[1])-48);// equivalent to line above
skanderian 3:3b45e830ebe1 140 serial.printf("%s%d\r\n", "decCCIn= ",decCCIn);
skanderian 2:f2583b56777e 141 }
skanderian 1:610dc7763656 142
skanderian 6:214e2180c586 143 void Rx_interrupt()
skanderian 6:214e2180c586 144 {
skanderian 2:f2583b56777e 145 // Loop just in case more than one character is in UART's receive FIFO buffer
skanderian 2:f2583b56777e 146 // Stop if buffer full
skanderian 2:f2583b56777e 147 //while ((serial.readable()) && (((rxIn + 1) % bufferSize) != 0)) {
skanderian 2:f2583b56777e 148 while (serial.readable()) {
skanderian 2:f2583b56777e 149 rxBuffer[rxIn] = serial.getc();
skanderian 2:f2583b56777e 150 if (rxBuffer[rxIn] == '\r') { //looking for character not string (string is double quotes) \r is CR, \n is LF
skanderian 2:f2583b56777e 151 rxFlag = 1;
skanderian 2:f2583b56777e 152 //Turn built in LED blue (at half intensity) to confirm command recieved
skanderian 2:f2583b56777e 153 ledConfirmReceive();
skanderian 2:f2583b56777e 154 } else {
skanderian 2:f2583b56777e 155 rxIn = (rxIn + 1) % bufferSize;
skanderian 1:610dc7763656 156 }
skanderian 1:610dc7763656 157 }
skanderian 1:610dc7763656 158 }
skanderian 0:ce79b04fc2ca 159
skanderian 6:214e2180c586 160 int main()
skanderian 6:214e2180c586 161 {
skanderian 2:f2583b56777e 162 serial.baud(9600);
skanderian 2:f2583b56777e 163 serial.attach(&Rx_interrupt, Serial::RxIrq);
skanderian 6:214e2180c586 164 timer.start();
skanderian 6:214e2180c586 165 int startFnTimeUs;
skanderian 6:214e2180c586 166 int lastActionTimeUs=timer.read_us();
skanderian 6:214e2180c586 167
skanderian 6:214e2180c586 168 int updatePeriodUs = updatePeriodMs*1000;
skanderian 0:ce79b04fc2ca 169
skanderian 2:f2583b56777e 170 while (1) {
skanderian 6:214e2180c586 171 startFnTimeUs = timer.read_us();
skanderian 6:214e2180c586 172 if (rxFlag==1) {
skanderian 6:214e2180c586 173 runWhenNewSerialIn();
skanderian 6:214e2180c586 174 rxFlag = 0; //reset flag to listen for next message
skanderian 6:214e2180c586 175 rxIn = 0; //reset position index to 0
skanderian 6:214e2180c586 176 }
skanderian 6:214e2180c586 177 int timeChangeUs = (startFnTimeUs - lastActionTimeUs);
skanderian 6:214e2180c586 178 if (timeChangeUs<0) { //IMPOTRANT!! This handles wrapping of timer when it exceeds MAXINT and goes slightly above zero resulting in a negative timeChangeUs
skanderian 6:214e2180c586 179 timeChangeUs=timeChangeUs + MAXINT +1;
skanderian 6:214e2180c586 180 }
skanderian 6:214e2180c586 181 if (timeChangeUs >= updatePeriodUs) {//Prefer never to use wait in loop in priciple as it hangs processor from doing other tasks when necessary
skanderian 6:214e2180c586 182 //Run sendAnalogIn if elapsed time has passed. New decCCIn is registered with new serial input
skanderian 6:214e2180c586 183 sendAnalogIn(decCCIn);
skanderian 6:214e2180c586 184 lastActionTimeUs=startFnTimeUs;
skanderian 6:214e2180c586 185 }
skanderian 0:ce79b04fc2ca 186 }
skanderian 0:ce79b04fc2ca 187 }