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 TestBenchFlow by
Revision 5:e3eff8a04b25, committed 2017-07-27
- Comitter:
- iwolf32
- Date:
- Thu Jul 27 14:27:22 2017 +0000
- Parent:
- 4:79b23d1fbcd1
- Child:
- 6:330773526c35
- 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 |
--- 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
--- 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
