5803 / Mbed 2 deprecated Code4

Dependencies:   mbed

main.cpp

Committer:
gabinader
Date:
2018-02-28
Revision:
0:58bc93cc5d0f

File content as of revision 0:58bc93cc5d0f:

/**----------------------------------------------------------------------------
 
   \file main.cpp
--                                                                           --
--              ECEN 5803 Mastering Embedded System Architecture             --
--                  Project 1 Module 4                                       --
--                Microcontroller Firmware                                   --
--                      main.cpp                                             --
--                                                                           --
-------------------------------------------------------------------------------
--
--  Designed for:  University of Colorado at Boulder
--               
--                
--  Designed by:  Tim Scherr
--  Revised by:  Glenn Feinberg and George Abi-Nader
-- 
-- Version: 2.1
-- Date of current revision:  2017-09-25   
-- Target Microcontroller: Freescale MKL25ZVMT4 
-- Tools used:  ARM mbed compiler
--              ARM mbed SDK
--              Freescale FRDM-KL25Z Freedom Board
--               
-- 
-- Functional Description:  Main code file generated by mbed, and then
--                           modified to implement a super loop bare metal OS.
--
--      Copyright (c) 2015, 2016 Tim Scherr  All rights reserved.
--
*/

#define MAIN
#include "shared.h"
#undef MAIN

#define ADC_0                   (0U)
#define CHANNEL_0               (0U)
#define CHANNEL_1               (1U)
#define CHANNEL_2               (2U)
#define LED_ON                  (0U)
#define LED_OFF                 (1U)
#define ADCR_VDD                (65535U)    /*! Maximum value when use 16b resolution */
#define V_BG                    (1000U)     /*! BANDGAP voltage in mV (trim to 1.0V) */
#define V_TEMP25                (716U)      /*! Typical VTEMP25 in mV */
#define M                       (1620U)     /*! Typical slope: (mV x 1000)/oC */
#define STANDARD_TEMP           (25)


extern volatile uint16_t SwTimerIsrCounter; 


Ticker tick;             //  Creates a timer interrupt using mbed methods
 /****************      ECEN 5803 add code as indicated   ***************/

//Initialize LEDs to OFF (HIGH)               
DigitalOut redLED(LED_RED, 1);
DigitalOut blueLED(LED_BLUE, 1);
DigitalOut greenLED(LED_GREEN, 1);   

//Add Analog Channels
AnalogIn VREFL(PTB0);       //ADC channel 0 is reference low
AnalogIn freqIn(PTB1);      //ADC channel 1 is vortex frequency in
AnalogIn ADCR(PTB2);        //ADC channel 2 is raw internal temperature 

//Setup SPI Pins
PinName const SCK = PTC5;
PinName const MOSI = PTC6;
PinName const MISO = PTC7;
DigitalOut CS(PTC4);

#define PIN_SCK  PTD1
#define PIN_MISO PTD3
#define PIN_MOSI PTD2
#define PIN_CS0  PTD0

//Setup PWM Pins
PwmOut pwm420(PTE30);
PwmOut pwmPulse(PTE31);
                                                    
Serial pc(USBTX, USBRX);
   
//Initalize SPI
 SPI device(MOSI, MISO, SCK);
 
