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 4:79b23d1fbcd1, committed 2017-07-26
- Comitter:
- iwolf32
- Date:
- Wed Jul 26 14:03:10 2017 +0000
- Parent:
- 3:9ff79ea3a294
- Child:
- 5:e3eff8a04b25
- Commit message:
- REV2;
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 Mon Jul 24 15:38:39 2017 +0000
+++ b/main.cpp Wed Jul 26 14:03:10 2017 +0000
@@ -1,5 +1,37 @@
#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++;
@@ -16,7 +48,7 @@
{
pump.period(.001); // 1kHz PWM
pump = 0;
- ledGrn.period(.001);
+ //ledGrn.period(.001);
InterruptIn pumpTach(pumpTachPin);
pumpTach.rise(&pumpTachTrigger);
@@ -40,7 +72,7 @@
//PID calculation and set the new output value.
pump = pump_control_PID.compute();
//pump = 0.1;
- ledGrn = ((float)1.0-pump.read());
+ //ledGrn = ((float)1.0-pump.read());
}
}
@@ -53,7 +85,7 @@
i2c1_m.lock();
timer.reset();
error = pumpPressure.readPT();
- error |= mixerPressure.readPT();
+ //error |= mixerPressure.readPT();
int wait = (200 - timer.read_ms());
i2c1_m.unlock();
Thread::wait(wait);
@@ -61,7 +93,7 @@
}
}
-void update_airflow()
+void update_flow1()
{
Timer timer;
timer.start();
@@ -69,35 +101,29 @@
while (true) {
i2c2_m.lock();
timer.reset();
- error = sfm7033.Measure(FLOW);
+ error = mainflow.Measure(FLOW);
int wait = (200 - timer.read_ms());
i2c2_m.unlock();
Thread::wait(wait);
}
}
-void update_level()
+//------------------------------------------------
+void update_flow2()
{
Timer timer;
timer.start();
+ char error;
while (true) {
- i2c1_m.lock();
+ i2c3_m.lock();
timer.reset();
- agentlevel = (float)level;
- int wait = (1000 - timer.read_ms());
- i2c1_m.unlock();
+ error = loopflow.Measure(FLOW);
+ int wait = (200 - timer.read_ms());
+ i2c3_m.unlock();
Thread::wait(wait);
}
}
-
-//float get_level()
-//{
-// i2c1_m.lock();
-// float value = (float)level;
-// i2c1_m.unlock();
-// return value;
-//}
-
+//------------------------------------------------
void print_process_values()
{
@@ -108,12 +134,12 @@
stdio_m.lock();
timer.reset();
- pc.printf("%.02fkPa %.02fpsi %.02fC %.02fF %02X %.02fkPa %.02fpsi %.02fC %.02fF %02X %.2f%% %.0fRPM %u %.0f %s %.1f %.3f\r\n",
- pumpPressure.pressureKPA, pumpPressure.pressurePSI, pumpPressure.temperatureC, pumpPressure.temperatureF, pumpPressure.status,
- mixerPressure.pressureKPA, mixerPressure.pressurePSI, mixerPressure.temperatureC, mixerPressure.temperatureF, mixerPressure.status,
+ 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,
- sfm7033.flow.u16, (((float)sfm7033.flow.i16 / 2) / sfm7033.scaleFactor.u16), sfm7033.flowUnitStr,
- (double)pot1*18, ((double)pot2)*pumpMaxPSI);//, agentlevel;
+ 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();
@@ -121,97 +147,42 @@
}
}
-void update_lcd()
-{
- Timer timer;
- timer.start();
- while (true) {
- float flow = ((((float)sfm7033.flow.i16 / 2) / sfm7033.scaleFactor.u16) < 0 ? 0 : (((float)sfm7033.flow.i16 / 2) / sfm7033.scaleFactor.u16));
- flow = flow/1000;
- stdio_m.lock();
- timer.reset();
- lcd.cls();
- lcd.font((unsigned char*)ArialR12x14);
- lcd.locate(0, 0);
- lcd.printf("%.2f slpm AA: %.1f", flow, (double)pot1*18);
- lcd.locate(0, 14);
- lcd.printf("PV: %.1f", pumpPressure.pressurePSI);
- lcd.locate(64, 14);
- lcd.printf("SV: %.1f", ((double)pot2)*pumpMaxPSI);
- int wait = (1000 - timer.read_ms());
- stdio_m.unlock();
- Thread::wait(wait);
- }
-}
-
-void update_shutoff()
-{
- Timer timer;
- timer.start();
- while (true) {
- float threshold = 0.1;
- timer.reset();
- if((double)pot1 < 0.05) {
- shutoff.off();
- //pc.printf("shutoff off\r\n");
- //Thread::wait(1000);
- }
- if((double)pot1 >= 0.1) {
- shutoff.on();
- //pc.printf("shutoff on\r\n");
- //Thread::wait(1000);
- }
- int wait = (200 - timer.read_ms());
- Thread::wait(wait);
- }
-}
-
// main() runs in its own thread in the OS
int main()
{
pump_init();
- ledBlu = 1;
+ //ledBlu = 1;
pc.printf("Serenity Starting up...\n\r");
- /*pc.printf("Pmin: %.03f Pmax: %.03f\r\n", pumpPressure.pmin, pumpPressure.pmax);
- pc.printf("Year: %d Month: %d Day: %d Mode: %d\r\n", pumpPressure.year, pumpPressure.month, pumpPressure.day, pumpPressure.mode);
- pc.printf("Status: 0x%x\r\n", pumpPressure.getStatus());*/
+//--------------------------------------------
+dutycycleup.rise(&dutycycleincrease);
+dutycycledown.rise(&dutycycledecrease);
+frequencyup.rise(&frequencyincrease);
+frequencydown.rise(&frequencydecrease);
-
- // Thread to turn shutoff valve on/off
- update_shutoff_t.set_priority(osPriorityHigh);
- update_shutoff_t.start(update_shutoff);
+ //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);
-
- // Thread to poll airflow sensor
- update_airflow_t.set_priority(osPriorityNormal);
- update_airflow_t.start(update_airflow);
+ update_pressures_t.start(update_pressures);
- // Thread to poll level sensor
- //update_level_t.set_priority(osPriorityIdle);
- //update_level_t.start(update_level);
-
- // Thread to update lcd
- update_lcd_t.set_priority(osPriorityIdle);
- update_lcd_t.start(update_lcd);
+ // 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) {
- //pc.printf("%.02fkPa %.02fpsi %.02fC %.02fF\r\n", pumpPressure.pressureKPA, pumpPressure.pressurePSI, pumpPressure.temperatureC, pumpPressure.temperatureF);
- if((double)pot1 >= 0.1) {
- injector.on();
- }
- //pc.printf("shutoff on\r\n");
- Thread::wait(5);
-
- injector.off();
- //pc.printf("shutoff off\r\n");*/
- Thread::wait(495);
+ pump_tach_update();
+
}
}
--- a/main.h Mon Jul 24 15:38:39 2017 +0000 +++ b/main.h Wed Jul 26 14:03:10 2017 +0000 @@ -7,9 +7,25 @@ #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 -Coil shutoff(PE_5, 5000, 40, 6); // Shutoff valve, 5ms spike time, 25kHz PWM at 15% duty cycle -Coil injector(PF_8, 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 @@ -30,6 +46,7 @@ // Gas flow sensor defines #define SFM7033_ADDR 0x40 +#define SFM7034_ADDR 0x40 // End gas flow sensor defines // Liquid pump defines @@ -41,12 +58,12 @@ #define pumpPwmFrequency 1000 // Frequency of PWM signal supplied to pump #define pumpTachPoles 6 // 6 pulses per revolution -#define pumpTachPin PE_7 // Pump tach input (green wire) -#define pumpCtrlPin PE_10 // Pump control (white wire) +#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_airflow_t, update_level_t, update_lcd_t, update_shutoff_t; -Mutex i2c1_m, i2c2_m, stdio_m; +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 @@ -62,19 +79,17 @@ //I2CPreInit gI2C1(I2C_SDA, I2C_SCL, I2C frequency); I2CPreInit i2c1(PB_9, PB_8, 100000); -I2CPreInit i2c2(PB_11, PB_10, 100000); +I2CPreInit i2c2(PB_3, PB_10, 100000); +I2CPreInit i2c3(PB_4, PA_8, 100000); KELLER_PRESSURE pumpPressure(i2c1, 0x40); -KELLER_PRESSURE mixerPressure(i2c1, 0x41); - - // Sensirion gas flow sensor object (i2c object, i2c address, calibration field, resolution 9-16 bit) // calibration field 1: Air, 2: O2, 3: N2O -SF04 sfm7033(i2c2, SFM7033_ADDR, 1, 14); // Gas flow sensor (SFM7033) - +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 pot1(A0); AnalogIn pot2(A1); PwmOut pump(pumpCtrlPin); @@ -86,11 +101,11 @@ volatile int pumpTachCounts = 0; volatile float pumpRpm = 0; -PwmOut ledRed(PE_11); -PwmOut ledGrn(PD_15); -DigitalOut ledBlu(PF_12); +//PwmOut ledRed(PE_11); +//PwmOut ledGrn(PD_15); +//DigitalOut ledBlu(PF_12); // Level sensor -VL6180 level(i2c1); //I2C object -float agentlevel = 0; +//VL6180 level(i2c1); //I2C object +//float agentlevel = 0; #endif \ No newline at end of file
