Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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;
}