Generates a test signal on an AnalogOut and monitors a signal on an AnalogIn, plotting the test signal or the actual signal depending on a conditional compile. The wait() and wait_ms() library calls for this board are highly inaccurate so a new function is provided to wait for X number of milliseconds -- which is not very accurate.

Dependencies:   LCD_DISCO_F429ZI mbed TS_DISCO_F429ZI mbed-os BSP_DISCO_F429ZI

LaserMon-TEC.cpp

Committer:
Damotclese
Date:
2019-06-17
Revision:
2:cbcf2695a4a1

File content as of revision 2:cbcf2695a4a1:


// ----------------------------------------------------------------------
// LaserMon-TEC.cpp
//
// Fredric L. Rice, June 2019
//
// ----------------------------------------------------------------------

#include "mbed.h"                   // The mbed operating system
#include "LCD_DISCO_F429ZI.h"       // For controlling the LCD
#include "TS_DISCO_F429ZI.h"        // For controlling the touch screen
#include "LaserMon-Main.h"          // For data exported to us
#include "LaserMon-TEC.h"           // Always include ourself

// ----------------------------------------------------------------------
// Local data storage
//
// ----------------------------------------------------------------------

    // We bring in the TEC voltage to scan what it is
    static AnalogIn st_TECInput(TEC_VOLTAGE_IN);
    
    // We store the last ten TEC readings and keep a running average
    // of the last ten so that the main module may find out what the
    // average is and display it
    static uint16_t u16_TECHistory[TEC_HISTORY_COUNT_MAX];
    static uint8_t  u8_TECHistoryCount;
    static uint16_t u16_TECHistoryRunningAverage;
    
// ----------------------------------------------------------------------
// TECGetLastTenAverage()
//
// ----------------------------------------------------------------------
uint16_t TECGetLastTenAverage(void)
{
    return u16_TECHistoryRunningAverage;
}

// ----------------------------------------------------------------------
//
//
// ----------------------------------------------------------------------
void TECThread(void)
{
    uint16_t u16_TECVoltage  = 0;
    float    f_rawTECVoltage = 0.0f;
    
    // Get the current voltage
    f_rawTECVoltage = st_TECInput.read() * 3.3f;
    
    // The TEC voltage is converted from a floating point in to
    // 16 bit value with the value after the decimal moved to
    // the right by two decimal place
    u16_TECVoltage = (uint16_t)(f_rawTECVoltage * 100.0f);
    
    // Inform the main module what the TEC voltage is
    LaserMonMainInformTECVoltage(u16_TECVoltage);
    
    // Do we have lessd than our TEC history values stored so far?
    if (u8_TECHistoryCount < TEC_HISTORY_COUNT_MAX)
    {
        // Since we have fewer than our maximum history, store it
        u16_TECHistory[u8_TECHistoryCount++] = u16_TECVoltage;
    }
    else
    {
#if 1
        // Discard the oldest history value that we have
        for (uint8_t u8_thisValue = 1; u8_thisValue < TEC_HISTORY_COUNT_MAX; u8_thisValue++)
        {
            // Move the history value over to the left once
            u16_TECHistory[u8_thisValue] = u16_TECHistory[u8_thisValue - 1];
        }
        
        // Now store the latest value in to the history array
        u16_TECHistory[TEC_HISTORY_COUNT_MAX - 1] = u16_TECVoltage;
#endif
    }
    
    // Compute the average TEC value
    u16_TECHistoryRunningAverage = 0;
    
    for (uint8_t u8_thisValue = 0; u8_thisValue < u8_TECHistoryCount; u8_thisValue++)
    {
        u16_TECHistoryRunningAverage += u16_TECHistory[u8_thisValue];
    }
    
    // Compute the average
    u16_TECHistoryRunningAverage /= u8_TECHistoryCount;
}

// ----------------------------------------------------------------------
//
//
// ----------------------------------------------------------------------
void TECInit(void)
{
    // Initialize locally-held data
    u8_TECHistoryCount            = 0;
    u16_TECHistoryRunningAverage  = 0;
}

// End of file