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 mbed-rtos SDFileSystem EthernetInterface DS1820
main.cpp
- Committer:
- soren51929277
- Date:
- 2019-11-22
- Revision:
- 1:dce8f2a2d706
- Parent:
- 0:ad2d0aa4726b
File content as of revision 1:dce8f2a2d706:
/*Current regulator software----------------------------------------------------
Project: TTEM2 current regulator
Date: 16/05-17
Name: Søren Møller Dath
Target: NXP FRDM-K64F rev E3 MBED platform
Description:
Input: temperature, voltage from PAPC program thrugh UDP protocol
Input: Setup file through UDP protocol send from PC. Values are stored on
microSD card and read at startup
Output: Spi signal controlling digital potentiometer for changing gate voltage
for a MOSFET controlling the current for the TTEM2 TX system
Output: PWM control of fan and pump for cooling system, and buzzer alarm for low
voltage and high temperature.
Output: Debug information through terminal
------------------------------------------------------------------------------*/
/*
mbed
PWM ALARM OG FAN SKAL BYTTES OM
Nyt pin til ds1822 temp sensor
*/
//INCLUDES----------------------------------------------------------------------
#include "mbed.h"
#include "EthernetInterface.h"
#include "SDFileSystem.h"
#include "DS1820.h"
#include <stdint.h>
//DEFINES-----------------------------------------------------------------------
#define Debug 0 //Set to 1 for debug mode, 0 for normal
//CONSTANTS---------------------------------------------------------------------
const int board_PORT = 20;
const int pc_PORT = 30;
static const char* SERVER_IP = "192.168.1.5"; //IP of server (pc)
static const char* CLIENT_IP = "192.168.1.4"; //IP of client (MBED board) 0.102
static const char* MASK = "255.255.255.0"; //mask
static const char* GATEWAY = "192.168.1.1"; //gateway
//STRUCTS-----------------------------------------------------------------------
typedef struct { //Data received from PAPC through UDP Ethernet
char CtrlType; //Must be 1
float Temperature; //Measured temperature for MOSFETs
float SetOutput; //output from controller (Not used)
float Error; //Error between Iset and Current (Not used)
float Iset; //Setpoint value for current (Not used)
float Voltage; //Measured voltage over the H-bridge for thr coil
float Current; //Measured current through the H-bridge
} __attribute__ ((packed)) Setting1;
Setting1 status;
typedef struct { //Data from tTEM regulator application on pc to microcontroller board
char CtrlType; //Must be 2
float SetCurrent; //Setpoint value for current (same as Iset)
float SetTemp; //Setpoint value for temperature
float SetSmallCurrentStepsize; //Current small stepsize for proportional regulator
float SetLargeCurrentStepsize; //Current large stepsize for proportional regulator
float SetStartupCurrentAbove50; //Startup current if temperature above 50 deg
float SetStartupCurrent35to50; //Startup current if temperature between 35-50 deg
float SetStartupCurrent25to35; //Startup current if temperature between 25-35 deg
float SetStartupCurrent15to25; //Startup current if temperature between 15-25 deg
float SetStartupCurrent5to15; //Startup current if temperature between 5-15 deg
float SetStartupCurrentBelow5; //Startup current if temperature below 5 deg
float SetLowVoltAlarm; //Define when the alarm will sound
float SetHighTempAlarm; //Define when the alarm will sound
float SetPumpLowSpeed; //Lowest possible pump speed
float SetPumpHighSpeed; //Highest possible pump speed
float SetFanLowSpeed; //Fixed speed for then fan
float SetFanMidSpeed; //Fixed speed for then fan
float SetFanHighSpeed; //Fixed speed for then fan
float SetStartupTime; //Number of seconds for startup
float SetLowMoment; //Current above this value is defined as High Moment and regulator is only active if above
float SetLowestCurrent; //The lowest value the current can be set to 0-1023
float SetResetCurrentTime; //Reset setupCurrent if no data has been received from PAPC within this time
float PumpUpdateValue; //How much should the pump PWM value be changed pr interval
float PumpUpdateInterval; //How often should the pump PWM value be change
float PumpTempTolerance; //Temp tolerance for changing between regulator state and high/low state
} __attribute__ ((packed)) Setting2;
Setting2 setup;
typedef struct {
float Temperature; //Measured voltage over the H-bridge for thr coil
float Voltage;
float Current;
float RegTemp; //Measured temperature for MOSFETs
bool DataReceived;
int CurrentStep;
} __attribute__ ((packed)) Data;
Data reply;
//INITS-------------------------------------------------------------------------
Serial pc(USBTX, USBRX); //create PC interface for terminal
EthernetInterface eth; //create ethernet
UDPSocket server, sock; //creat Ethernet socket
Endpoint DataIn, pserver; //create endpoint
DigitalOut red(LED_RED); //debug led
DigitalOut statusGreen(PTC10); //Lights up when active regulating NOT USED
DigitalOut statusRed(PTC11); //Lights up when reatch upper limit for a while NOT USED
SPI spi(PTD2, NC, PTD1); //mosi, miso(not used), sclk (reset+rdy not used) for DAC
DigitalOut cs(PTC12); //SYNC SPI
SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // mosi, miso, sclk, cs, name
AnalogIn BattVolt(A0); //ADC for the battery voltage resistordivider = 10k/(36k+10k) = 0.217. Measered voltage = (BattVolt*3.3V)/0.217
AnalogIn CoilVolt(A1); //ADC for the coil voltage. Measered voltage = (CoilVolt*3.3V)/0.217 NOT USED
AnalogIn Current(A2); //ADC for the current measurement. Measered current = ((Current/3)-(9/2))/(0.05*N) Number of turns of wire throuth current sensor. NOT USED
DS1820 probe(D15); //PTE24 Data from DS1822+ digital temp. sensor TJEK AT DEN VIRKER PÅ DENNE NYE PLACERING I STEDET FOR A3
DigitalIn FillWater(D2); //Input for pushbutton for filling water on to the system
PwmOut PwmSpare(D3); //Extra PWM output NOT USED
PwmOut PwmAlarm(D7); //PWM for the alarm output set value = 1 for 100% PWM signal NOT USED
PwmOut PwmPump(D6); //PWM output for pump
PwmOut PwmFan(D5); //PWM output for fan
Timer t, PumpTimer, DataReceivedTimer; //Timer for resetting startup current and pump
float SetValue = 0.0f; //Set value for the current regulator
float tempProbe = 0.0f;
bool firstRun = 0; //Just to check if data has been received for the first time
float PumpValue = 0.0f;
enum states {
PUMP_HIGH,
PUMP_LOW,
PUMP_REG
};
enum states state = PUMP_REG;
//Char arrays for storing ini variables on SD card
char A[50], B[50], C[50], D[50], E[50], F[50], G[50], H[50], I[50], J[50], K[50], L[50], M[50], N[50], O[50], P[50], Q[50], R[50], S[50], T[50], U[50], V[50], W[50], X[50];
//FUNCTION DECLARATIONS---------------------------------------------------------
void InitUSB(void);
void InitEth(void);
void ReadFile(void); //For SD card
void WriteFile(void); //For SD card
float Map(float, float, float, float, float);
void InitPot(void);
void SetPot(int);
float GetBattVolt(void);
//float GetCoilVolt(void);
//float GetCurrent(void);
void Alarm(void);
void UpdateTemp(void);
void UpdateStartupCurrent(void);
void UpdateCurrent(void);
void ReadSocketDate(void const *args);
void ReturnUDPData(void);
int main(void);
//InitUSB-----------------------------------------------------------------------TESTED
void InitUSB(void) //UART is only used for debug with a terminal
{
pc.baud(9600); //baud
}
//InitEth-----------------------------------------------------------------------TESTED
void InitEth(void)
{
if (Debug)
eth.init();
else
eth.init(CLIENT_IP, MASK, GATEWAY); //set up IP
eth.connect(60000); //connect ethernet timeout = 60s
pc.printf("\nBoard IP Address is %s\r\n", eth.getIPAddress()); //get client IP address
pc.printf("\nBoard Gateway Address is %s\r\n", eth.getGateway());
pc.printf("\nBoard Network Mask is %s\r\n", eth.getNetworkMask());
pc.printf("\nBoard MAC address is %s\r\n", eth.getMACAddress());
sock.init();
server.bind(board_PORT);
pserver.set_address(SERVER_IP,pc_PORT);
}
//ReadFile----------------------------------------------------------------------TESTED
void ReadFile (void) {
FILE *set = fopen("/sd/ini.txt", "r"); // Open "ini.txt" on the SD file system for read
fscanf(set,"%s %f",A,&setup.SetCurrent);
fscanf(set,"%s %f",B,&setup.SetTemp);
fscanf(set,"%s %f",C,&setup.SetSmallCurrentStepsize);
fscanf(set,"%s %f",D,&setup.SetLargeCurrentStepsize);
fscanf(set,"%s %f",E,&setup.SetStartupCurrentAbove50);
fscanf(set,"%s %f",F,&setup.SetStartupCurrent35to50);
fscanf(set,"%s %f",G,&setup.SetStartupCurrent25to35);
fscanf(set,"%s %f",H,&setup.SetStartupCurrent15to25);
fscanf(set,"%s %f",I,&setup.SetStartupCurrent5to15);
fscanf(set,"%s %f",J,&setup.SetStartupCurrentBelow5);
fscanf(set,"%s %f",K,&setup.SetLowVoltAlarm);
fscanf(set,"%s %f",L,&setup.SetHighTempAlarm);
fscanf(set,"%s %f",M,&setup.SetPumpLowSpeed);
fscanf(set,"%s %f",N,&setup.SetPumpHighSpeed);
fscanf(set,"%s %f",O,&setup.SetFanLowSpeed);
fscanf(set,"%s %f",P,&setup.SetFanMidSpeed);
fscanf(set,"%s %f",Q,&setup.SetFanHighSpeed);
fscanf(set,"%s %f",R,&setup.SetStartupTime);
fscanf(set,"%s %f",S,&setup.SetLowMoment);
fscanf(set,"%s %f",T,&setup.SetLowestCurrent);
fscanf(set,"%s %f",U,&setup.SetResetCurrentTime);
fscanf(set,"%s %f",V,&setup.PumpUpdateValue);
fscanf(set,"%s %f",W,&setup.PumpUpdateInterval);
fscanf(set,"%s %f",X,&setup.PumpTempTolerance);
fclose(set);
}
//WriteFile---------------------------------------------------------------------TESTED
void WriteFile(void) { // write to SD memory
FILE *fp = fopen("/sd/ini.txt", "w"); // Open "ini.txt" on the SD file system for write
fprintf(fp,"SetCurrent %f\r\n",setup.SetCurrent);
fprintf(fp,"SetTemp %f\r\n",setup.SetTemp);
fprintf(fp,"SetSmallCurrentStepsize %f\r\n",setup.SetSmallCurrentStepsize);
fprintf(fp,"SetLargeCurrentStepsize %f\r\n",setup.SetLargeCurrentStepsize);
fprintf(fp,"SetStartupCurrentAbove50 %f\r\n",setup.SetStartupCurrentAbove50);
fprintf(fp,"SetStartupCurrent35to50 %f\r\n",setup.SetStartupCurrent35to50);
fprintf(fp,"SetStartupCurrent25to35 %f\r\n",setup.SetStartupCurrent25to35);
fprintf(fp,"SetStartupCurrent15to25 %f\r\n",setup.SetStartupCurrent15to25);
fprintf(fp,"SetStartupCurrent5to15 %f\r\n",setup.SetStartupCurrent5to15);
fprintf(fp,"SetStartupCurrentBelow5 %f\r\n",setup.SetStartupCurrentBelow5);
fprintf(fp,"SetLowVoltAlarm %f\r\n",setup.SetLowVoltAlarm);
fprintf(fp,"SetHighTempAlarm %f\r\n",setup.SetHighTempAlarm);
fprintf(fp,"SetPumpLowSpeed %f\r\n",setup.SetPumpLowSpeed);
fprintf(fp,"SetPumpHighSpeed %f\r\n",setup.SetPumpHighSpeed);
fprintf(fp,"SetFanLowSpeed %f\r\n",setup.SetFanLowSpeed);
fprintf(fp,"SetFanMidSpeed %f\r\n",setup.SetFanMidSpeed);
fprintf(fp,"SetFanHighSpeed %f\r\n",setup.SetFanHighSpeed);
fprintf(fp,"SetStartupTime %f\r\n",setup.SetStartupTime);
fprintf(fp,"SetLowMoment %f\r\n",setup.SetLowMoment);
fprintf(fp,"SetLowestCurrent %f\r\n",setup.SetLowestCurrent);
fprintf(fp,"SetResetCurrentTime %f\r\n",setup.SetResetCurrentTime);
fprintf(fp,"PumpUpdateValue %f\r\n",setup.PumpUpdateValue);
fprintf(fp,"PumpUpdateInterval %f\r\n",setup.PumpUpdateInterval);
fprintf(fp,"PumpTempTolerance %f\r\n",setup.PumpTempTolerance);
fclose(fp);
}
//InitPot-----------------------------------------------------------------------TESTED POT = digital potentiometer (DAC)
//Setup digital potentiometer
void InitPot(void) {
cs = 1; //Deselect the device
spi.format(16,1); //Setup the spi for 16 bit data, SPI mode = 1
spi.frequency(1000000); //1MHz clock
cs = 0; //Select the device
spi.write(0x1803); //Send 0x1803 to enable updating of RDAC register for changing potentiometer values
cs = 1; //Deselect the device
}
//SetPot------------------------------------------------------------------------TESTED
//Update of potentiometer value
void SetPot(int value) { //Values from 0-1023 are allowed
cs = 0; //Select the device
spi.write(0x400+value); //Values from 0x0400 to 0x7FF for digital potentiometer
cs = 1; //Deselect the device
}
//GetBattVolt-------------------------------------------------------------------TESTED
float GetBattVolt(void) {
float result;
result = (BattVolt.read()*15.207f+0.2f);
return result;
}
//Alarm check for low battery or high temperature-------------------------------TESTED NOT USED
void Alarm(void) {
if ((status.Temperature>setup.SetHighTempAlarm)) {
pc.printf("Water temperature high\r\n");
PwmAlarm = 1.0f;
wait(0.5);
PwmAlarm = 0.0f;
wait(0.5);
}
else {
PwmAlarm = 0.0f; //Turn off the alarm
}
}
//UpdateTemp--------------------------------------------------------------------TESTED
void UpdateTemp(void) {
switch(state) {
case PUMP_HIGH:
//pc.printf("State = PUMP_HIGH\n\r");
PwmFan = setup.SetFanHighSpeed;
PwmPump = setup.SetPumpHighSpeed;
if(status.Temperature < setup.SetTemp) { //Temp is lower than setpoint go to PUMP_REG state
state = PUMP_REG;
}
break;
case PUMP_LOW:
//pc.printf("State = PUMP_LOW\n\r");
PwmFan = setup.SetFanLowSpeed;
PwmPump = setup.SetPumpLowSpeed;
if(status.Temperature > setup.SetTemp) { //Temp is higher than setpoint go to PUMP_REG state
state = PUMP_REG;
}
break;
case PUMP_REG:
//pc.printf("State = PUMP_REG\n\r");
//PwmFan = setup.SetFanMidSpeed;
if(PumpTimer.read()>setup.PumpUpdateInterval){
if(status.Temperature>setup.SetTemp){ //Temp too high turn up pump
PumpValue = PumpValue + setup.PumpUpdateValue; //0.05f;
if(PumpValue>0.3f){
PumpValue = 0.3;
}
//pc.printf("Turn pump up\n\r");
}
else if(status.Temperature<setup.SetTemp) { //Temp too low turn down pump
PumpValue = PumpValue - setup.PumpUpdateValue*10;
//pc.printf("Turn pump down\n\r");
}
else {
PumpValue = PumpValue;
}
//Restart timer used for making the cooling system run a little time after PAPC has stopped
PumpTimer.stop();
PumpTimer.reset();
PumpTimer.start();
}
//Make sure the value can not be lower than lowest value or higher than higest.
if(PumpValue<setup.SetPumpLowSpeed){
PumpValue = setup.SetPumpLowSpeed;
}
if(PumpValue>setup.SetPumpHighSpeed){
PumpValue = setup.SetPumpHighSpeed;
}
PwmPump = PumpValue;
PwmFan = PumpValue;
//pc.printf("PumpValue: %3.3f%\n\r",PumpValue);
if(status.Temperature-setup.SetTemp >= setup.PumpTempTolerance) { //Temp is higher than tolerance go to PUMP_HIGH state
state = PUMP_HIGH;
}
if(setup.SetTemp-status.Temperature >= setup.PumpTempTolerance) { //Temp is lower than tolerance go to PUMP_LOW state
state = PUMP_LOW;
}
break;
}
}
//UpdateStartupCurrent----------------------------------------------------------TESTED
void UpdateStartupCurrent(void) {
probe.convertTemperature(true, DS1820::all_devices);
float output = 0.0f;
float tempC = 0.0f;
tempC = probe.temperature();
wait_ms(10);
pc.printf("Temp: %3.1f%\n\r",tempC);
//reply.ReturnTemp = tempC; //TEST FOR SENDIND DATA BACK TO PC
if (tempC>=50.0f) {
output = setup.SetStartupCurrentAbove50; //500
}
else if (50.0f>tempC && tempC>=35.0f) {
output = setup.SetStartupCurrent35to50; //600
}
else if (35.0f>tempC && tempC>=25.0f) {
output = setup.SetStartupCurrent25to35; //700
}
else if (25.0f>tempC && tempC>=15.0f) {
output = setup.SetStartupCurrent15to25; //800
}
else if (15.0f>tempC && tempC>=5.0f) {
output = setup.SetStartupCurrent5to15; //900
}
else {
output = setup.SetStartupCurrentBelow5; //1023
}
SetPot(output); //Startup current in order to slowly startup
SetValue = output; //The currentUpdate function needs to know where it should start to regulate from
pc.printf("StartupCurrent: %3.3f%\n\r",output);
}
//UpdateCurrent-----------------------------------------------------------------TESTED
void UpdateCurrent(void) {
probe.convertTemperature(true, DS1820::all_devices);
if(status.Current >= setup.SetLowMoment) {
if (probe.temperature()<50.0f) { //Only regulate if temp measured on regulator mosfet is below 50 degree
//Voltage must be above a defined level or it should not be possible to turn more down
//Implement large step if big error and small step if small error
statusGreen = 1; //LED not used
//Current too high turn it down but only if voltage is not to low!
if((setup.SetCurrent < status.Current) && (status.Voltage > setup.SetLowVoltAlarm)) {
float error = status.Current-setup.SetCurrent;
if (error>=0.5f) { //large step 0.5f = 0.5A
SetValue = SetValue - setup.SetLargeCurrentStepsize;
pc.printf("Turn down large\n\r");
if (SetValue < setup.SetLowestCurrent) { //FitPC shuts down if value is below this number
SetValue = setup.SetLowestCurrent;
}
}
else { //small step
SetValue = SetValue - setup.SetSmallCurrentStepsize;
pc.printf("Turn down small\n\r");
if (SetValue < setup.SetLowestCurrent) { //FitPC shuts down if value is below this number
SetValue = setup.SetLowestCurrent;
}
}
SetPot(SetValue);
pc.printf("SetValue: %3.3f%\n\r",SetValue);
}
//Current too low turn it up
else if(setup.SetCurrent > status.Current) {
float error = setup.SetCurrent-status.Current;
if (error>=1.0f) { //large step
SetValue = SetValue + setup.SetLargeCurrentStepsize;
pc.printf("Turn up large\n\r");
if (SetValue > 1023) {
SetValue = 1023;
}
}
else { //small step
SetValue = SetValue + setup.SetSmallCurrentStepsize;
pc.printf("Turn up small\n\r");
if (SetValue > 1023) {
SetValue = 1023;
}
}
if (SetValue >= 1023) {
pc.printf("Unable to turn up higher, change battery\n\r");
statusRed = 1;
PwmAlarm = 1.0f;
wait(0.25);
PwmAlarm = 0.0f;
wait(0.25);
}
SetPot(SetValue);
pc.printf("SetValue: %3.3f%\n\r",SetValue);
}
}
//else go to safe state if regulator mosfet temperature is above 50 deg.
else {
//pc.printf("SetValue: %3.3f%\n\r",SetValue);
SetPot(setup.SetStartupCurrentBelow5);
}
}
}
//ReadSocketData----------------------------------------------------------------TESTED
void ReadSocketDate(void const *args) {
char in_buffer[1024];
while(true) {
int n = server.receiveFrom(DataIn, in_buffer, sizeof(in_buffer));
if (in_buffer[0]==1) { //Receiving from PAPC, copy to status struct
memcpy(&status,&in_buffer[0],sizeof(status));
UpdateCurrent(); //Turn up/down the current
UpdateTemp(); //Control speed of pump based on temperature
firstRun = 1;
//pc.printf("Data modtaget\r\n");
pc.printf("Temperatur: %3.1f%\r\n",status.Temperature);
pc.printf("Voltage: %3.3f%\r\n",status.Voltage);
pc.printf("Current: %3.3f%\r\n\r\n",status.Current);
}
else if (in_buffer[0]==2) { //Receiving from tTEM regulator application, copy to setup struct
memcpy(&setup,&in_buffer[0],sizeof(setup));
//Acustic alarm to confirm data has been received
reply.DataReceived = true; //Sends a boolean to the tTEM regulation software confirming data has been received
DataReceivedTimer.stop();
DataReceivedTimer.reset();
DataReceivedTimer.start();
PwmAlarm = 1.0f; // NOT USED
wait(0.05);
PwmAlarm = 0.0f;
wait(0.05);
PwmAlarm = 1.0f;
wait(0.05);
PwmAlarm = 0.0f;
WriteFile(); //Write data to SD card
pc.printf("Data has been received from setup file\r\n");
//Print the received data to terminal
/*pc.printf("SetCurrent: %3.2f%\r\n",setup.SetCurrent);
pc.printf("SetTemp: %3.2f%\r\n",setup.SetTemp);
pc.printf("SetSmallStepsize: %3.2f%\r\n",setup.SetSmallCurrentStepsize);
pc.printf("SetLargeStepsize: %3.2f%\r\n",setup.SetLargeCurrentStepsize);
pc.printf("SetStartupCurrentAbove50: %3.2f%\r\n",setup.SetStartupCurrentAbove50);
pc.printf("SetStartupCurrent35to50: %3.2f%\r\n",setup.SetStartupCurrent35to50);
pc.printf("SetStartupCurrent25to35: %3.2f%\r\n",setup.SetStartupCurrent25to35);
pc.printf("SetStartupCurrent15to25: %3.2f%\r\n",setup.SetStartupCurrent15to25);
pc.printf("SetStartupCurrent5to15: %3.2f%\r\n",setup.SetStartupCurrent5to15);
pc.printf("SetStartupCurrentBelow5: %3.2f%\r\n",setup.SetStartupCurrentBelow5);
pc.printf("SetLowVoltAlarm: %3.2f%\r\n",setup.SetLowVoltAlarm);
pc.printf("SetHighTempAlarm: %3.2f%\r\n",setup.SetHighTempAlarm);
pc.printf("SetPumpLowSpeed: %3.2f%\r\n",setup.SetPumpLowSpeed);
pc.printf("SetPumpHighSpeed: %3.2f%\r\n",setup.SetPumpHighSpeed);
pc.printf("SetFanLowSpeed: %3.2f%\r\n",setup.SetFanLowSpeed);
pc.printf("SetFanMidSpeed: %3.2f%\r\n",setup.SetFanMidSpeed);
pc.printf("SetFanHighSpeed: %3.2f%\r\n",setup.SetFanHighSpeed);
pc.printf("SetStartupTime: %3.2f%\r\n",setup.SetStartupTime);
pc.printf("SetLowMoment: %3.2f%\r\n",setup.SetLowMoment);
pc.printf("SetLowestCurrent: %3.3f%\r\n",setup.SetLowestCurrent);
pc.printf("SetResetCurrentTime: %3.3f%\r\n",setup.SetResetCurrentTime);
pc.printf("PumpUpdateValue: %3.3f%\r\n",setup.PumpUpdateValue);
pc.printf("PumpUpdateInterval: %3.3f%\r\n",setup.PumpUpdateInterval);
pc.printf("PumpTempTolerance: %3.3f%\r\n",setup.PumpTempTolerance);
*/
}
else { //Error
pc.printf("Invalid CrtlType, must be 1 for status or 2 for setup\r\n");
}
t.reset(); //Reset and start the timer for measure if PAPC has been stopped
t.start();
}
}
void ReturnUDPData(void) {
char out_buffer[sizeof(reply)];
//Send data back through UDP
probe.convertTemperature(true, DS1820::all_devices);
tempProbe = probe.temperature();
//wait_ms(750);
while(tempProbe==-1000) {
//pc.printf("Temp probe crc error\n\r");
tempProbe = probe.temperature();
//wait_ms(750);
}
reply.Temperature = status.Temperature; //Data received from PAPC is send to tTEM regulator application
reply.Voltage = status.Voltage;
reply.Current = status.Current;
reply.RegTemp = tempProbe; //Data measured by the microcontroller
reply.CurrentStep = SetValue;
//pc.printf("RegTemp: %3.3f%\n\r",tempProbe);
memcpy(&out_buffer[0],&reply, sizeof(reply));
sock.sendTo(pserver, out_buffer, sizeof(out_buffer)); //reply
wait_ms(550);
if(DataReceivedTimer.read()>5) {
reply.DataReceived = false;
DataReceivedTimer.stop();
DataReceivedTimer.reset();
}
}
//MAIN--------------------------------------------------------------------------
int main(void)
{
PwmFan = 0.0f;
PwmPump = 0.0f;
PwmSpare = 0.0f; //Do not use this PWM output
InitUSB(); //initialize the PC interface
pc.printf("Init USB done\r\n");
InitEth(); //Init ethernet connection
pc.printf("Init Ethernet done\r\n");
InitPot(); //setup potentiometer
pc.printf("Init POT done\r\n");
ReadFile(); //Read ini values from SD card that was last received from UDP.
pc.printf("Read MicroSD card done\r\n");
UpdateStartupCurrent(); //Set the startup current at a value dependent of the measured temperature
wait(setup.SetStartupTime); //Wait a while for everything to startup
PumpValue = (setup.SetPumpLowSpeed+setup.SetPumpHighSpeed)*0.5f;
//FanValue = setup.SetFanMidSpeed;
PumpTimer.reset();
PumpTimer.start();
Thread DbThread(ReadSocketDate, NULL, osPriorityNormal, (DEFAULT_STACK_SIZE * 2.25));
FillWater.mode(PullUp); //Enable pull-up resister on bushbutton input
statusGreen = 0;
statusRed = 0;
wait_ms(10);
while(true)
{
red = !red;
Alarm(); //Check if battery is running low
if (firstRun == 0) { //No data has been received so manual overwrite of pwmpump is allowed, if data has been received it can not be changed manual
if(FillWater == 0) { //Button has been pushed
PwmPump = 1.0f; //Run pump at half speed to fill system
}
else {
PwmPump = 0.0f;
}
}
//Reset setvalue for current regulator if PAPC has been stopped for a given time
if (setup.SetResetCurrentTime==0) {
t.stop(); //If Time= 0, disable the resetting function
t.reset();
}
else if(t.read()>setup.SetResetCurrentTime) {
//No data received for 10 sek. reset the current
UpdateStartupCurrent();
PwmPump = 0.0f; //Pump and fan should not run if no data has been received from papc
PwmFan = 0.0f;
PwmAlarm = 0.0f; //Stop the alarm
firstRun = 0;
statusGreen = 0;
statusRed = 0;
status.Temperature = 0;
status.Voltage = 0;
status.Current = 0;
//pc.printf("Resetting start value\n\r");
t.stop();
t.reset();
}
ReturnUDPData();
}
}