/* * 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_AUX)HAL_GPIO_WritePin(RELAY_AUX_GPIO_Port, RELAY_AUX_Pin, state); if(num==RELAY_CC)HAL_GPIO_WritePin(RELAY_CC_GPIO_Port, RELAY_CC_Pin, state); } 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_AUX, 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); // 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; } } }