Untitled

 avatar
unknown
plain_text
2 months ago
5.9 kB
3
Indexable

uint8_t mode = 2;
// zoptymalizować typ zmiennej

//dodać konstruktor i funkcje
void standbyMode(void) {
    // Deactivate all actuators and reset necessary variables
    __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, PWM_TURBINE_MIN); // Minimal PWM
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 1300); // open PEEP valve
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 1300); //  open main valve 
    //HAL_GPIO_WritePin(GPIOB, VALVE_IN_Pin, GPIO_PIN_RESET);
    //HAL_GPIO_WritePin(GPIOB, VALVE_Pin, GPIO_PIN_RESET);
    //HAL_GPIO_WritePin(GPIOB, VALVE_BYPASS_Pin, GPIO_PIN_RESET);
    volume = 0;
    breathCounter = 0;
    pid_reset(&pidData);
    pid_reset(&pidPEEP);
}


//zmodyfikować odbiór danych z uart 

if (receive[0] == startByte && receive[9] == stopByte) {
    mode = receive[1];
    if (mode == 0) {
        maxVolume = (receive[3] << 8) | receive[2];
    } else if (mode == 1) {
        maxPressure = (receive[3] << 8) | receive[2];
    }
    inhaleTime = (receive[5] << 8) | receive[4];
    exhaleTime = (receive[7] << 8) | receive[6];
    PEEP = receive[8];
}

//zmodyfikować callback timera11 case zamiast if

        switch (mode) {
            case 0: // Flow Mode
                flowMode();
                break;

            case 1: // Pressure Mode
                pressureMode();
                break;

            case 2: // Standby Mode
                standbyMode();
                break;

            default: // Default standbyMode
                standbyMode();
                break;
        }


// nieblokujący odczyt z magistrali I2C

//konfiguracja ioc
//ic2 mode
Mode: I2C
Timing: 400kHz
Włącz Interrupt dla obsługi przerwań.

W sekcji NVIC Settings:
Zaznacz:
I2Cx Event interrupt (I2Cx_EV)
I2Cx Error interrupt (I2Cx_ER)
//timer11
        HAL_I2C_Master_Receive_IT(&hi2c3, ADDR, i2cReceiveBuf, sizeof(i2cReceiveBuf));

//callback przerwania
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
{
    if (hi2c == &hi2c3) {
        signed int res = (i2cReceiveBuf[0] << 8) | i2cReceiveBuf[1];
        flowSLM = (res - OFFSET_FLOW) / SCALE_FLOW;
    }
}

//claback obsługi błędów

void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
{
    if (hi2c == &hi2c3) {
        HAL_I2C_DeInit(hi2c);
        HAL_I2C_Init(hi2c);
    }
}

//zmienne 
uint8_t i2cReceiveBuf[2]; // Bufor na dane z czujnika przepływu
float flowSLM = 0;        // Zmienna do przechowywania wartości przepływu









/*
// add to code

pid_data pidPEEP; // PID for PEEP valve

#define PID_PEEP_KP 2.0f
#define PID_PEEP_KI 0.01f
#define PID_PEEP_KD 0.1f
#define PWM_PEEP_MAX 1700
#define PWM_PEEP_MIN 1350

#define PWM_TURBINE_MIN 10



pid_init(&pidPEEP, PID_PEEP_KP, PID_PEEP_KI, PID_PEEP_KD, 0); //PID for PEEP init


void controlPEEP(void) {
    static uint16_t pwmPEEP = PWM_PEEP_MIN; // init value for pwmPEEP

    // count new pwmPEEP with PID
    float pidOutput = pid_calculate(&pidPEEP, PEEP, pressureCmH2O);

    // min-max pwmPEEP values
    pwmPEEP += (int16_t)pidOutput;
    if (pwmPEEP > PWM_PEEP_MAX) pwmPEEP = PWM_PEEP_MAX; // Max PWM value
    if (pwmPEEP < PWM_PEEP_MIN) pwmPEEP = PWM_PEEP_MIN; // Min PWM value

    // set new PWM value for PEEP valve
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwmPEEP);
}

void pressureMode(void){
		//breath control logic
		if(breathCounter == inhaleTime)	//start of exhale phase
		{
			pwmSpeed = PWM_TURBINE_MIN;
			__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, (uint16_t)pwmSpeed);
			controlPEEP();
			HAL_GPIO_WritePin(GPIOB, VALVE_IN_Pin, 1);
			breathCounter++;

			pid_reset(&pidData);
		}
		else if (breathCounter == (inhaleTime + exhaleTime))	//start of inhale phase
		{
			__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 1700); //zamknij zawór peep
			HAL_GPIO_WritePin(GPIOB, VALVE_IN_Pin, 0);
			breathCounter = 0;
		}
		else
		{
			if(breathCounter < inhaleTime)	// in inhale phase
			{
				pwmSpeed = pid_calculate(&pidData, 35, pressureCmH2O);

                if (pwmSpeed < PWM_TURBINE_MIN) {
                pwmSpeed = PWM_TURBINE_MIN;
                }
				__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, (uint16_t)pwmSpeed);
			}
			breathCounter++;
		}
}

void flowMode(void){
	flowRate = 30; //(1/inhaleTime)*MS_TO_M; // flow rate = (Volume[L] / Inhale Time[ms]) * 60000
	if(breathCounter == inhaleTime)	//start of exhale phase
			{
				pwmSpeed = PWM_TURBINE_MIN;
				__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, (uint16_t)pwmSpeed);
				controlPEEP();
				HAL_GPIO_WritePin(GPIOB, VALVE_IN_Pin, 1);
				breathCounter++;

				pid_reset(&pidData);
				volume = 0;

			}
			else if (breathCounter == (inhaleTime + exhaleTime))	//start of inhale phase
			{
				__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 1700); // zamknij zawór peep 
				HAL_GPIO_WritePin(GPIOB, VALVE_IN_Pin, 0);
				breathCounter = 0;
			}
			else
			{
				if(breathCounter < inhaleTime)	// in inhale phase
				{
					pwmSpeed = pid_calculate(&pidData, flowRate, flowSLM);

                    if (pwmSpeed < PWM_TURBINE_MIN) {
                    pwmSpeed = PWM_TURBINE_MIN;
                    }

					__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, (uint16_t)pwmSpeed); 
				}
				if(breathCounter == 1000) {
					volume += flowSLM;
				}
				breathCounter++;
			}
}

#define PWM_SAFE_MIN_PRESSURE 10
#define PWM_SAFE_MAX_PRESSURE 50

void safetyCheck(double pressure, double minPressure, double maxPressure) {
    if (pressure < minPressure) {
    	__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, PWM_SAFE_MAX_PRESSURE);
    } else if (pressure > maxPressure) {
    	__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, PWM_SAFE_MIN_PRESSURE);
    }
    else {
        // Ciśnienie w normie
       
    }
} */



Leave a Comment