const uint16_t freq[] = {0x7FFF,0x866D,0x8CD8,0x933A,0x998F,0x9FD4,0xA604,0xAC1C,0xB217,0xB7F2,0xBDA9,0xC338,0xC89B,0xCDCF,0xD2D1,0xD79E,0xDC32,0xE08A,0xE4A4,0xE87C,0xEC12,0xEF61,0xF268,0xF525,0xF797,0xF9BB,0xFB90,0xFD16,0xFE4A,0xFF2D,0xFFBE,0xFFFC,0xFFE7,0xFF80,0xFEC6,0xFDBA,0xFC5D,0xFAAF,0xF8B2,0xF667,0xF3D0,0xF0ED,0xEDC2,0xEA50,0xE698,0xE29F,0xDE65,0xD9EF,0xD53F,0xD057,0xCB3B,0xC5EF,0xC075,0xBAD2,0xB509,0xAF1E,0xA914,0xA2EF,0x9CB4,0x9666,0x900A,0x89A3,0x8336,0x7CC8,0x765B,0x6FF4,0x6998,0x634A,0x5D0F,0x56EA,0x50E0,0x4AF5,0x452C,0x3F89,0x3A0F,0x34C3,0x2FA7,0x2ABF,0x260F,0x2199,0x1D5F,0x1966,0x15AE,0x123C,0x0F11,0x0C2E,0x0997,0x074C,0x054F,0x03A1,0x0244,0x0138,0x007E,0x0017,0x0002,0x0040,0x00D1,0x01B4,0x02E8,0x046E,0x0643,0x0867,0x0AD9,0x0D96,0x109D,0x13EC,0x1782,0x1B5A,0x1F74,0x23CC,0x2860,0x2D2D,0x322F,0x3763,0x3CC6,0x4255,0x480C,0x4DE7,0x53E2,0x59FA,0x602A,0x666F,0x6CC4,0x7326,0x7991,0x7FFF,0x866D,0x8CD8,0x933A,0x998F,0x9FD4,0xA604,0xAC1C,0xB217,0xB7F2,0xBDA9,0xC338,0xC89B,0xCDCF,0xD2D1,0xD79E,0xDC32,0xE08A,0xE4A4,0xE87C,0xEC12,0xEF61,0xF268,0xF525,0xF797,0xF9BB,0xFB90,0xFD16,0xFE4A,0xFF2D,0xFFBE,0xFFFC,0xFFE7,0xFF80,0xFEC6,0xFDBA,0xFC5D,0xFAAF,0xF8B2,0xF667,0xF3D0,0xF0ED,0xEDC2,0xEA50,0xE698,0xE29F,0xDE65,0xD9EF,0xD53F,0xD057,0xCB3B,0xC5EF,0xC075,0xBAD2,0xB509,0xAF1E,0xA914,0xA2EF,0x9CB4,0x9666,0x900A,0x89A3,0x8336,0x7CC8,0x765B,0x6FF4,0x6998,0x634A,0x5D0F,0x56EA,0x50E0,0x4AF5,0x452C,0x3F89,0x3A0F,0x34C3,0x2FA7,0x2ABF,0x260F,0x2199,0x1D5F,0x1966,0x15AE,0x123C,0x0F11,0x0C2E,0x0997,0x074C,0x054F,0x03A1,0x0244,0x0138,0x007E,0x0017,0x0002,0x0040,0x00D1,0x01B4,0x02E8,0x046E,0x0643,0x0867,0x0AD9,0x0D96,0x109D,0x13EC,0x1782,0x1B5A,0x1F74,0x23CC,0x2860,0x2D2D,0x322F,0x3763,0x3CC6,0x4255,0x480C,0x4DE7,0x53E2,0x59FA,0x602A,0x666F,0x6CC4,0x7326,0x7991,0x7FFF,0x866D,0x8CD8,0x933A,0x998F,0x9FD4,0xA604,0xAC1C,0xB217,0xB7F2,0xBDA9,0xC338,0xC89B,0xCDCF,0xD2D1,0xD79E,0xDC32,0xE08A,0xE4A4,0xE87C,0xEC12,0xEF61,0xF268,0xF525,0xF797,0xF9BB,0xFB90,0xFD16,0xFE4A,0xFF2D,0xFFBE,0xFFFC,0xFFE7,0xFF80,0xFEC6,0xFDBA,0xFC5D,0xFAAF,0xF8B2,0xF667,0xF3D0,0xF0ED,0xEDC2,0xEA50,0xE698,0xE29F,0xDE65,0xD9EF,0xD53F,0xD057,0xCB3B,0xC5EF,0xC075,0xBAD2,0xB509,0xAF1E,0xA914,0xA2EF,0x9CB4,0x9666,0x900A,0x89A3,0x8336,0x7CC8,0x765B,0x6FF4,0x6998,0x634A,0x5D0F,0x56EA,0x50E0,0x4AF5,0x452C,0x3F89,0x3A0F,0x34C3,0x2FA7,0x2ABF,0x260F,0x2199,0x1D5F,0x1966,0x15AE,0x123C,0x0F11,0x0C2E,0x0997,0x074C,0x054F,0x03A1,0x0244,0x0138,0x007E,0x0017,0x0002,0x0040,0x00D1,0x01B4,0x02E8,0x046E,0x0643,0x0867,0x0AD9,0x0D96,0x109D,0x13EC,0x1782,0x1B5A,0x1F74,0x23CC,0x2860,0x2D2D,0x322F,0x3763,0x3CC6,0x4255,0x480C,0x4DE7,0x53E2,0x59FA,0x602A,0x666F,0x6CC4,0x7326,0x7991,0x7FFF,0x866D,0x8CD8,0x933A,0x998F,0x9FD4,0xA604,0xAC1C,0xB217,0xB7F2,0xBDA9,0xC338,0xC89B,0xCDCF,0xD2D1,0xD79E,0xDC32,0xE08A,0xE4A4,0xE87C,0xEC12,0xEF61,0xF268,0xF525,0xF797,0xF9BB,0xFB90,0xFD16,0xFE4A,0xFF2D,0xFFBE,0xFFFC,0xFFE7,0xFF80,0xFEC6,0xFDBA,0xFC5D,0xFAAF,0xF8B2,0xF667,0xF3D0,0xF0ED,0xEDC2,0xEA50,0xE698,0xE29F,0xDE65,0xD9EF,0xD53F,0xD057,0xCB3B,0xC5EF,0xC075,0xBAD2,0xB509,0xAF1E,0xA914,0xA2EF,0x9CB4,0x9666,0x900A,0x89A3,0x8336,0x7CC8,0x765B,0x6FF4,0x6998,0x634A,0x5D0F,0x56EA,0x50E0,0x4AF5,0x452C,0x3F89,0x3A0F,0x34C3,0x2FA7,0x2ABF,0x260F,0x2199,0x1D5F,0x1966,0x15AE,0x123C,0x0F11,0x0C2E,0x0997,0x074C,0x054F,0x03A1,0x0244,0x0138,0x007E,0x0017,0x0002,0x0040,0x00D1,0x01B4,0x02E8,0x046E,0x0643,0x0867,0x0AD9,0x0D96,0x109D,0x13EC,0x1782,0x1B5A,0x1F74,0x23CC,0x2860,0x2D2D,0x322F,0x3763,0x3CC6,0x4255,0x480C,0x4DE7,0x53E2,0x59FA,0x602A,0x666F,0x6CC4,0x7326,0x7991,0x7FFF,0x866D,0x8CD8,0x933A,0x998F,0x9FD4,0xA604,0xAC1C,0xB217,0xB7F2,0xBDA9,0xC338,0xC89B,0xCDCF,0xD2D1,0xD79E,0xDC32,0xE08A,0xE4A4,0xE87C,0xEC12,0xEF61,0xF268,0xF525,0xF797,0xF9BB,0xFB90,0xFD16,0xFE4A,0xFF2D,0xFFBE,0xFFFC,0xFFE7,0xFF80,0xFEC6,0xFDBA,0xFC5D,0xFAAF,0xF8B2,0xF667,0xF3D0,0xF0ED,0xEDC2,0xEA50,0xE698,0xE29F,0xDE65,0xD9EF,0xD53F,0xD057,0xCB3B,0xC5EF,0xC075,0xBAD2,0xB509,0xAF1E,0xA914,0xA2EF,0x9CB4,0x9666,0x900A,0x89A3,0x8336,0x7CC8,0x765B,0x6FF4,0x6998,0x634A,0x5D0F,0x56EA,0x50E0,0x4AF5,0x452C,0x3F89,0x3A0F,0x34C3,0x2FA7,0x2ABF,0x260F,0x2199,0x1D5F,0x1966,0x15AE,0x123C,0x0F11,0x0C2E,0x0997,0x074C,0x054F,0x03A1,0x0244,0x0138,0x007E,0x0017,0x0002,0x0040,0x00D1,0x01B4,0x02E8,0x046E,0x0643,0x0867,0x0AD9,0x0D96,0x109D,0x13EC,0x1782,0x1B5A,0x1F74,0x23CC,0x2860,0x2D2D,0x322F,0x3763,0x3CC6,0x4255,0x480C,0x4DE7,0x53E2,0x59FA,0x602A,0x666F,0x6CC4,0x7326,0x7991,0x7FFF,0x866D,0x8CD8,0x933A,0x998F,0x9FD4,0xA604,0xAC1C,0xB217,0xB7F2,0xBDA9,0xC338,0xC89B,0xCDCF,0xD2D1,0xD79E,0xDC32,0xE08A,0xE4A4,0xE87C,0xEC12,0xEF61,0xF268,0xF525,0xF797,0xF9BB,0xFB90,0xFD16,0xFE4A,0xFF2D,0xFFBE,0xFFFC,0xFFE7,0xFF80,0xFEC6,0xFDBA,0xFC5D,0xFAAF,0xF8B2,0xF667,0xF3D0,0xF0ED,0xEDC2,0xEA50,0xE698,0xE29F,0xDE65,0xD9EF,0xD53F,0xD057,0xCB3B,0xC5EF,0xC075,0xBAD2,0xB509,0xAF1E,0xA914,0xA2EF,0x9CB4,0x9666,0x900A,0x89A3,0x8336,0x7CC8,0x765B,0x6FF4,0x6998,0x634A,0x5D0F,0x56EA,0x50E0,0x4AF5,0x452C,0x3F89,0x3A0F,0x34C3,0x2FA7,0x2ABF,0x260F,0x2199,0x1D5F,0x1966,0x15AE,0x123C,0x0F11,0x0C2E,0x0997,0x074C,0x054F,0x03A1,0x0244,0x0138,0x007E,0x0017,0x0002,0x0040,0x00D1,0x01B4,0x02E8,0x046E,0x0643,0x0867,0x0AD9,0x0D96,0x109D,0x13EC,0x1782,0x1B5A,0x1F74,0x23CC,0x2860,0x2D2D,0x322F,0x3763,0x3CC6,0x4255,0x480C,0x4DE7,0x53E2,0x59FA,0x602A,0x666F,0x6CC4,0x7326,0x7991,0x7FFF,0x866D,0x8CD8,0x933A,0x998F,0x9FD4,0xA604,0xAC1C,0xB217,0xB7F2,0xBDA9,0xC338,0xC89B,0xCDCF,0xD2D1,0xD79E,0xDC32,0xE08A,0xE4A4,0xE87C,0xEC12,0xEF61,0xF268,0xF525,0xF797,0xF9BB,0xFB90,0xFD16,0xFE4A,0xFF2D,0xFFBE,0xFFFC,0xFFE7,0xFF80,0xFEC6,0xFDBA,0xFC5D,0xFAAF,0xF8B2,0xF667,0xF3D0,0xF0ED,0xEDC2,0xEA50,0xE698,0xE29F,0xDE65,0xD9EF,0xD53F,0xD057,0xCB3B,0xC5EF,0xC075,0xBAD2,0xB509,0xAF1E,0xA914,0xA2EF,0x9CB4,0x9666,0x900A,0x89A3,0x8336,0x7CC8,0x765B,0x6FF4,0x6998,0x634A,0x5D0F,0x56EA,0x50E0,0x4AF5,0x452C,0x3F89,0x3A0F,0x34C3,0x2FA7,0x2ABF,0x260F,0x2199,0x1D5F,0x1966,0x15AE,0x123C,0x0F11,0x0C2E,0x0997,0x074C,0x054F,0x03A1,0x0244,0x0138,0x007E,0x0017,0x0002,0x0040,0x00D1,0x01B4,0x02E8,0x046E,0x0643,0x0867,0x0AD9,0x0D96,0x109D,0x13EC,0x1782,0x1B5A,0x1F74,0x23CC,0x2860,0x2D2D,0x322F,0x3763,0x3CC6,0x4255,0x480C,0x4DE7,0x53E2,0x59FA,0x602A,0x666F,0x6CC4,0x7326,0x7991,0x7FFF,0x866D,0x8CD8,0x933A,0x998F,0x9FD4,0xA604,0xAC1C,0xB217,0xB7F2,0xBDA9,0xC338,0xC89B,0xCDCF,0xD2D1,0xD79E,0xDC32,0xE08A,0xE4A4,0xE87C,0xEC12,0xEF61,0xF268,0xF525,0xF797,0xF9BB,0xFB90,0xFD16,0xFE4A,0xFF2D,0xFFBE,0xFFFC,0xFFE7,0xFF80,0xFEC6,0xFDBA,0xFC5D,0xFAAF,0xF8B2,0xF667,0xF3D0,0xF0ED,0xEDC2,0xEA50,0xE698,0xE29F,0xDE65,0xD9EF,0xD53F,0xD057,0xCB3B,0xC5EF,0xC075,0xBAD2,0xB509,0xAF1E,0xA914,0xA2EF,0x9CB4,0x9666,0x900A,0x89A3,0x8336,0x7CC8,0x765B,0x6FF4,0x6998,0x634A,0x5D0F,0x56EA,0x50E0,0x4AF5,0x452C,0x3F89,0x3A0F,0x34C3,0x2FA7,0x2ABF,0x260F,0x2199,0x1D5F,0x1966,0x15AE,0x123C,0x0F11,0x0C2E,0x0997,0x074C,0x054F,0x03A1,0x0244,0x0138,0x007E,0x0017,0x0002,0x0040,0x00D1,0x01B4,0x02E8,0x046E,0x0643,0x0867,0x0AD9,0x0D96,0x109D,0x13EC,0x1782,0x1B5A,0x1F74,0x23CC,0x2860,0x2D2D,0x322F,0x3763,0x3CC6,0x4255,0x480C,0x4DE7,0x53E2,0x59FA,0x602A,0x666F,0x6CC4,0x7326,0x7991};

