ADC logging with demo drive board for calibration
Dependencies: mbed MODSERIAL FastPWM ADS8568_ADC
main.cpp
- Committer:
- justinbuckland
- Date:
- 2019-09-13
- Revision:
- 16:2c563709cf09
- Parent:
- 15:a08527d78ffa
- Child:
- 17:25831977b98e
File content as of revision 16:2c563709cf09:
#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 5000 // log file interval (ms) #define START_DELAY 1000 // pause for startup (ms) #define N_STEPS 1000 #define BUFFER_SIZE 4096 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[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("iStep, eTime, I1, V1, R1, I2, V2, R2\n"); wait_ms(START_DELAY); timer.start(); for (int iStep=0; iStep<N_STEPS; iStep++) { eTime = timer.read_ms(); pc.printf("%5d, %10d,", iStep, 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); //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[iHeater] = (float)v[iHeater]/(float)curr[iHeater]; //Write output for iHeater pc.printf("%10d, %10d, %10.6f", curr[iHeater], v[iHeater], r[iHeater]); } pc.printf("\n"); wait_ms(LOG_INTERVAL); } }