Fertirrega_v6 with EC compensated by Temperature
This commit is contained in:
+43
-172
@@ -30,7 +30,6 @@
|
||||
#include "digital_outputs_driver.h"
|
||||
#include "ad5934_driver.h"
|
||||
#include "rs485_driver.h"
|
||||
#include "flash_manager.h"
|
||||
|
||||
|
||||
#include <string.h>
|
||||
@@ -43,10 +42,7 @@
|
||||
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN PD */
|
||||
#define AVG_SLOPE (4.3F)
|
||||
#define V_AT_25C (1.43F)
|
||||
#define V_REF_INT (1.2F)
|
||||
#define STM32_TEMPERATURE_AVERAGES 4
|
||||
|
||||
/* USER CODE END PD */
|
||||
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
@@ -59,29 +55,6 @@
|
||||
/* USER CODE BEGIN PV */
|
||||
|
||||
|
||||
uint8_t newline[]={'\r','\n'};
|
||||
uint8_t doubleSpace[]={'_','_','\0'};
|
||||
uint8_t newline_ph[]={'_','p','H','\n','\0'};
|
||||
uint8_t newline_admi[]={'_','u','S','\n','\0'};
|
||||
uint8_t newline_temp[]={' ','°','C','\n','\0'};
|
||||
uint8_t newline_imag[]={'_','O','h','m','\n','\0'};
|
||||
uint8_t newline_485[]={'_','a','d','\n','\0'};
|
||||
uint8_t minus[]={'-',' '};
|
||||
uint8_t ad_t[]={'A','d',':',' ','\0'};
|
||||
uint8_t ph_t[]={'p','H',':',' ','\0'};
|
||||
uint8_t tm_t[]={'T','M',':',' ','\0'};
|
||||
|
||||
uint8_t main_state = STATE_RUNNING_OK;
|
||||
uint8_t rs485_address=0;
|
||||
|
||||
/*
|
||||
uint16_t AD_RES[2];
|
||||
uint8_t UpdateEvent = 0;
|
||||
float Temperature, Temp_Sum, V_Sense, V_Ref;
|
||||
float Temp_Samples[STM32_TEMPERATURE_AVERAGES]={0};
|
||||
*/
|
||||
|
||||
|
||||
/* USER CODE END PV */
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
@@ -106,16 +79,17 @@ int main(void)
|
||||
{
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
uint8_t tempString[15] = {0};
|
||||
uint8_t i;
|
||||
uint8_t mux_connection = 0;
|
||||
uint8_t tempString[15] = {0};
|
||||
|
||||
uint8_t averages = 0;
|
||||
uint8_t newline = '\n';
|
||||
|
||||
// Variables for timing
|
||||
uint32_t previous_millis_green = 0;
|
||||
uint32_t previous_millis_red = 0;
|
||||
uint32_t current_millis;
|
||||
|
||||
//float temperature_RTD, admittance_EC, refResistance, update_value, ph7_interp, ph4_interp, ph_compensated;
|
||||
|
||||
|
||||
/* USER CODE END 1 */
|
||||
|
||||
@@ -148,11 +122,6 @@ int main(void)
|
||||
|
||||
HAL_TIM_Base_Start_IT(&htim3);
|
||||
|
||||
/*
|
||||
TempSensor_Init(&hadc1);
|
||||
HAL_ADCEx_Calibration_Start(&hadc1);
|
||||
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD_RES, 2); // Internal Temperature conversion
|
||||
*/
|
||||
|
||||
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
|
||||
@@ -167,83 +136,28 @@ int main(void)
|
||||
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
/*
|
||||
for(i=0;i<AD5934_TEMP_AVERAGES;i++) // Loop to get stability and get averages
|
||||
|
||||
while(averages<15)
|
||||
{
|
||||
refResistance = AD5934_Get_Ref_Resistance(); // On Board Resistor
|
||||
temperature_RTD = AD5934_GetTemperature(refResistance); // Liquid Temperature is stored
|
||||
admittance_EC = AD5934_GetImpedance(temperature_RTD);
|
||||
ph_compensated = ADSCalculate_ph_Compensated(temperature_RTD);
|
||||
AD5934_Process_System();
|
||||
ADS1015_Process_System();
|
||||
|
||||
current_millis = g_ms_counter;
|
||||
|
||||
if((current_millis % 20) == 0) // Send data each 20ms
|
||||
{
|
||||
if (g_ref_filter.value_valid) // Reference Resistor on Board: 100 Ohms or 1000 Ohms
|
||||
{
|
||||
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);
|
||||
|
||||
averages++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3) == GPIO_PIN_RESET) // When PB3 (with internal pull up) in the Prog Header is set to GND
|
||||
{
|
||||
|
||||
main_state = STATE_PH4_DRY_EC_CALIBRATION;
|
||||
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); // Red LED On
|
||||
|
||||
for(i=0;i<(2*AD5934_TEMP_AVERAGES);i++) // Loop to get stability and get averages
|
||||
{
|
||||
flash_data.ph4_mV = ADSCalculate_ph_mV();
|
||||
temperature_RTD = AD5934_GetTemperature(refResistance); // Air Temperature is not used in the function
|
||||
flash_data.ec0_mag = AD5934_GetImpedance(temperature_RTD); // Dry Probe
|
||||
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET)
|
||||
flash_data.EC10mS_EC5mS_switch = AD5934_CH_EC_HIGH_GAIN; // 5mS/cm option
|
||||
else
|
||||
flash_data.EC10mS_EC5mS_switch = AD5934_CH_EC_MID_GAIN; //10ms/cm option
|
||||
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_SET)
|
||||
flash_data.PT100_PT1000_switch = AD5934_CH_RTD_LOW_GAIN; //PT100 option
|
||||
else
|
||||
flash_data.PT100_PT1000_switch = AD5934_CH_RTD_MID_GAIN; //PT1000 option
|
||||
|
||||
}
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET); // Green LED On
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
|
||||
|
||||
|
||||
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3) == GPIO_PIN_RESET);
|
||||
HAL_Delay(500);
|
||||
|
||||
main_state = STATE_PH7_WET_EC_CALIBRATION;
|
||||
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); // Red LED On
|
||||
|
||||
|
||||
|
||||
for(i=0;i<(2*AD5934_TEMP_AVERAGES);i++) // Loop to get stability and get averages
|
||||
{
|
||||
temperature_RTD = AD5934_GetTemperature(refResistance); // Liquid Temperature is stored
|
||||
flash_data.ec_factor = AD5934_EC_Calibrate_Temperature(temperature_RTD);
|
||||
flash_data.ph7_mV = ADSCalculate_ph_mV();
|
||||
flash_data.ec1413_mag = AD5934_GetImpedance(temperature_RTD)*flash_data.ec_factor; // Get the magnitude of the reference liquid and compensate it to 25ºC
|
||||
|
||||
}
|
||||
|
||||
ph7_interp = ADSinterpolate_ph(temperature_RTD,ADS1015_PH_7_BUFFER_ROW);
|
||||
ph4_interp = ADSinterpolate_ph(temperature_RTD,ADS1015_PH_4_BUFFER_ROW);
|
||||
|
||||
flash_data.ph_temperature = temperature_RTD;
|
||||
flash_data.ph_slope_mV = (flash_data.ph7_mV - flash_data.ph4_mV) / (ph7_interp - ph4_interp);
|
||||
flash_data.ph7_real = ph7_interp;
|
||||
|
||||
Flash_Save_Page(&flash_data); // Store Calibration parameters in Flash
|
||||
|
||||
|
||||
HAL_Delay(500);
|
||||
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET); // Green LED On
|
||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
|
||||
|
||||
|
||||
main_state = STATE_RUNNING_OK;
|
||||
|
||||
|
||||
}
|
||||
*/
|
||||
while (1)
|
||||
{
|
||||
|
||||
@@ -253,52 +167,40 @@ int main(void)
|
||||
|
||||
current_millis = g_ms_counter;
|
||||
|
||||
if((current_millis % 100) == 0) // Send data each 50ms
|
||||
if((current_millis % 100) == 0) // Send data each 100ms
|
||||
{
|
||||
|
||||
if (g_ref_filter.value_valid) // Reference Resistor on Board: 100 Ohms or 1000 Ohms
|
||||
{
|
||||
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
|
||||
mux_connection = AD5934_CH_REF100R_LOW_GAIN; // 100 Ohms Reference Resistor
|
||||
else
|
||||
mux_connection = AD5934_CH_REF1K_MID_GAIN; // 1K Reference Resistor
|
||||
|
||||
uint16_t reference_final = AD5934_REF_OUT_SCALE_MAX - AD5934_Compress_To_IntScale(g_ref_filter.filtered_value, mux_connection);
|
||||
//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);
|
||||
// float ref_final = g_ref_filter.filtered_value;
|
||||
//FloatToString(tempString, ref_final);
|
||||
rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
|
||||
rs485_send_broadcast(newline, (strlen((uint8_t*)newline)));
|
||||
}
|
||||
|
||||
if (g_ec_filter.value_valid) // EC
|
||||
{
|
||||
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET) // Hardware Setup: Gain Selection (PA6)
|
||||
mux_connection = AD5934_CH_EC_HIGH_GAIN; // 5mS
|
||||
else
|
||||
mux_connection = AD5934_CH_EC_MID_GAIN; // 10mS
|
||||
|
||||
uint16_t ec_final = AD5934_Compress_To_IntScale(g_ec_filter.filtered_value, mux_connection);
|
||||
intToStr(ec_final, tempString);
|
||||
// float ec_final = g_ec_filter.filtered_value;
|
||||
// FloatToString(tempString, ec_final);
|
||||
rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
|
||||
rs485_send_broadcast(newline, (strlen((uint8_t*)newline)));
|
||||
rs485_send_broadcast(&newline, 1);
|
||||
}
|
||||
|
||||
if (g_rtd_filter.value_valid) // PT100 or PT1000 in °C
|
||||
{
|
||||
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
|
||||
mux_connection = AD5934_CH_RTD_LOW_GAIN; //PT100
|
||||
else
|
||||
mux_connection = AD5934_CH_RTD_MID_GAIN; //PT1000
|
||||
|
||||
uint16_t rtd_final = AD5934_RTD_OUT_SCALE_MAX - AD5934_Compress_To_IntScale(g_rtd_filter.filtered_value, mux_connection);
|
||||
temperature_RTD = AD5934_Calculate_Temperature(reference_resistor, g_rtd_filter.filtered_value);
|
||||
uint16_t rtd_final = AD5934_RTD_OUT_SCALE_MAX - AD5934_Compress_To_IntScale(g_rtd_filter.filtered_value, current_rtd_mux);
|
||||
intToStr(rtd_final, tempString);
|
||||
//float rtd_final = g_rtd_filter.filtered_value;
|
||||
//FloatToString(tempString, rtd_final);
|
||||
rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
|
||||
rs485_send_broadcast(newline, (strlen((uint8_t*)newline)));
|
||||
rs485_send_broadcast(&newline, 1);
|
||||
}
|
||||
|
||||
if (g_ec_filter.value_valid) // EC
|
||||
{
|
||||
thermal_compensaded_EC = AD5934_EC_Compensate_Magnitude_To_25C(g_ec_filter.filtered_value, temperature_RTD);
|
||||
uint16_t ec_final = AD5934_Compress_To_IntScale(thermal_compensaded_EC, current_ec_mux);
|
||||
intToStr(ec_final, tempString);
|
||||
// float ec_final = g_ec_filter.filtered_value;
|
||||
// FloatToString(tempString, ec_final);
|
||||
rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
|
||||
rs485_send_broadcast(&newline, 1);
|
||||
}
|
||||
|
||||
if (g_ph_filter.value_valid) // pH
|
||||
@@ -308,10 +210,10 @@ int main(void)
|
||||
//float ph_final = g_ph_filter.filtered_value;
|
||||
//FloatToString(tempString, ph_final);
|
||||
rs485_send_broadcast(tempString, (strlen((uint8_t*)tempString)));
|
||||
rs485_send_broadcast(newline, (strlen((uint8_t*)newline)));
|
||||
rs485_send_broadcast(&newline, 1);
|
||||
}
|
||||
|
||||
rs485_send_broadcast(newline, (strlen((uint8_t*)newline)));
|
||||
rs485_send_broadcast(&newline, 1);
|
||||
|
||||
}
|
||||
|
||||
@@ -332,30 +234,7 @@ int main(void)
|
||||
|
||||
}*/
|
||||
|
||||
/*
|
||||
if(UpdateEvent) // Internal Temperature
|
||||
{
|
||||
|
||||
for (i = (STM32_TEMPERATURE_AVERAGES-1); i > 0; i--)
|
||||
Temp_Samples[i] = Temp_Samples[i-1];
|
||||
|
||||
|
||||
// Read real and imaginary data
|
||||
if(AD_RES[0]>0.0f)
|
||||
V_Ref = (float)((V_REF_INT * 4095.0)/AD_RES[0]);
|
||||
else
|
||||
V_Ref = 0.0f;
|
||||
V_Sense = (float)(AD_RES[1] * V_Ref) / 4095.0;
|
||||
Temp_Samples[0] = (((V_AT_25C - V_Sense) * 1000.0) /AVG_SLOPE) + 25.0;
|
||||
|
||||
for (i = 0, Temp_Sum=0; i < STM32_TEMPERATURE_AVERAGES; i++)
|
||||
Temp_Sum += Temp_Samples[i];
|
||||
|
||||
Temperature = Temp_Sum/((float)STM32_TEMPERATURE_AVERAGES);
|
||||
|
||||
UpdateEvent = 0;
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
@@ -555,14 +434,6 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
|
||||
{
|
||||
UpdateEvent = 1; // Internal TEmperature
|
||||
}
|
||||
*/
|
||||
|
||||
/* USER CODE END 4 */
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user