uint32_t flowG =0;
uint32_t F =0;
uint32_t Temp =0;
  
void flip() 
{
    greenLED = !greenLED;
}



int main() 
{
/****************      ECEN 5803 add code as indicated   ***************/
        
    
  //Configure ADC   

SIM->SCGC5 |= 0x400;
    PORTB->PCR[0] = PORT_PCR_MUX(0);
    PORTB->PCR[1] = PORT_PCR_MUX(0);
    PORTB->PCR[2] = PORT_PCR_MUX(0);
    SIM->SCGC6 |= SIM_SCGC6_ADC0_MASK;
    ADC0->CFG1 = ADC_CFG1_ADIV(1) | ADC_CFG1_ADLSMP_MASK | ADC_CFG1_MODE(3) | ADC_CFG1_ADICLK(1);
    ADC0->SC3 |= 0x4;
    ADC0->SC3 |= ADC_SC3_AVGS(3);
    ADC0->SC3 |= 0x8;
    ADC0->SC3 |= 0x80;   //Start Calibration

                 
    while(ADC0->SC3 & 0x40); /*wait for calibration*/
    
        //Plus side cal
        uint16_t cal =0; //clear 16bit RAM variable
        cal = cal + ADC0->CLP0 + ADC0->CLP1 + ADC0->CLP2 + ADC0->CLP3 + ADC0->CLP4 + ADC0->CLPS; 
        cal = cal/2;
        cal |= 0xFF00;
        ADC0->PG = cal;
        //Minus side cal
        cal = 0;
        cal = cal + ADC0->CLM0 + ADC0->CLM1 + ADC0->CLM2 + ADC0->CLM3 + ADC0->CLM4 + ADC0->CLMS; 
        cal = cal/2;
        cal |= 0xFF00;
        ADC0->MG = cal;
    
    //Calibration done start ADC
        ADC0->SC3 |= 0x0C; //continuous mode
    
    //Call Timer 0 every 100 uS
    tick.attach(&timer0, 0.0001);
    

   // pc.printf("Hello World!\n"); 
    uint32_t  count = 0;   
    
// initialize serial buffer pointers
   rx_in_ptr =  rx_buf; /* pointer to the receive in data */
   rx_out_ptr = rx_buf; /* pointer to the receive out data*/
   tx_in_ptr =  tx_buf; /* pointer to the transmit in data*/
   tx_out_ptr = tx_buf; /*pointer to the transmit out */
    
   
  // Print the initial banner
  //  pc.printf("\r\nHello World!\n\n\r");

    /****************      ECEN 5803 add code as indicated   ***************/
    // uncomment this section after adding monitor code.  
   /* send a message to the terminal  */                    
   
   UART_direct_msg_put("\r\nSystem Reset\r\nCode ver. ");
   UART_direct_msg_put( CODE_VERSION );
   UART_direct_msg_put("\r\n");
   UART_direct_msg_put( COPYRIGHT );
   UART_direct_msg_put("\r\n");

   set_display_mode();                                      
   
   
   
   float tempC = 25;
   float tempK = 298;
   float P = 0.0737; //PID in meters
   float d = 0.0127; //bluff body width in meters
   float viscosity, rho, velocity;
   
   float flow = 0;
   float frequency = 0;
   
   //estimate Frequency from Data
   uint32_t prevSample = 0;
   uint32_t currentSample = 0;
   uint32_t zeroCrossCount = 0;
   //float sampleTime = .1;
   
   uint16_t i = 0;  //counter
   currentSample = freq[i];
   

   
    while(1)       // Cyclical Executive Loop
    {

        count++;                  // counts the number of times through the loop
//      __enable_interrupts();
//      __clear_watchdog_timer();
       
        serial();            // Polls the serial port
        chk_UART_msg();     // checks for a serial port message received
        monitor();           // Sends serial port output messages depending
                         //  on commands received and display mode
 
   /****************      ECEN 5803 add code as indicated   ***************/
   
//  readADC()
        
        VREFL.read_u16();
        ADCR.read_u16();
        freqIn.read_u16();
            
        tempC = 25 - ( (ADCR / ADCR_VDD *3 -V_TEMP25))/ M ;  // assume VDD stable 3V;
        
        Temp = (uint32_t)(tempC);
        tempK = 273.15 + tempC;
        
        viscosity = (2.4*.00001)*pow(10,247.8/(tempK-140));
        rho = 1000*(1-(tempC+288.9414)/(508929.2*(tempC+68.12963))*pow((tempC-3.9863),2));
        
      //  pc.printf("Viscosity: %.5f\r\n", viscosity); 
      //  pc.printf("Rho: %.5f\r\n", rho);   

         
        //calculate frequency
        zeroCrossCount = 0;
        for(i = 0; i<1000;i++)
        {
                currentSample = freq[i] + freqIn.read_u16()/1000;  //adding ADC reading to simulate noise
       if ( ((currentSample >= 32678) && (prevSample < 32678)) || ( (currentSample <= 32678) && (prevSample > 32678) ) )
       {
           zeroCrossCount++;
       }
       prevSample = currentSample;
             
        }
        frequency = 5*(zeroCrossCount);                 //div (sampleTime *2 );
       // pc.printf("Frequency: %.1f Hz\r\n", frequency); 
        F = (uint32_t)(frequency);
// calculating velocity 
       
       velocity = 1/viscosity *(-3.96778 *pow(10,-8.0)* sqrt(viscosity*viscosity*(8817368566642459 -8817368566642457*d*d*frequency*frequency)+35195095456744964*P*P*rho*rho + 35232265234031368*P*rho*viscosity)+7.4437*P*rho+3.72578*viscosity);

     //  pc.printf("Velocity: %.5f m/s\r\n", velocity);  
//  calculate flow()
        
        flow = 2.45*P*P*velocity;  // in m^3 per sec
      //  pc.printf("Flow: %.5f m^3/s \r\n", flow); 
        
       flow = 15850*flow; 
       flowG = (uint32_t)(flow); // convert to Gallons/min
        
//  4-20 output ()    // use TMP0 channel 3  proporional rate to flow
    pwm420 = 1.0f - (flow/(0.04));       //scaled to max flow at 2000 Hz freq
    
//  Pulse output()   // use TMP0 channel 4  propotional rate to frequency
    pwmPulse = 1.0f - (frequency/2000);
    
//  LCD_Display()   // use the SPI port to send flow number
    updateLCD(flow);

//  End ECEN 5803 code addition


        if ((SwTimerIsrCounter & 0x1FFF) > 0x0FFF)

        {
            flip();  // Toggle Green LED
        }
   }
} 
   
  /**
 * @brief Display value on LCD
 *
 * Updates the LCD to display the value of a parameter 
 *
 * @param[flow] 
 *  uint32_t flow, a 32 bit interger to be displayed
 *
 * @return
 *  
 *  Void 
 */

void updateLCD(uint32_t flow)
{    
    CS = 0;
    device.write(0xFF);
    device.write((flow >> 24) & 0xFF);
    device.write((flow >> 16) & 0xFF);
    device.write((flow >> 8) & 0xFF);
    device.write(flow & 0xFF);
    CS = 1;
}