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: KellerDruck_pressure PID PWM-Coil-driver Sensirion_SF04 VL6180
Fork of Serenity-proto_F429ZI by
Revision 5:e3eff8a04b25, committed 2017-07-27
- Comitter:
- iwolf32
- Date:
- Thu Jul 27 14:27:22 2017 +0000
- Parent:
- 4:79b23d1fbcd1
- Commit message:
- rev1
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
main.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 79b23d1fbcd1 -r e3eff8a04b25 main.cpp --- a/main.cpp Wed Jul 26 14:03:10 2017 +0000 +++ b/main.cpp Thu Jul 27 14:27:22 2017 +0000 @@ -1,188 +1,18 @@ #include "main.h" -//--------------------------- -void dutycycleincrease() -{ - dutycycle=dutycycle+0.01; -} - -void dutycycledecrease() -{ - dutycycle=dutycycle-0.01; -} - -void frequencyincrease() -{ - frequency=frequency+1; -} -void frequencydecrease() -{ - frequency=frequency-1; -} -void injectorvalvecontrol(){ - -while(true){ -float openvalue=(((1/frequency)*dutycycle)); -float offvalue=(1/frequency)-openvalue; - -injector.on(); -wait(openvalue); -injector.off(); -wait(offvalue); -} -} - -//----------------------------- -void pumpTachTrigger() -{ - pumpTachCounts++; -} - -void pump_tach_update() -{ - float i = pumpTachCounts; // In case it triggers mid-calculation - pumpTachCounts = 0; - pumpRpm = (i/pumpTachPoles)*60; -} - -void pump_init() -{ - pump.period(.001); // 1kHz PWM - pump = 0; - //ledGrn.period(.001); - - InterruptIn pumpTach(pumpTachPin); - pumpTach.rise(&pumpTachTrigger); - - pump_control_PID.setInputLimits(pumpMinPSI, pumpMaxPSI); - pump_control_PID.setOutputLimits(0.0, 1.0); // Output is a PWM signal ranging from 0-1 - pump_control_PID.setMode(AUTO_MODE); - pump_control_PID.setSetPoint(((double)pot2)*pumpMaxPSI); // pump setpoint based on pot 2*/ -} - -void pump_pid_update(char error) -{ - if (pumpPressure.status != 0x40) { - pump = 0; - pump_control_PID.reset(); - } else { - pump_control_PID.setSetPoint(((double)pot2)*pumpMaxPSI); - - //Update the process variable. - pump_control_PID.setProcessValue(pumpPressure.pressurePSI); - //PID calculation and set the new output value. - pump = pump_control_PID.compute(); - //pump = 0.1; - //ledGrn = ((float)1.0-pump.read()); - } -} - -void update_pressures() -{ - Timer timer; - timer.start(); - char error; - while (true) { - i2c1_m.lock(); - timer.reset(); - error = pumpPressure.readPT(); - //error |= mixerPressure.readPT(); - int wait = (200 - timer.read_ms()); - i2c1_m.unlock(); - Thread::wait(wait); - pump_pid_update(error); - } -} - -void update_flow1() -{ - Timer timer; - timer.start(); - char error; - while (true) { - i2c2_m.lock(); - timer.reset(); - error = mainflow.Measure(FLOW); - int wait = (200 - timer.read_ms()); - i2c2_m.unlock(); - Thread::wait(wait); - } -} - -//------------------------------------------------ -void update_flow2() -{ - Timer timer; - timer.start(); - char error; - while (true) { - i2c3_m.lock(); - timer.reset(); - error = loopflow.Measure(FLOW); - int wait = (200 - timer.read_ms()); - i2c3_m.unlock(); - Thread::wait(wait); - } -} -//------------------------------------------------ - -void print_process_values() -{ - //Thread::wait(100); // Wait initially to allow sensors to update, prevents a zero reading from going to serial - Timer timer; - timer.start(); - while (true) { - stdio_m.lock(); - timer.reset(); - - pc.printf("%.02fkPa %.02fpsi %.02fC %02X %.2f%% %.0fRPM %u %.0f %s %u %.0f %s %.3f %.02fHz %.02f\r\n", - pumpPressure.pressureKPA, pumpPressure.pressurePSI, pumpPressure.temperatureC, pumpPressure.status, - pump.read()*100, pumpRpm, - mainflow.flow.u16, (((float)mainflow.flow.i16) / mainflow.scaleFactor.u16), mainflow.flowUnitStr, - loopflow.flow.u16, (((float)loopflow.flow.i16) / loopflow.scaleFactor.u16), loopflow.flowUnitStr, - ((double)pot2)*pumpMaxPSI, frequency, dutycycle);//, agentlevel; - int wait = (1000 - timer.read_ms()); - - stdio_m.unlock(); - Thread::wait(wait); - } -} // main() runs in its own thread in the OS int main() { - pump_init(); - //ledBlu = 1; - pc.printf("Serenity Starting up...\n\r"); -//-------------------------------------------- -dutycycleup.rise(&dutycycleincrease); -dutycycledown.rise(&dutycycledecrease); -frequencyup.rise(&frequencyincrease); -frequencydown.rise(&frequencydecrease); + pc.baud(250000); + pc.printf("Starting up...\n\r"); - //Thread to execute injector valve control - Injector_Valve_Control.set_priority(osPriorityHigh); - Injector_Valve_Control.start(injectorvalvecontrol); -//-------------------------------------------- - - // Thread to poll pressure sensors - update_pressures_t.set_priority(osPriorityNormal); - update_pressures_t.start(update_pressures); + pc.printf("SN: %u Scale: %d Unit:%s\n\r", mainflow.serialNumber.u32, mainflow.scaleFactor.u16, mainflow.flowUnitStr); - // Thread to poll flow sensor - update_flow1_t.set_priority(osPriorityNormal); - update_flow1_t.start(update_flow1); - - //Thread to poll flow sensor - update_flow2_t.set_priority(osPriorityNormal); - update_flow2_t.start(update_flow2); - - // Thread to send process values to serial port - print_process_values_t.set_priority(osPriorityLow); - print_process_values_t.start(&print_process_values); - - while (true) { - pump_tach_update(); - + while (1) { + mainflow.Measure(FLOW); + mainflow.Measure(TEMP); + mainflow.Measure(VDD); + pc.printf("%.0f %s (raw: %i) Temp: %.1fC Vdd: %.2f\n\r", ((float)mainflow.flow.i16 / mainflow.scaleFactor.u16), mainflow.flowUnitStr, mainflow.flow.i16, (float)mainflow.temperature.i16/10, (float)mainflow.vdd.u16/1000); + wait(2); } -} - +} \ No newline at end of file
diff -r 79b23d1fbcd1 -r e3eff8a04b25 main.h --- a/main.h Wed Jul 26 14:03:10 2017 +0000 +++ b/main.h Thu Jul 27 14:27:22 2017 +0000 @@ -2,71 +2,13 @@ #define MAIN_H #include "mbed.h" -#include "keller_pressure.h" #include "sensirion_sf04.h" -#include "PID.h" -#include "coil-driver.h" -#include "VL6180.h" -/*Start of Where Additional Code was Added ---------------------------------------------------------------------------------------------------*/ -//Coil shutoff(A1, 5000, 40, 6); // Shutoff valve, 5ms spike time, 25kHz PWM at 15% duty cycle -Coil injector(A0, 200, 40, 3); // Injector valve, 200us spike time, 25kHz PWM at 7.5% duty cycle - -InterruptIn dutycycleup(A2); -InterruptIn dutycycledown(D4); -InterruptIn frequencyup(A5); -InterruptIn frequencydown(A4); - -Thread Injector_Valve_Control; - -double frequency=5.00; -double dutycycle=0.75; -float openvalue=(((1/frequency)*dutycycle)); -float offvalue=(1/frequency)-openvalue; - -/* ---------------------------------------------------------------------------------------------------*/ - - -// Mbed application shield display -#include "C12832A1Z.h" -#include "Small_7.h" -#include "Fonts/ArialR12x14.h" - -C12832A1Z lcd(D11, D13, D12, D7, D10); // MOSI, SCK, Reset, A0, CS -// LCD width and height (minus 1) -#define lcdWidth 127 -#define lcdHeight 31 - -// ISO/SEV pressure: 10psi, DES: 25-30psi -#define pumpSetPointPSI 45 -#define pumpMinPSI 0 -#define pumpMaxPSI 85 -//#define pumpHystPSI 2 // Gas flow sensor defines -#define SFM7033_ADDR 0x40 -#define SFM7034_ADDR 0x40 +#define MAINFLOW_ADDR 0x40 // End gas flow sensor defines -// Liquid pump defines -// PID settings -#define pumpPIDRate .2 // Pump PID computation interval (seconds) -float pumpKp = 4.0; -float pumpKi = 1.0; -#define pumpKd 0 - -#define pumpPwmFrequency 1000 // Frequency of PWM signal supplied to pump -#define pumpTachPoles 6 // 6 pulses per revolution -#define pumpTachPin PB_15 // Pump tach input (green wire) -#define pumpCtrlPin PB_13 // Pump control (white wire) -// End Liquid pump defines - -Thread print_process_values_t, update_pressures_t, update_flow1_t, update_flow2_t, update_level_t, update_lcd_t, update_shutoff_t; -Mutex i2c1_m, i2c2_m, i2c3_m, stdio_m; - -//DigitalOut myled(LED2); -Serial pc(USBTX, USBRX, 250000); // tx, rx, baud +Serial pc(USBTX, USBRX, 100000); // tx, rx, baud // an I2C sub-class that provides a constructed default class I2CPreInit : public I2C @@ -78,34 +20,10 @@ }; //I2CPreInit gI2C1(I2C_SDA, I2C_SCL, I2C frequency); -I2CPreInit i2c1(PB_9, PB_8, 100000); -I2CPreInit i2c2(PB_3, PB_10, 100000); I2CPreInit i2c3(PB_4, PA_8, 100000); -KELLER_PRESSURE pumpPressure(i2c1, 0x40); // Sensirion gas flow sensor object (i2c object, i2c address, calibration field, resolution 9-16 bit) -// calibration field 1: Air, 2: O2, 3: N2O -SF04 mainflow(i2c2, SFM7033_ADDR, 0, 9); // Gas flow sensor (SFM7033) -SF04 loopflow(i2c3, SFM7034_ADDR, 0, 9); -// Mbed application shield -//AnalogIn pot1(A0); -AnalogIn pot2(A1); - -PwmOut pump(pumpCtrlPin); -//pump.period(.001); - -PID pump_control_PID(pumpKp, pumpKi, pumpKd, pumpPIDRate); +SF04 mainflow(i2c3, MAINFLOW_ADDR, 0, 16); // Gas flow sensor (SFM7033) -//InterruptIn pumpTach(pumpTachPin); -volatile int pumpTachCounts = 0; -volatile float pumpRpm = 0; - -//PwmOut ledRed(PE_11); -//PwmOut ledGrn(PD_15); -//DigitalOut ledBlu(PF_12); - -// Level sensor -//VL6180 level(i2c1); //I2C object -//float agentlevel = 0; #endif \ No newline at end of file