ADC logging for temperature 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);
    }
 }