![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
ADC logging with demo drive board for calibration
Dependencies: mbed MODSERIAL FastPWM ADS8568_ADC
main.cpp
- Committer:
- justinbuckland
- Date:
- 2019-10-11
- Revision:
- 27:5dcd526d7598
- Parent:
- 26:dd4f3ef421d1
- Child:
- 28:f2585571ce25
- Child:
- 29:ef9e567bed5b
File content as of revision 27:5dcd526d7598:
#include "mbed.h" #include "ADS8568_ADC.h" #include "FastPWM.h" #include "MODSERIAL.h" #define MEAS_DELAY 60 // 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 BUFFER_SIZE 4096 //UID lookup address and pointer #define UID_ADDR 0x1FFF7A10 unsigned long *uid = (unsigned long *) UID_ADDR; //UID and drive board calibration table #define UID_TABLE_LENGTH 4 int drive_board_serial_number[UID_TABLE_LENGTH] = {1, 2, 3, 4}; unsigned long drive_board_uid[UID_TABLE_LENGTH][3] = {{0x005B0060, 0x32375101, 0x32363531}, {0x0051003D, 0x32375114, 0x30333732}, {0x00520060, 0x32375101, 0x32363531}, {0x00570060, 0x32375101, 0x32363531}}; float drive_board_cal[UID_TABLE_LENGTH][2][2] = {{{0.0908347476278717, 10.1921343711427}, {0.0497613470164513, 10.2109327517567}}, {{0.0596907336847412, 10.1550084867437}, {0.0320376283698263, 10.2580153464834}}, {{0.0119648730956925, 10.4065902688349}, {0.0256785142683800, 10.2921134395920}}, {{0.0482969653247984, 10.0688110602909}, {0.0882102280729402, 10.1322703041679}}}; 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); I2C i2c(PB_7, PB_8); //SDA, SCL Timer timer; 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); //Indicator LEDs DigitalOut hb_led(PC_13); //Green DigitalOut led_0(PC_4); //Red DigitalOut led_1(PC_5); //Green //User buttons DigitalIn user_0(PB_0); DigitalIn user_1(PB_1); BusOut converts(PC_0, PC_1, PC_2, PC_3); int main() { int eTime; int v[2], curr[2]; double r_adc[2], r_ohm[2]; int i_port[2] = {0,2}; int v_port[2] = {1,3}; pc.baud(115200); adc.init(); // Initialsation - all heaters off 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); 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); pc.printf("\r\nUnique ID: %08X %08X %08X \r\n", uid[0], uid[1], uid[2]); int i_board = -1; for (int i = 0; i < UID_TABLE_LENGTH; i++) { if (uid[0]==drive_board_uid[i][0] && uid[1]==drive_board_uid[i][1] && uid[2]==drive_board_uid[i][2]) { i_board = i; i = UID_TABLE_LENGTH; } } if (i_board != -1) pc.printf("Drive board: Board %d ADC measurement: PWM heater pulse, 60us delay\n",drive_board_serial_number[i_board]); else pc.printf("Drive board UID match not found\n"); pc.printf("iStep, eTime, I1, V1, R1_adc, R1_ohm, I2, V2, R2_adc, R2_ohm\n"); wait_ms(START_DELAY); timer.start(); // indicate start led_0 = 0; led_1 = 1; for (int iStep=0; iStep<N_STEPS; iStep++) { eTime = timer.read_ms(); 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); //Start ADC conversion adc.start_conversion(15); //Wait until ADC is free while(adc_busy == 1) { wait_us(1); } //Turn off heater if (iHeater==0) drive_1.pulsewidth_ticks(0); else drive_2.pulsewidth_ticks(0); wait_us(MEAS_DELAY); //Get ADC values adc.read_channels(); curr[iHeater] = adc.read_channel_result(i_port[iHeater]); v[iHeater] = adc.read_channel_result(v_port[iHeater]); 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]; else r_ohm[iHeater] = 0.0; //Wait before drivinng other heater wait_ms(LOG_INTERVAL/2); } //Write output for iHeater pc.printf("%5d, %10d, %10d, %10d, %10.6f, %10.6f, %10d, %10d, %10.6f, %10.6f \n", iStep, eTime, curr[0], v[0], r_adc[0], r_ohm[0], curr[1], v[1], r_adc[1], r_ohm[1]); } // indicate stop led_0 = 1; led_1 = 0; }