/* * board.c * * Created on: Apr 15, 2024 * Author: colorbass */ #include "main.h" #include "board.h" extern ADC_HandleTypeDef hadc1; //TODO: //TEMP READ //GBT_TEMP_SENSORS void RELAY_Write(relay_t num, uint8_t state){ if(num==RELAY_1)HAL_GPIO_WritePin(RELAY1_GPIO_Port, RELAY1_Pin, state); if(num==RELAY_2)HAL_GPIO_WritePin(RELAY2_GPIO_Port, RELAY2_Pin, state); if(num==RELAY_3)HAL_GPIO_WritePin(RELAY3_GPIO_Port, RELAY3_Pin, state); if(num==RELAY_4)HAL_GPIO_WritePin(RELAY4_GPIO_Port, RELAY4_Pin, state); if(num==RELAY_5)HAL_GPIO_WritePin(RELAY5_GPIO_Port, RELAY5_Pin, state); if(num==RELAY_CC)HAL_GPIO_WritePin(RELAY_CC_GPIO_Port, RELAY_CC_Pin, state); } uint8_t IN_ReadInput(inputNum_t input_n){ switch(input_n){ case IN_ISO: return HAL_GPIO_ReadPin(ISO_IN_GPIO_Port, ISO_IN_Pin); break; case IN_ESTOP: return HAL_GPIO_ReadPin(IN_ESTOP_GPIO_Port, IN_ESTOP_Pin); break; case IN_FB1: return HAL_GPIO_ReadPin(IN_FB1_GPIO_Port, IN_FB1_Pin); break; case IN_FB2: return HAL_GPIO_ReadPin(IN_FB2_GPIO_Port, IN_FB2_Pin); break; case IN_SW0: return HAL_GPIO_ReadPin(IN_SW0_GPIO_Port, IN_SW0_Pin); break; case IN_SW1: return HAL_GPIO_ReadPin(IN_SW1_GPIO_Port, IN_SW1_Pin); break; case IN_0: return HAL_GPIO_ReadPin(IN0_GPIO_Port, IN0_Pin); break; case IN_ACOK: return HAL_GPIO_ReadPin(AC_OK_GPIO_Port, AC_OK_Pin); break; default: return 0; break; } } uint8_t GetBoardTemp(){ //TODO // HAL_ADC_Start(&hadc1); // start the adc // // HAL_ADC_PollForConversion(&hadc1, 100); // poll for conversion // // adc_val = HAL_ADC_GetValue(&hadc1); // get the adc value // // HAL_ADC_Stop(&hadc1); // stop adc return 0; } void Init_Peripheral(){ HAL_ADCEx_Calibration_Start(&hadc1); RELAY_Write(RELAY_1, 0); RELAY_Write(RELAY_2, 0); RELAY_Write(RELAY_3, 0); RELAY_Write(RELAY_4, 0); RELAY_Write(RELAY_5, 0); RELAY_Write(RELAY_CC, 1); } float pt1000_to_temperature(float resistance) { // Константы для PT1000 const float R0 = 1000.0; // Сопротивление при 0 °C const float C_A = 3.9083E-3f; // const float A = 3.9083e-03; // Коэффициент температурного изменения (°C^-1) // const float B = -5.775e-07; // Второй коэффициент (°C^-2) // // // Расчет температуры по формуле // float temperature = -A / (B - (R0 / resistance - 1) * A); float temperature = (resistance-R0) / ( R0 * C_A); return temperature; } float calculate_NTC_resistance(int adc_value, float Vref, float Vin, float R) { // Преобразуем значение АЦП в выходное напряжение float Vout = (adc_value / 4095.0) * Vref; // Проверяем, чтобы Vout не было равно Vin if (Vout >= Vin) { return -1; // Ошибка: Vout не может быть больше или равно Vin } // Вычисляем сопротивление термистора float R_NTC = R * (Vout / (Vin - Vout)); return R_NTC; } int16_t GBT_ReadTemp(uint8_t ch){ //TODO if(ch)ADC_Select_Channel(ADC_CHANNEL_8); else ADC_Select_Channel(ADC_CHANNEL_9); // Начало конверсии HAL_ADC_Start(&hadc1); // Ожидание окончания конверсии HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // Получение значения uint32_t adcValue = HAL_ADC_GetValue(&hadc1); // Остановка АЦП (по желанию) HAL_ADC_Stop(&hadc1); if(adcValue>4000) return 20; //Термодатчик не подключен // int adc_value = 2048; // Пример значения АЦП float Vref = 3.3; // Напряжение опорное float Vin = 5.0; // Входное напряжение float R = 1000; // Сопротивление резистора в Омах float temp = pt1000_to_temperature(calculate_NTC_resistance(adcValue, Vref, Vin, R)); return (int16_t)temp; } void ADC_Select_Channel(uint32_t ch) { ADC_ChannelConfTypeDef conf = { .Channel = ch, .Rank = 1, .SamplingTime = ADC_SAMPLETIME_28CYCLES_5, }; if (HAL_ADC_ConfigChannel(&hadc1, &conf) != HAL_OK) { Error_Handler(); } } // //uint8_t SW_GetAddr(){ // if(!HAL_GPIO_ReadPin(ADDR_0_GPIO_Port, ADDR_0_Pin)){ // if(!HAL_GPIO_ReadPin(ADDR_1_GPIO_Port, ADDR_1_Pin)){ // return 0x23; // }else{ // return 0x21; // } // // }else{ // if(!HAL_GPIO_ReadPin(ADDR_1_GPIO_Port, ADDR_1_Pin)){ // return 0x22; // }else{ // return 0x20; // } // // } //}