Working on rewriting how we acquire data from LTC chip and sending all temp data over serial for python logging
Fork of TCTF_Control_Main by
Diff: main.cpp
- Revision:
- 9:1cada1fe4743
- Parent:
- 8:dbf8bd4815f8
- Child:
- 13:604e6933366f
--- a/main.cpp Wed Mar 28 01:25:07 2018 +0000 +++ b/main.cpp Mon May 07 03:38:15 2018 +0000 @@ -9,29 +9,29 @@ //DEFINITIVE VARIABLES #define DEBUG 0 -#define DEBUG1 1 -#define DEBUG2 1 +#define DEBUG1 0 +#define DEBUG2 0 #define DEBUG3 1 #define CHN_COUNT 8 -#define MIN_TEMP 15 -#define MAX_TEMP 60 -#define TEMP_MARGIN 5 +#define MIN_TEMP 10 +#define MAX_TEMP 65 +#define TEMP_MARGIN 20 #define HYST_LOW 0.3 -#define HYST_HIGH 1 +#define HYST_HIGH 1.5 #define SAMPLES 5 #define I2C_Freq 2000 #define VALVE 1 #define HEATER 2 #define STATUS_GOOD 3 -#define STATUS_BAD 4 +#define STATUS_BAD 0 #define sizeLUT 34 -#define FRONT_THERM 0 -#define BACK_THERM 1 +#define BACK_THERM 0 +#define FRONT_THERM 1 #define HEAT_FET_AMP 2 #define VALVE_FET_AMP 3 #define FET_ON_CURRENT 1.12 -#define ROOM_TEMP 22 - +#define ROOM_TEMP 22 + // Defines for use with Serial communication #pragma pack (1) #define RX_SOF 0x7B @@ -43,6 +43,8 @@ #define SELECT_CHANNEL 0xB1 #define CMD_RESPONSE 0xD0 #define CMD_DATA 0xD1 +#define ERROR_DATA 0xD2 + unsigned int chanSel_SendTemp = 0; unsigned int chanSel_SetTemp = 0; @@ -50,6 +52,7 @@ int currChan = 0; bool newTempSet = false; + //*********************************************** // Serial Rx Packet Format //*********************************************** @@ -93,22 +96,6 @@ }; CHNL_DATA chnlStatus[] = { - /*TOP{1, 61, 0}, - {1, 61, 0}, - {1, 51, 0}, - {1, 51, 0}, - {1, 61, 0}, - {1, 61, 0}, - {1, 51, 0}, - {1, 51, 0},*/ - {1, 42, 0}, - {1, 41, 0}, - {1, 31, 0}, - {1, 31, 0}, - {1, 41, 0}, - {1, 41, 0}, - {1, 31, 0}, - {1, 31, 0}, {0, NULL, 0}, {0, NULL, 0}, {0, NULL, 0}, @@ -149,7 +136,14 @@ {0, NULL, 0}, {0, NULL, 0}, {0, NULL, 0}, - {0, NULL, 0}, + {0, NULL, 0}, + {0, NULL, 0}, + {0, NULL, 0}, + {0, NULL, 0}, + {0, NULL, 0}, + {0, NULL, 0}, + {0, NULL, 0}, + {0, NULL, 0}, }; @@ -207,7 +201,7 @@ {0x6F, 0x5C}, {0x20, 0x1B}, {0x50, 0x6B}, - {0x40, 0x7B}, + {0x40, 0x7B}, }; //THERMISTOR LOOK UP TABLE, CREATED IN EXCEL SHEET (COUNT, TEMP) @@ -260,13 +254,13 @@ DigitalOut myled(LED2); //I2C FOR MCP23008 (I/O Control) -MCP23008 io_control(PTC9, PTC8, 0x10, 400000); //sda, scl +MCP23008 io_control(PTC9, PTC8, 0x10, 100000); //sda, scl //I2C FOR LTC2487 (ADC Control) -LTC2487 ltc2487(PTC11, PTC10, 0x23, 200000); //sda, scl +LTC2487 ltc2487(PTC11, PTC10, 0x23, 100000); //sda, scl //GLOBAL VARIABLES -volatile bool dataReceived = false; //used to check if data has been recieved +volatile bool dataReceived = false; //used to check if data has been received volatile bool dataTxReady = false; char rxBuf[50]; int chnlSel; @@ -318,9 +312,9 @@ /* Function: parseRXData ************************************************************** - Description: The parse recieved data into - Recieves: N/A - Returns: N/A + Description: The parse received data into + Receives: chn: The channel we want to put into the channel + Returns: N/A */ void parseRXData() @@ -361,6 +355,7 @@ chanSel_SetTemp = pRxPkt->chanID; chnlStatus[pRxPkt->chanID].status = pRxPkt->chanStat; chnlStatus[pRxPkt->chanID].setTemp = pRxPkt->setTemp; + chnlStatus[pRxPkt->chanID].error = 0; newTempSet = true; } } @@ -385,12 +380,10 @@ } } - - /* Function: get_temp ************************************************************** Description: Retrieve data from thermistor - Recieves: chn: the channel of the fixture to read temp. from + Receives: chn: the channel of the fixture to read temp. from port: the I/O channel to read Returns: the temperature of the fixture (front or back) */ @@ -398,37 +391,34 @@ float get_temp(int chn, int port){ myled = 1; ltc2487.setAddress(addrLUT[chn].adc); - + float ADC_val = ltc2487.readOutput(port); //(65536*1.334)/2.5 - + int i = 0; - + while((i < sizeLUT) && (thermLUT[i].adc > ADC_val)){ - i++; + i++; } //find the temp. above therm temp - - //Point slope formula extrapolation: + + //Point slope formula extrapolation: // y1 = m (x1-x0)+ y0 , y = temp. value, x = adc value // y1 = thermLUT[i-1].temp y0 = thermLUT[i].temp // x1 = thermLUT[i-1].adc x0 =thermLUT[i].adc float a = float(thermLUT[i-1].temp - thermLUT[i].temp); //slope of temp between points where therm temp is between (Tmax - Tmin) float b = float(thermLUT[i-1].adc - thermLUT[i].adc); //slope of adc between points where therm adc is between (Amax - Amin) - + float m = a/b; float y = (m*(ADC_val-thermLUT[i].adc))+thermLUT[i].temp; - - if(DEBUG2) pc.printf("CHNL: %i PORT: %i ADC VAL: %f TEMP: %f \r\n", chn, port, ADC_val, y); - - //if(chn == chnlSel) - pc.printf("%f \r\n", y); - - return y; + + if(DEBUG2) pc.printf("DBG: CHAN: %i PORT: %i ADC VAL: %f TEMP: %f \r\n", chn, port, ADC_val, y); + + return y; } /* Function: get_heater_current ************************************************************** Description: Retrieve current into heater control MOSFET - Recieves: chn: the channel of the fixture to read current from + Receives: chn: the channel of the fixture to read current from Returns: the current into the heater control MOSFET */ @@ -439,7 +429,7 @@ /* Function: get_valve_current ************************************************************** Description: Retrieve current into valve control MOSFET - Recieves: chn: the channel of the fixture to read current from + Receives: chn: the channel of the fixture to read current from Returns: the current into the valve control MOSFET */ @@ -450,7 +440,7 @@ /* Function: turn_valve_on ************************************************************** Description: Turn valve on and green status LED on - Recieves: chn: the channel of the fixture + Receives: chn: the channel of the fixture Returns: N/A */ @@ -463,7 +453,7 @@ /* Function: turn_valve_off ************************************************************** Description: Turn valve off and green status LED on - Recieves: chn: the channel of the fixture + Receives: chn: the channel of the fixture Returns: N/A */ @@ -476,7 +466,7 @@ /* Function: turn_heater_on ************************************************************** Description: Turn heater on and green status LED on - Recieves: chn: the channel of the fixture + Receives: chn: the channel of the fixture Returns: N/A */ @@ -489,7 +479,7 @@ /* Function: turn_heater_off ************************************************************** Description: Turn heater off and green status LED on - Recieves: chn: the channel of the fixture + Receives: chn: the channel of the fixture Returns: N/A */ @@ -502,7 +492,7 @@ /* Function: status_led ************************************************************** Description: Turn status LED on (turns on green or red) - Recieves: chn: the channel of the fixture + Receives: chn: the channel of the fixture status: the status of channel (good (1) or bad (0)) Returns: N/A */ @@ -521,7 +511,7 @@ /* Function: test_mcp23008 ************************************************************** Description: Test each output of the MCP23009 - Recieves: N/A + Receives: N/A Returns: N/A */ @@ -542,7 +532,7 @@ /* Function: test_ltc2487 ************************************************************** Description: Test the reading from LTC2487 - Recieves: N/A + Receives: N/A Returns: N/A */ @@ -568,38 +558,38 @@ void error_check(int chn, float frontTemp, float backTemp, float valveFet, float heaterFet){ float setTemp = chnlStatus[chn].setTemp; - + //CHECK IF THERMISTOR READINGS ARE OFF (> 5 DEGREES) if(abs(frontTemp-backTemp) > 5){ //ERROR 6: Thermistor reading off chnlStatus[chn].error = 1; - } - + } + //CHECK IF HEATER'S STUCK ON OR CELL OVERHEATING if((frontTemp >= (setTemp+TEMP_MARGIN)) || (backTemp >= (setTemp+TEMP_MARGIN))){ //ERROR 0 chnlStatus[chn].error = 1; status_led(chn, STATUS_BAD); if(heaterFet >= FET_ON_CURRENT){ - //ERROR 1: Heater FET stuck on + //ERROR 1: Heater FET stuck on } if(valveFet <= FET_ON_CURRENT){ - //ERROR 2: valve FET stuck off + //ERROR 2: valve FET stuck off } } - + //CHECK IF VALVE STUCK ON OR CELL OVERHEATING if((frontTemp <= (setTemp-TEMP_MARGIN)) || (backTemp <= (setTemp-TEMP_MARGIN))){ //ERROR 0 chnlStatus[chn].error = 1; status_led(chn, STATUS_BAD); if(heaterFet <= FET_ON_CURRENT){ - //ERROR 2: Heater FET stuck off + //ERROR 2: Heater FET stuck off } else if(valveFet >= FET_ON_CURRENT){ - //ERROR 3: Chiller FET stuck on + //ERROR 3: Chiller FET stuck on } - } + } } //*************************************************************** @@ -624,16 +614,36 @@ pc.printf("\n"); } +//*************************************************************** +// Build packet with errors to send to GUI +//*************************************************************** +void sendError (int chan, float error) +{ + RESPONSE_CMD response; + unsigned char *ptr = (unsigned char *)&response; + int i; + + response.SOF_flag = TX_SOF; + response.cmd_type = ERROR_DATA; + response.len = 9; + response.Delim = DELIMETER; + response.data = (float)error; + response.EOF_flag = TX_EOF; + + // Send response to GUI + for (i=0; i < response.len; i++, ptr++) + pc.printf("%02x", *ptr); + pc.printf("\n"); +} /*************************************************************/ /* MAIN FUNCTION */ /*************************************************************/ +int main() { -int main() { - - Timer t; + Timer t; // Setup serial port // Look for RX_EOF @@ -642,76 +652,77 @@ pc.attach(&rxInterrupt, MODSERIAL::RxAutoDetect); myled = 1; - rLed = 0; - gLed = 1; - + rLed = 1; + gLed = 0; + t.start(); - + while(1) { - if(DEBUG3) pc.printf("THE PROGRAM STARTED \r\n"); - + + if(DEBUG3) + pc.printf("DBG: PROGRAM STARTED \r\n"); + for(int chnl = 0; chnl < CHN_COUNT; chnl++){ float currentTempFront = get_temp(chnl, FRONT_THERM); + wait(0.08); float currentTempBack = get_temp(chnl, BACK_THERM); - float valveCurrent = get_valve_current(chnl, VALVE_FET_AMP); - float heaterCurrent = get_heater_current(chnl, HEAT_FET_AMP); + //float valveCurrent = get_valve_current(chnl, VALVE_FET_AMP); + //float heaterCurrent = get_heater_current(chnl, HEAT_FET_AMP); float currentTemp = currentTempFront; - if(currentTempFront >= currentTempBack){ - currentTemp = currentTempFront; - } - else{ - currentTemp = currentTempBack; - } - - //float currentTemp = (currentTempFront + currentTempBack)/2; - + //currentTemp = currentTempFront; + currentTemp = currentTempBack; + //check if we received data/need to update TCTF data if(dataReceived){ dataReceived = false; - //pc.printf("DBG: %d bytes Rx'd\n", pc.rxBufferGetCount()); + pc.printf("DBG: %d bytes Rx'd\n", pc.rxBufferGetCount()); pc.move(rxBuf, 50); parseRXData(); pc.rxBufferFlush(); + } - } - if (chnl == chanSel_SendTemp){ - // Send temp readings for selected chan to GUI + //Send temp readings for selected chan to GUI sendTempReadings(currChan, currentTemp); } - + //CONTROL LOOP: if(chnlStatus[chnl].status == 1){ - if(DEBUG3) pc.printf("TEMP: %f \r\n", currentTempFront); + if(DEBUG3) pc.printf("DBG: [%d] Temp: F: %f B: %f\r\n", chnl, currentTempFront, currentTempBack); //Error check on fixture //error_check(chnl, currentTempFront, currentTempBack, valveCurrent, heaterCurrent); - if((currentTempFront >= 70) || (currentTempBack >= 70)){ - status_led(chnl, STATUS_BAD); + if(((currentTempFront >= MAX_TEMP) && (currentTempBack >= MAX_TEMP)) || + ((currentTempFront == 0) || (currentTempBack == 0))|| + (abs(currentTempBack - currentTempFront) >= TEMP_MARGIN)|| + ((currentTempFront <= MIN_TEMP) && (currentTempBack <= MIN_TEMP))){ + status_led(chnl, STATUS_BAD); + sendError(chnl, 1); + chnlStatus[chnl].error = 1; } if(chnlStatus[chnl].error == 0){ - if((currentTemp > ((chnlStatus[chnl].setTemp)+HYST_HIGH))){ - if(DEBUG3) pc.printf("CHILLER ON \r\n"); + if(currentTemp > ((chnlStatus[chnl].setTemp)+HYST_HIGH)){ + if(DEBUG3) pc.printf("DBG: [%d] Chiller ON \r\n", chnl); //Turn chiller on - turn_valve_on(chnl); + turn_valve_on(chnl); } else if (currentTemp < ((chnlStatus[chnl].setTemp)-HYST_LOW)){ - if(DEBUG3) pc.printf("HEATER ON \r\n"); + if(DEBUG3) pc.printf("DBG: [%d] Heater ON \r\n", chnl); //Turn heater on turn_heater_on(chnl); } else{ - if(DEBUG3) pc.printf("ALL OFF \r\n"); + if(DEBUG3) pc.printf("DBG: [%d] All OFF \r\n", chnl); //turn off chiller turn_valve_off(chnl); - //turn off heater + //turn off heater turn_heater_off(chnl); //turn on green LED status light - status_led(chnl, 1); - } - } + status_led(chnl, 1); + } + } } } } -} +} \ No newline at end of file