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.
pump.cpp
00001 #include "mbed.h" 00002 #include "pump.h" 00003 #include "light.h" 00004 #include "debug.h" 00005 #include "wifi_events.h" 00006 00007 // According to specification for DM212 pump PWM period is 15 ms. new pump driver period 4-2019 00008 #define PUMP_PWM_PERIOD_US 15000 00009 00010 // Pulse width for DM212 pump can be 1-2 ms, 00011 // where 1 ms - pump is off, 2 ms - pump is on with maximum speed. new pump driver parameters 4-2019 00012 #define PUMP_PULSE_WIDTH_MIN_US 1000 00013 #define PUMP_PULSE_WIDTH_MAX_US 2000 00014 00015 // Zero pulse width is used to disable pulse 00016 #define PUMP_DISABLE_PULSE 0 00017 00018 // Time to wait to be sure that signal sent 3 times. 00019 // Measured during experiments, can be tuned in the future. 00020 #define PUMP_DELAY_MS 500 00021 00022 // File with pump parameters 00023 #define PUMP_FILE "/" FSNAME "/Parameters/pump.sys" 00024 00025 // Measurements number for pump feedback 00026 #define PUMP_FEEDBACK_NUM_MEASUREMENTS 10 00027 00028 // Maximum period for RPM feedback 00029 #define PUMP_FEEDBACK_MAX_PERIOD 0.5 00030 00031 // Pump polynom coefficients 00032 // Default values for ideal pump (linear dependency) 00033 static float a = -50.0; 00034 static float b = 0.02; 00035 static float c = 0.0; 00036 00037 // PWM out to handle pump 00038 static PwmOut pumpPwm(p26); 00039 00040 // Feedback timer 00041 static Timer feedbackTimer; 00042 00043 // Feedback interrupt 00044 static InterruptIn feedbackInterrupt(p18); 00045 00046 // Latest applied pump intensity 00047 static float lastIntensity; 00048 00049 float intensity; 00050 00051 // Latest average feedback period 00052 static float feedbackPeriod; 00053 00054 static void feedbackRise(void) 00055 { 00056 static float periodSum = 0; 00057 static int numMeasureaments = 0; 00058 00059 // Read period 00060 float period = feedbackTimer.read(); 00061 feedbackTimer.reset(); 00062 00063 if (period > PUMP_FEEDBACK_MAX_PERIOD) { 00064 periodSum = 0; 00065 numMeasureaments = 0; 00066 feedbackPeriod = 0; 00067 return; 00068 } 00069 00070 periodSum += period; 00071 numMeasureaments++; 00072 00073 if (numMeasureaments >= PUMP_FEEDBACK_NUM_MEASUREMENTS) { 00074 feedbackPeriod = periodSum / numMeasureaments; 00075 periodSum = 0; 00076 numMeasureaments = 0; 00077 } 00078 } 00079 00080 void pumpInit(void) 00081 { 00082 // Configure PWM period 00083 pumpPwm.period_us(PUMP_PWM_PERIOD_US); 00084 00085 // Turn pump off 00086 pumpPwm.pulsewidth_us(PUMP_PULSE_WIDTH_MIN_US); 00087 00088 // Wait to be sure that signal sent 3 times. 00089 wait_ms(PUMP_DELAY_MS); 00090 00091 // Disable pump pulse. 00092 pumpPwm.pulsewidth_us(PUMP_DISABLE_PULSE); 00093 00094 00095 // Read parameters 00096 FILE* paramFile = fopen(PUMP_FILE, "r"); 00097 if (paramFile != NULL) { 00098 fscanf(paramFile, "%f,%f,%f", &a, &b, &c); 00099 fclose(paramFile); 00100 } 00101 00102 INFO("Used pump coefficients: a=%f, b=%0.6f, c=%0.9f", a, b, c); 00103 00104 // Set callback for feedback 00105 feedbackInterrupt.rise(&feedbackRise); 00106 feedbackTimer.start(); 00107 } 00108 00109 void pumpSet(float intensity) 00110 { 00111 if (intensity > PUMP_MAX_INTENSITY) { 00112 // Don't support intensity more than 100% 00113 ERROR("Request to set too big pump intensity %f", intensity); 00114 return; 00115 } 00116 00117 if (lastIntensity == intensity) { 00118 INFO("Discard request to set pump intensity, intensity %f already applied", intensity); 00119 return; 00120 } 00121 00122 lastIntensity = intensity; 00123 00124 // As PWM interface for LPC1768 uses the same period for all PWM outs 00125 // read lignt intensity, turn light off and set it back when pump operation finished. 00126 unsigned char lightIntensity = lightRead(); 00127 00128 // Configure PWM period and set pulse for pump. 00129 pumpPwm.period_us(PUMP_PWM_PERIOD_US); 00130 00131 // Set light off 00132 lightSet(LIGHT_OFF_INTENSITY); 00133 00134 int pulseWidth = PUMP_PULSE_WIDTH_MIN_US + 00135 (PUMP_PULSE_WIDTH_MAX_US - PUMP_PULSE_WIDTH_MIN_US) * intensity / PUMP_MAX_INTENSITY; 00136 pumpPwm.pulsewidth_us(pulseWidth); 00137 00138 // Wait to be sure that signal sent 3 times. 00139 wait_ms(PUMP_DELAY_MS); 00140 00141 // Disable pump pulse. 00142 pumpPwm.pulsewidth_us(PUMP_DISABLE_PULSE); 00143 00144 // Return light intensity back. 00145 lightSet(lightIntensity); 00146 } 00147 00148 void pumpSetRpm(int rpm) 00149 { 00150 // Calculate intensity according to provided RPM 00151 float intensity = a + b * rpm + c * rpm * rpm; 00152 00153 if (intensity < PUMP_MIN_INTENSITY) { 00154 intensity = PUMP_OFF_INTENSITY; 00155 } 00156 if (intensity > PUMP_MAX_INTENSITY) { 00157 intensity = PUMP_MAX_INTENSITY; 00158 } 00159 00160 DEBUG1("Set pump intensity: %f", intensity); 00161 pumpSet(intensity); 00162 } 00163 00164 bool pumpOn(void) 00165 { 00166 return (lastIntensity > PUMP_OFF_INTENSITY); 00167 } 00168 00169 unsigned char pumpCurrentIntensity(void) 00170 { 00171 return lastIntensity; 00172 } 00173 00174 unsigned int pumpSpeed(void) 00175 { 00176 // Calculate pump speed 00177 unsigned int speed = 0; 00178 00179 if (pumpCurrentIntensity() == 0) { 00180 return 0; 00181 } 00182 00183 if (feedbackPeriod > 0.0) { 00184 speed = 60 / feedbackPeriod; 00185 00186 } 00187 DEBUG1("Pump speed: %u", speed); 00188 00189 static bool pumpErrorSent = false; 00190 if (speed != 0) { 00191 pumpErrorSent = false; 00192 } else if (!pumpErrorSent) { 00193 wifiEventsSendErrorsInd(ERROR_PUMP_RPM_NULL); 00194 pumpErrorSent = true; 00195 } 00196 00197 return speed; 00198 } 00199 00200 void pumpGetParams(float* aValue, float* bValue, float* cValue) 00201 { 00202 *aValue = a; 00203 *bValue = b; 00204 *cValue = c; 00205 } 00206 00207 void pumpSetParams(float aValue, float bValue, float cValue) 00208 { 00209 a = aValue; 00210 b = bValue; 00211 c = cValue; 00212 00213 FILE* paramFile = fopen(PUMP_FILE, "w"); 00214 fprintf(paramFile, "%f,%0.6f,%0.9f", a, b, c); 00215 fclose(paramFile); 00216 }
Generated on Tue Sep 27 2022 18:47:00 by
1.7.2