Added changing blood pressure and an extended running average

Blood pressure PID target now changes depending on the solenoid valve state. Also extended the running average to measure the pressure to 15 values for better accuracy. Retuned PID loop so it works MUCH better. The whole thing still needs a lot of work but the system might be ready for primetime.
This commit is contained in:
Cynopolis
2020-03-10 15:56:26 -05:00
parent 0dd361cc7b
commit facabc9883

View File

@@ -9,12 +9,12 @@
double motorSpeed = 0; // 0 to 255 double motorSpeed = 0; // 0 to 255
int heartRate = 60; // Controls the speed of the valve actuation (Typically 50-120) int heartRate = 60; // Controls the speed of the valve actuation (Typically 50-120)
double pressure = 0; // pressure read from transducer in kPa double pressure = 0; // pressure read from transducer in PSI
double targetPressure = 3; //target pressure the system should be at in kPa. (Typically 5-25kPa) double targetPressure = 1.5; //target pressure the system should be at in PSI. (Typically 0.5-5PSI)
String data = ""; String data = "";
double runningPressure[10] = {0,0,0,0,0,0,0,0,0,0}; double runningPressure[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
PID pressurePID(&pressure, &motorSpeed, &targetPressure, 0.1, 12, 0.19, DIRECT); PID pressurePID(&pressure, &motorSpeed, &targetPressure, 6.5, 0.8, 0.03, DIRECT);
double getPressure(){ double getPressure(){
//pressure = map(analogRead(pressurePin), 0, 1023, 0, 80)-54; // 0 - 1023. (0 - 80 PSI) //pressure = map(analogRead(pressurePin), 0, 1023, 0, 80)-54; // 0 - 1023. (0 - 80 PSI)
@@ -25,7 +25,7 @@ double getPressure(){
} }
runningPressure[9] = map(analogRead(pressurePin), 0, 1023, 0, 80)-7; runningPressure[9] = map(analogRead(pressurePin), 0, 1023, 0, 80)-7;
sum += runningPressure[9]; sum += runningPressure[9];
pressure = sum/10; pressure = sum/15;
return pressure; return pressure;
} }
@@ -36,14 +36,17 @@ void setMotorSpeed(int motorSpeed){
else{ else{
analogWrite(motorPin, motorSpeed); analogWrite(motorPin, motorSpeed);
} }
//printPID(); printPID();
} }
void heartBeat(){ //turns the valves on and off to simulate one heart beat void heartBeat(){ //turns the valves on and off to simulate one heart beat
if(heartRate <= 0){return;} if(heartRate <= 0){return;}
double systolic = targetPressure*2;
double diastolic = targetPressure;
int delayTime = (60000)/(heartRate*2); // half the time of a single heartbeat in ms int delayTime = (60000)/(heartRate*2); // half the time of a single heartbeat in ms
digitalWrite(valvePin1, HIGH); digitalWrite(valvePin1, HIGH);
//delay(delayTime); targetPressure = systolic;
unsigned long startTime = millis(); unsigned long startTime = millis();
while(millis()-startTime < delayTime){ while(millis()-startTime < delayTime){
getPressure(); getPressure();
@@ -52,6 +55,7 @@ void heartBeat(){ //turns the valves on and off to simulate one heart beat
} }
digitalWrite(valvePin1, LOW); digitalWrite(valvePin1, LOW);
digitalWrite(valvePin2, HIGH); digitalWrite(valvePin2, HIGH);
targetPressure = diastolic;
//delay(delayTime); //delay(delayTime);
startTime = millis(); startTime = millis();
while(millis()-startTime < delayTime){ while(millis()-startTime < delayTime){
@@ -73,7 +77,7 @@ void processString(){
targetPressure = data.substring(5, data.length()).toDouble(); targetPressure = data.substring(5, data.length()).toDouble();
Serial.print("Target Pressure set to "); Serial.print("Target Pressure set to ");
Serial.print(targetPressure); Serial.print(targetPressure);
Serial.println(" kPa."); Serial.println(" PSI.");
} }
else if (data.substring(0, 5) == "FILL "){ else if (data.substring(0, 5) == "FILL "){
int fillTime = data.substring(5, data.length()).toInt(); int fillTime = data.substring(5, data.length()).toInt();