![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
ADC logging with demo drive board for calibration ADC read synchronised with heater on time
Dependencies: mbed MODSERIAL FastPWM ADS8568_ADC
Diff: main.cpp
- Revision:
- 25:f507cfd50fcc
- Parent:
- 24:899071abfc14
- Child:
- 26:323238949f9d
--- a/main.cpp Wed Oct 09 12:46:23 2019 +0000 +++ b/main.cpp Wed Oct 09 17:36:51 2019 +0000 @@ -1,12 +1,13 @@ #include "mbed.h" #include "ADS8568_ADC.h" -#include "FastPWM.h" +// #include "FastPWM.h" #include "MODSERIAL.h" -#define MEAS_DELAY 120 // measurement delay after turning on FET (us) -#define LOG_INTERVAL 5000 // log file interval (ms) +#define MEAS_DELAY 50 // measurement delay after turning on FET (us) +#define LOG_INTERVAL 1000 // log file interval (ms) #define START_DELAY 1000 // pause for startup (ms) #define N_STEPS 100 +#define N_READ 10 #define BUFFER_SIZE 4096 //UID lookup address and pointer @@ -31,9 +32,8 @@ float drive_board_cal[UID_TABLE_LENGTH][2][2] = {{{0.096724353, 10.1817431}, {0.056098807, 10.19962849}}, {{0.0596907336847412, 10.1550084867437}, {0.0320376283698263, 10.2580153464834}}, - // {{0.059473025, 10.14814327}, {0.03200058, 10.25073923}}, - {{0.01887149, 10.39360225}, {0.03115874, 10.28199855}}, - {{0.052545339, 10.06008621}, {0.094239471, 10.11983777}}}; + {{0.01887149, 10.39360225}, {0.03115874, 10.28199855}}, + {{0.052545339, 10.06008621}, {0.094239471, 10.11983777}}}; MODSERIAL pc(PA_9, PA_10, BUFFER_SIZE); //mcu TX, RX, BUFFER_SIZE byte TX and RX buffers ADS8568_ADC adc(PB_15, PB_14, PB_13, PB_12, PC_15, PC_0, PC_1, PC_2, PC_3); @@ -42,16 +42,19 @@ DigitalIn adc_busy(PA_8); //Busy interrupt sig# //Heater Control -FastPWM drive_1(PC_9); -FastPWM drive_2(PC_8); -FastPWM guard_1(PC_7); -FastPWM guard_2(PC_6); +DigitalOut drive_1(PC_9); +DigitalOut drive_2(PC_8); +DigitalOut guard_1(PC_7); +DigitalOut guard_2(PC_6); //Indicator LEDs DigitalOut hb_led(PC_13); //Green DigitalOut led_0(PC_4); //Red DigitalOut led_1(PC_5); //Green +//External LED +DigitalOut led_ext(PB_4); + //User buttons DigitalIn user_0(PB_0); DigitalIn user_1(PB_1); @@ -69,22 +72,29 @@ pc.baud(115200); adc.init(); + // External LED off + led_ext = 0; + // Initialsation - all heaters off - drive_1.prescaler(1); - drive_1.period_ticks(1000); - drive_1.pulsewidth_ticks(0); + drive_1 = 0; + drive_2 = 0; + guard_1 = 0; + guard_2 = 0; +// drive_1.prescaler(1); +// drive_1.period_ticks(1000); +// drive_1.pulsewidth_ticks(0); - guard_1.prescaler(1); - guard_1.period_ticks(1000); - guard_1.pulsewidth_ticks(0); +// guard_1.prescaler(1); +// guard_1.period_ticks(1000); +// guard_1.pulsewidth_ticks(0); - drive_2.prescaler(1); - drive_2.period_ticks(1000); - drive_2.pulsewidth_ticks(0); +// drive_2.prescaler(1); +// drive_2.period_ticks(1000); +// drive_2.pulsewidth_ticks(0); - guard_2.prescaler(1); - guard_2.period_ticks(1000); - guard_2.pulsewidth_ticks(0); +// guard_2.prescaler(1); +// guard_2.period_ticks(1000); +// guard_2.pulsewidth_ticks(0); pc.printf("\r\nUnique ID: %08X %08X %08X \r\n", uid[0], uid[1], uid[2]); int i_board = -1; @@ -105,39 +115,60 @@ wait_ms(START_DELAY); timer.start(); + for (int iDelay = 1; iDelay < 3; iDelay++) { for (int iStep=0; iStep<N_STEPS; iStep++) { eTime = timer.read_ms(); - pc.printf("%5d, %10d,", iStep, eTime); + pc.printf("%5d, %10d,", iDelay, eTime); for (int iHeater=0; iHeater <2; iHeater++) { // measure heater - if (iHeater==0) - drive_1.pulsewidth_ticks(1000); - else - drive_2.pulsewidth_ticks(1000); - wait_us(MEAS_DELAY); + if (iHeater==0) { +// drive_1.pulsewidth_ticks(1000); + drive_1 = 1; + led_0 = 1; + led_1 = 0; + } + else { +// drive_2.pulsewidth_ticks(1000); + drive_2 = 1; + led_0 = 0; + led_1 = 1; + } + + wait_us(MEAS_DELAY*iDelay); - //Start ADC conversion - adc.start_conversion(15); + //Average N_READ ADC cycles + curr[iHeater] = 0; + v[iHeater] = 0; + for (int iRead = 0; iRead<N_READ; iRead++) { + //Start ADC conversion + adc.start_conversion(15); - //Wait until ADC is free - while(adc_busy == 1) { - wait_us(1); - } + //Wait until ADC is free + while(adc_busy == 1) { + wait_us(1); + } + //Get ADC values + adc.read_channels(); + curr[iHeater] += adc.read_channel_result(i_port[iHeater]); + v[iHeater] += adc.read_channel_result(v_port[iHeater]); + } + //Turn off heater if (iHeater==0) - drive_1.pulsewidth_ticks(0); +// drive_1.pulsewidth_ticks(0); + drive_1 = 0; else - drive_2.pulsewidth_ticks(0); - wait_us(MEAS_DELAY); +// drive_2.pulsewidth_ticks(0); + drive_2 = 0; + + + wait_us(MEAS_DELAY*iDelay); - //Get ADC values - adc.read_channels(); - curr[iHeater] = adc.read_channel_result(i_port[iHeater]); - v[iHeater] = adc.read_channel_result(v_port[iHeater]); + //Calculate resistance r_adc[iHeater] = (float)v[iHeater]/(float)curr[iHeater]; if (i_board != -1) r_ohm[iHeater] = drive_board_cal[i_board][iHeater][0] + r_adc[iHeater]*drive_board_cal[i_board][iHeater][1]; @@ -152,8 +183,15 @@ wait_ms(LOG_INTERVAL/2); } - pc.printf("\n"); - + pc.printf("\n"); + } + } + // turn everything off + drive_1 = 0; + drive_2 = 0; + led_0 = 0; + led_1 = 0; + }