Fixed issues related to Temperature and EC

This commit is contained in:
2026-08-11 11:25:47 +01:00
parent ebb76da3b0
commit 1b19d8035b
12 changed files with 12292 additions and 12821 deletions
+132 -40
View File
@@ -15,8 +15,6 @@ volatile AD5934_State_t ad5934_state = AD5934_IDLE;
volatile uint32_t state_timer = 0;
volatile uint32_t g_ms_counter = 0; /* Incrementado a cada 1ms no Timer */
float reference_resistor = 0, temperature_RTD = 0, thermal_compensaded_EC = 0;
uint8_t current_mux_channel = 0;
uint8_t current_hw_mux_connection = AD5934_CH_REF100R_LOW_GAIN; // Connection
uint8_t current_ec_mux = AD5934_CH_EC_MID_GAIN;
@@ -27,13 +25,20 @@ uint8_t sweep_count = 0; /* Conta quantos sweeps foram feitos no canal atual (0
AD5934_filter_t g_rtd_filter = {0};
AD5934_filter_t g_ec_filter = {0};
AD5934_filter_t g_ref_filter = {0};
AD5934_filter_t g_ref_100R_LowGain_filter = {0};
AD5934_filter_t g_ref_100R_MidGain_filter = {0};
AD5934_filter_t g_ref_100R_HighGain_filter = {0};
AD5934_filter_t g_ref_1K_MidGain_filter = {0};
AD5934_filter_t g_ref_1K_HighGain_filter = {0};
AD5934_filter_t g_ref_10K_HighGain_filter = {0};
int16_t rtd_now, ref_now, ec_now;
int16_t rtd_now_i, ref_now_i, ec_now_i;
uint8_t is_new_channel = 1;
uint8_t is_startup=1;
/******************************************************************************
* @brief Set an AD5934 internal register value.
*
@@ -165,7 +170,7 @@ void AD5934_Init(void)
AD5934_SetRegisterValue(AD5934_NR_INCR_REG_LB, AD5934_STEP_FREQ_0, 2);
// Set 128 Settling Time
AD5934_SetRegisterValue(AD5934_NR_SETTLE_REG_LB, AD5934_SETTLING_TIME_64, 2);
AD5934_SetRegisterValue(AD5934_NR_SETTLE_REG_LB, AD5934_SETTLING_TIME_90, 2);
}
@@ -232,20 +237,24 @@ void AD5934_StopSweep(void)
*
* @return Temperature in Celsius.
******************************************************************************/
float AD5934_Calculate_Temperature(float mag_ref, float mag_dut)
float AD5934_Calculate_Temperature(float mag_ref_pt100, float mag_ref_pt1000, float mag_dut)
{
uint8_t ch_ref;
float gain_factor, impedance_dut, temperature;
float gain_factor, temperature, drift, mag_ref;
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_SET) // OFF = PT1000, ON = PT100, PA7 has internal pull-up and switch connects to GND
{
ch_ref = AD5934_CH_RTD_LOW_GAIN; //PT100
gain_factor = AD5934_GAIN_FACTOR_100R;
drift = AD5934_DRIFT_PT100;
mag_ref = mag_ref_pt100;
}
else
{
ch_ref = AD5934_CH_RTD_MID_GAIN; //PT1000
gain_factor = AD5934_GAIN_FACTOR_1K;
drift = AD5934_DRIFT_PT1000;
mag_ref = mag_ref_pt1000;
}
float ratio_mag = mag_ref / mag_dut;
@@ -254,7 +263,8 @@ float AD5934_Calculate_Temperature(float mag_ref, float mag_dut)
/*if(ch_ref==AD5934_CH_REF100R_LOW_GAIN) // only for PT100
impedance_dut = AD5934_Linear_Correction(gain_factor * ratio_mag);
else*/
impedance_dut = gain_factor * ratio_mag;
float impedance_dut = gain_factor * ratio_mag;
// Calculate impedance ratio with the Reference Resistor
float ratio = impedance_dut / gain_factor;
@@ -273,7 +283,7 @@ float AD5934_Calculate_Temperature(float mag_ref, float mag_dut)
temperature = (ratio - 1.0f) / AD5934_RTD_ALPHA;
}
return AD5934_Round_Float_Precision(temperature,1);
return AD5934_Round_Float_Precision((temperature-drift),2);
}
@@ -292,7 +302,7 @@ float AD5934_EC_Compensate_Magnitude_To_25C(float mag_dut, float temperature_dut
if (factor < 0.1f)
factor = 0.1f;
return (mag_dut / factor);
return (AD5934_Round_Float_Precision((mag_dut / (factor)),2));
}
/**
@@ -393,7 +403,45 @@ float AD5934_GetImpedance(float mag_ref, float mag_dut)
return impedance_dut;
}
/******************************************************************************
* @brief Get Real and Imaginary values and calculate Magnitude.
*
* @param: none
*
* @return Magnitude (float).
******************************************************************************/
float AD5934_GetAdmittance(float mag_ref_10mS_MidGain, float mag_ref_1mS_MidGain, float mag_ref_1mS_HighGain, float mag_ref_0_1mS_HighGain, float mag_dut)
{
uint8_t ch_ref;
float mag_ref_Min, mag_ref_Max, res_ref_Min, res_ref_Max;
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET) // Hardware Setup: Gain Selection (PA6)
{
ch_ref = AD5934_CH_EC_HIGH_GAIN; // 5mS
mag_ref_Min = mag_ref_0_1mS_HighGain; // Ref 10k
mag_ref_Max = mag_ref_1mS_HighGain; // Ref 1K
res_ref_Min = AD5934_EC_0_1MS;
res_ref_Max = AD5934_EC_1MS;
}
else
{
ch_ref = AD5934_CH_EC_MID_GAIN; //10mS
mag_ref_Min = mag_ref_1mS_MidGain; // Ref 1K
mag_ref_Max = mag_ref_10mS_MidGain; // Ref 100R
res_ref_Min = AD5934_EC_1MS;
res_ref_Max = AD5934_EC_10MS;
}
float gain_factor = (res_ref_Max - res_ref_Min)/(mag_ref_Max - mag_ref_Min);
float offset = mag_ref_Max - (res_ref_Max/gain_factor);
float admittance = (mag_dut - offset) * gain_factor;
float y_cell = admittance / (1 - (AD5934_EC_IN_SERIES_RESISTOR * admittance)); // Resistor in series with EC is 100 Ohms on PCB
return (y_cell*1000000); // in uS
}
/******************************************************************************
* @brief Get Real and Imag values from Magnitude.
*
@@ -531,17 +579,11 @@ void AD5934_Process_System(void)
break;
case AD5934_WAIT_MUX:
//if ((g_ms_counter - state_timer) >= AD5934_SYNC_MUX_SETTLING) // Wait until AD715 Mux switch stability
//{
HAL_Delay(15);
ad5934_state = AD5934_START_CONVERSION;
//}
HAL_Delay(15);
ad5934_state = AD5934_START_CONVERSION;
break;
case AD5934_START_CONVERSION:
//state_timer = g_ms_counter; // Starts to count the Burst period for the sweeps
/* DECISÃO DE COMANDO: Novo canal vs Leituras sucessivas */
if (is_new_channel) // Decision: Channel Switched or Next Sample in the Burst ?
{
@@ -554,7 +596,6 @@ void AD5934_Process_System(void)
}
ad5934_state = AD5934_WAIT_CONVERSION; // Next State
break;
case AD5934_WAIT_CONVERSION:
@@ -570,20 +611,27 @@ void AD5934_Process_System(void)
{
case AD5934_ID_RTD:
AD5934_RTD_NewSample(mag_float);
rtd_now = mag_float;
rtd_now_i = mag_imag;
break;
case AD5934_ID_EC:
AD5934_EC_NewSample(mag_float);
ec_now = mag_real;
ec_now_i = mag_imag;
break;
case AD5934_ID_REF:
AD5934_Reference_NewSample(mag_float);
ref_now = mag_float;
ref_now_i = mag_imag;
case AD5934_ID_REF_100R_LOWGAIN:
AD5934_Reference_100R_LowGain_NewSample(mag_float);
break;
case AD5934_ID_REF_100R_MIDGAIN:
AD5934_Reference_100R_MidGain_NewSample(mag_float);
break;
case AD5934_ID_REF_100R_HIGHGAIN:
AD5934_Reference_100R_HighGain_NewSample(mag_float);
break;
case AD5934_ID_REF_1K_MIDGAIN:
AD5934_Reference_1K_MidGain_NewSample(mag_float);
break;
case AD5934_ID_REF_1K_HIGHGAIN:
AD5934_Reference_1K_HighGain_NewSample(mag_float);
break;
case AD5934_ID_REF_10K_HIGHGAIN:
AD5934_Reference_10K_HighGain_NewSample(mag_float);
break;
}
if(sweep_count<(AD5934_BURST_SIZE-1))
@@ -602,7 +650,7 @@ void AD5934_Process_System(void)
case AD5934_SWITCH_MUX:
AD5934_StopSweep(); // Put AD5934 in Standby
current_mux_channel = (uint8_t)((current_mux_channel + 1) % 3); // Pointer to the next channel (Circular Buffer 0 to 2)
current_mux_channel = (uint8_t)((current_mux_channel + 1) % 8); // Pointer to the next channel (Circular Buffer 0 to 7)
switch (current_mux_channel)
{
case AD5934_ID_RTD:
@@ -619,19 +667,30 @@ void AD5934_Process_System(void)
current_ec_mux = current_hw_mux_connection = AD5934_CH_EC_MID_GAIN;
break;
case AD5934_ID_REF:
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_SET) // OFF = PT1000, ON = PT100, PA7 has internal pull-up and switch connects to GND
current_ref_mux = current_hw_mux_connection = AD5934_CH_REF100R_LOW_GAIN; // 100 Ohms Reference Resistor
else
current_ref_mux = current_hw_mux_connection = AD5934_CH_REF1K_MID_GAIN; // 1K Reference Resistor
case AD5934_ID_REF_100R_LOWGAIN:
current_ref_mux = current_hw_mux_connection = AD5934_CH_REF100R_LOW_GAIN; // 100 Ohms Reference Resistor
break;
case AD5934_ID_REF_100R_MIDGAIN:
current_ref_mux = current_hw_mux_connection = AD5934_CH_REF100R_MID_GAIN; // 100 Ohms Reference Resistor
break;
case AD5934_ID_REF_100R_HIGHGAIN:
current_ref_mux = current_hw_mux_connection = AD5934_CH_REF100R_HIGH_GAIN; // 100 Ohms Reference Resistor
break;
case AD5934_ID_REF_1K_MIDGAIN:
current_ref_mux = current_hw_mux_connection = AD5934_CH_REF1K_MID_GAIN; // 1K Reference Resistor
break;
case AD5934_ID_REF_1K_HIGHGAIN:
current_ref_mux = current_hw_mux_connection = AD5934_CH_REF1K_HIGH_GAIN; // 1K Reference Resistor
break;
case AD5934_ID_REF_10K_HIGHGAIN:
current_ref_mux = current_hw_mux_connection = AD5934_CH_REF10K_HIGH_GAIN; // 1K Reference Resistor
break;
}
ADG715_SetChannels(current_hw_mux_connection); // Change the analog mux
HAL_Delay(12);
is_new_channel = 1; // Channel Switched
//state_timer = g_ms_counter; // Reload timer to wait for stability
//ad5934_state = AD5934_WAIT_MUX; // Next State
ad5934_state = AD5934_START_CONVERSION;
ad5934_state = AD5934_START_CONVERSION; // Next State
break;
}
}
@@ -738,7 +797,7 @@ void AD5934_Process_Sample(AD5934_filter_t *ch, float raw)
/* Final output: combines the IIR state (fast response to real drift)
* with the window average (more stable, slower response). Adjust
* the weighting per channel if needed. */
ch->filtered_value = 0.65f * ch->iir_state + 0.35f * window_average;
ch->filtered_value = 0.9f * ch->iir_state + 0.1f * window_average;
//ch->filtered_value = window_average;
ch->value_valid = 1;
}
@@ -790,12 +849,45 @@ void AD5934_EC_NewSample(float raw)
/* Call this every time a sweep completes with the mux on the on-board
* precision reference resistor channel */
void AD5934_Reference_NewSample(float raw)
void AD5934_Reference_100R_LowGain_NewSample(float raw)
{
AD5934_Process_Sample(&g_ref_filter, raw);
AD5934_Process_Sample(&g_ref_100R_LowGain_filter, raw);
}
/* Call this every time a sweep completes with the mux on the on-board
* precision reference resistor channel */
void AD5934_Reference_100R_MidGain_NewSample(float raw)
{
AD5934_Process_Sample(&g_ref_100R_MidGain_filter, raw);
}
/* Call this every time a sweep completes with the mux on the on-board
* precision reference resistor channel */
void AD5934_Reference_100R_HighGain_NewSample(float raw)
{
AD5934_Process_Sample(&g_ref_100R_HighGain_filter, raw);
}
/* Call this every time a sweep completes with the mux on the on-board
* precision reference resistor channel */
void AD5934_Reference_1K_MidGain_NewSample(float raw)
{
AD5934_Process_Sample(&g_ref_1K_MidGain_filter, raw);
}
/* Call this every time a sweep completes with the mux on the on-board
* precision reference resistor channel */
void AD5934_Reference_1K_HighGain_NewSample(float raw)
{
AD5934_Process_Sample(&g_ref_1K_HighGain_filter, raw);
}
/* Call this every time a sweep completes with the mux on the on-board
* precision reference resistor channel */
void AD5934_Reference_10K_HighGain_NewSample(float raw)
{
AD5934_Process_Sample(&g_ref_10K_HighGain_filter, raw);
}
/*****************************************************************************
* ADG715
+23 -87
View File
@@ -90,9 +90,10 @@ int main(void)
uint32_t previous_millis_red = 0;
uint32_t current_millis;
float ref_final;
float reference_resistor_100R = 0, reference_resistor_1K = 0, temperature_RTD = 0, thermal_compensaded_EC = 0;
float mag_reference, mag_rtd, mag_ec;
float mag_rtd_reference = 0, mag_ec_reference = 0, mag_rtd = 0, mag_ec = 0;
/* USER CODE END 1 */
@@ -125,9 +126,6 @@ int main(void)
HAL_TIM_Base_Start_IT(&htim3);
//AD5934_MovingAvg_Init (&g_rtd_filter);
//AD5934_MovingAvg_Init (&g_ref_filter);
//AD5934_MovingAvg_Init (&g_ec_filter);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); // LED Green Off
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); // LED Red Off
@@ -143,7 +141,7 @@ int main(void)
/* Infinite loop */
/* USER CODE BEGIN WHILE */
/*
while(averages<20)
{
AD5934_Process_System();
@@ -151,28 +149,15 @@ int main(void)
current_millis = g_ms_counter;
if((current_millis % 20) == 0) // Send data each 20ms
if((current_millis % 100) == 0) // Send data each 40ms
{
if (g_ref_imag_filter.value_valid) // Reference Resistor on Board: 100 Ohms or 1000 Ohms
{
//reference_resistor = g_ref_filter.filtered_value;
reference_resistor = sqrtf((g_ref_real_filter.filtered_value * g_ref_real_filter.filtered_value)+(g_ref_imag_filter.filtered_value * g_ref_imag_filter.filtered_value));
//reference_resistor = ref_now;
//uint16_t reference_final = AD5934_REF_OUT_SCALE_MAX - AD5934_Compress_To_IntScale(g_ref_filter.filtered_value, current_ref_mux);
averages++;
}
averages++;
}
}
*/
digital_outputs_toggle(0);
digital_outputs_toggle(1);
digital_outputs_toggle(2);
digital_outputs_toggle(3);
digital_outputs_toggle(4);
digital_outputs_toggle(5);
digital_outputs_toggle(6);
digital_outputs_toggle(7);
while (1)
@@ -181,88 +166,38 @@ int main(void)
AD5934_Process_System();
ADS1015_Process_System();
current_millis = g_ms_counter;
if((current_millis % 500) == 0) // Send data each 100ms
{
//if (g_ref_filter.value_valid) // Reference Resistor on Board: 100 Ohms or 1000 Ohms
//{
mag_reference = g_ref_filter.filtered_value;
//mag_reference = sqrtf(((float)ref_now * (float)ref_now) + ((float)ref_now_i * (float)ref_now_i));
//mag_reference = sqrtf((g_ref_real_filter.average * g_ref_real_filter.average)+(g_ref_imag_filter.average * g_ref_imag_filter.average));
//mag_reference = (float)ref_now;
//reference_resistor = g_ref_filter.filtered_value;
//uint16_t reference_final = AD5934_REF_OUT_SCALE_MAX - AD5934_Compress_To_IntScale(g_ref_filter.filtered_value, current_ref_mux);
//intToStr(reference_final, tempString);
//ref_final = g_ref_filter.filtered_value;
FloatToString(tempString, mag_reference);
//Convert2Hex(ref_now, tempString);
//intToStr(ref_now, tempString);
rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
//intToStr(ref_now_i, tempString);
//rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
rs485_send_broadcast(&newline, 1);
//}
//if (g_rtd_filter.value_valid) // PT100 or PT1000 in °C
//{
//mag_rtd = (float)rtd_now;
mag_rtd = g_rtd_filter.filtered_value;
//mag_rtd = sqrtf((g_rtd_real_filter.average * g_rtd_real_filter.average)+(g_rtd_imag_filter.average * g_rtd_imag_filter.average));
//mag_rtd = sqrtf(((float)rtd_now * (float)rtd_now) + ((float)rtd_now_i * (float)rtd_now_i));
//temperature_RTD = AD5934_Calculate_Temperature(mag_reference, mag_rtd);
temperature_RTD = AD5934_Calculate_Temperature(mag_reference,mag_rtd);// AD5934_GetImpedance(mag_reference,mag_rtd);//
//uint16_t rtd_final = AD5934_RTD_OUT_SCALE_MAX - AD5934_Compress_To_IntScale(g_rtd_filter.filtered_value, current_rtd_mux);
//uint16_t rtd_final = AD5934_Compress_To_IntScale(temperature_RTD, current_rtd_mux);
//intToStr(rtd_final, tempString);
//float rtd_final = g_rtd_filter.filtered_value; //g_rtd_filter.filtered_value;
FloatToString(tempString, temperature_RTD);
//Convert2Hex(rtd_now, tempString);
//intToStr(rtd_now, tempString);
rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
//Convert2Hex(rtd_now_i, tempString);
//intToStr(rtd_now_i, tempString);
//rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
rs485_send_broadcast(&newline, 1);
//}
/*if (g_rtd_imag_filter.value_valid) // PT100 or PT1000 in °C
if (g_rtd_filter.value_valid) // PT100 or PT1000 in °C
{
//float mag_rtd = sqrtf((g_rtd_real_filter.filtered_value * g_rtd_real_filter.filtered_value)+(g_rtd_imag_filter.filtered_value * g_rtd_imag_filter.filtered_value));
temperature_RTD = AD5934_Calculate_Temperature(reference_resistor, mag_rtd);
temperature_RTD = AD5934_Calculate_Temperature(g_ref_100R_LowGain_filter.filtered_value, g_ref_1K_MidGain_filter.filtered_value, g_rtd_filter.filtered_value);// AD5934_GetImpedance(mag_reference,mag_rtd);//
//uint16_t rtd_final = AD5934_RTD_OUT_SCALE_MAX - AD5934_Compress_To_IntScale(g_rtd_filter.filtered_value, current_rtd_mux);
//uint16_t rtd_final = AD5934_Compress_To_IntScale(temperature_RTD, current_rtd_mux);
//intToStr(rtd_final, tempString);
float rtd_final = temperature_RTD; //g_rtd_filter.filtered_value;
FloatToString(tempString, rtd_final);
uint16_t rtd_final = AD5934_Compress_To_IntScale(temperature_RTD, current_rtd_mux);
intToStr(rtd_final, tempString);
//FloatToString(tempString, temperature_RTD);
rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
rs485_send_broadcast(&newline, 1);
}*/
//if (g_ec_filter.value_valid) // EC
//{
//mag_ec = sqrtf((g_ec_real_filter.filtered_value * g_ec_real_filter.filtered_value)+(g_ec_imag_filter.filtered_value * g_ec_imag_filter.filtered_value));
mag_ec = sqrtf(((float)ec_now * (float)ec_now) + ((float)ec_now_i * (float)ec_now_i));
}
if (g_ec_filter.value_valid) // EC
{
mag_ec = AD5934_GetAdmittance(g_ref_100R_MidGain_filter.filtered_value, g_ref_1K_MidGain_filter.filtered_value, g_ref_1K_HighGain_filter.filtered_value, g_ref_10K_HighGain_filter.filtered_value, g_ec_filter.filtered_value);
thermal_compensaded_EC = AD5934_EC_Compensate_Magnitude_To_25C(mag_ec, temperature_RTD);
//uint16_t ec_final = AD5934_Compress_To_IntScale(thermal_compensaded_EC, current_ec_mux);
//intToStr(ec_now, tempString);
// float ec_final = g_ec_filter.filtered_value;
FloatToString(tempString, mag_ec);
//Convert2Hex((ec_now+0x80008000), tempString);
uint16_t ec_final = AD5934_Compress_To_IntScale(mag_ec, current_ec_mux);
intToStr(ec_final, tempString);
//FloatToString(tempString, thermal_compensaded_EC);
rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
//intToStr(ec_now_i, tempString);
//rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
rs485_send_broadcast(&newline, 1);
//}
}
if (g_ph_filter.value_valid) // pH
{
uint16_t ph_final = ADS1015_Compress_To_IntScale(g_ph_filter.filtered_value);
intToStr(ph_final, tempString);
//float ph_final = g_ph_filter.filtered_value;
//FloatToString(tempString, ph_final);
@@ -275,6 +210,7 @@ int main(void)
}
// Piscar LED verde em PB4 a cada 1 segundo
if ((current_millis - previous_millis_green) >= 1000)
{