From fc44113b48f0a3674c88666e87e2662cdc1c5dd2 Mon Sep 17 00:00:00 2001 From: Luiz Fernando Lavado Villa <lflavado@laas.fr> Date: Fri, 29 Jul 2022 12:45:25 +0000 Subject: [PATCH] =?UTF-8?q?The=20O=C2=B2=20board=20lacks=20an=20extra=20an?= =?UTF-8?q?alog=20input,=20which=20is=20quite=20useful=20for=20interfacing?= =?UTF-8?q?=20with=20sensors.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arm/owntech_board/dts/adc-channels.dtsi | 5 +++ .../arm/owntech_board/owntech_board.dts | 2 +- .../zephyr/data_conversion/data_conversion.c | 17 ++++++++- .../zephyr/data_conversion/data_conversion.h | 16 ++++++++ .../zephyr/public_api/DataAcquisition.cpp | 38 +++++++++++++++++++ .../zephyr/public_api/DataAcquisition.h | 5 +++ .../public_api/HardwareConfiguration.cpp | 5 +++ .../zephyr/public_api/HardwareConfiguration.h | 1 + .../zephyr/src/adc_configuration.cpp | 25 ++++++++++++ .../zephyr/src/adc_configuration.h | 13 +++++++ 10 files changed, 125 insertions(+), 2 deletions(-) diff --git a/zephyr/boards/arm/owntech_board/dts/adc-channels.dtsi b/zephyr/boards/arm/owntech_board/dts/adc-channels.dtsi index 23abb39..afbd459 100644 --- a/zephyr/boards/arm/owntech_board/dts/adc-channels.dtsi +++ b/zephyr/boards/arm/owntech_board/dts/adc-channels.dtsi @@ -73,6 +73,11 @@ label = "I_HIGH"; }; + extra-meas-adc2 { + io-channels = <&adc2 5>; + label = "EXTRA_MEAS"; + }; + /* Temperature channel */ /* temp-sensor { diff --git a/zephyr/boards/arm/owntech_board/owntech_board.dts b/zephyr/boards/arm/owntech_board/owntech_board.dts index 4596e8e..d705c19 100644 --- a/zephyr/boards/arm/owntech_board/owntech_board.dts +++ b/zephyr/boards/arm/owntech_board/owntech_board.dts @@ -168,7 +168,7 @@ }; &adc2 { - pinctrl-0 = <&adc2_in1_pa0 &adc2_in2_pa1 &adc2_in3_pa6>; + pinctrl-0 = <&adc2_in1_pa0 &adc2_in2_pa1 &adc2_in3_pa6 &adc2_in5_pc4>; status = "okay"; }; diff --git a/zephyr/modules/owntech_data_acquisition/zephyr/data_conversion/data_conversion.c b/zephyr/modules/owntech_data_acquisition/zephyr/data_conversion/data_conversion.c index 0dc446e..7c40a88 100644 --- a/zephyr/modules/owntech_data_acquisition/zephyr/data_conversion/data_conversion.c +++ b/zephyr/modules/owntech_data_acquisition/zephyr/data_conversion/data_conversion.c @@ -46,8 +46,12 @@ static float32_t offset_currents[3] = {25.9, 29.28, 0}; //i1_low, i2_low o static float32_t gain_voltages[3] = {0.0462, 0.0462, 0.0640}; //v1_low, v2_low and v_high static float32_t offset_voltages[3] = {94.04, 94.04, 4.408}; //v1_low, v2_low and v_high +static float32_t gain_extra = 1.0; //gain for the extra +static float32_t offset_extra = 1.0; //offset for the extra + + // Temperature -static float32_t gain_temperature = 0.0; +static float32_t gain_temperature = 1.0; static float32_t offset_temperature = 0.0; @@ -93,6 +97,11 @@ float32_t data_conversion_convert_temp(uint16_t raw_value) return (raw_value*gain_temperature)+offset_temperature; } +float32_t data_conversion_convert_extra(uint16_t raw_value) +{ + return (raw_value*gain_extra)+offset_extra; +} + /** @@ -139,3 +148,9 @@ void data_conversion_set_temp_parameters(float32_t gain, float32_t offset) gain_temperature = gain; offset_temperature = offset; } + +void data_conversion_set_extra_parameters(float32_t gain, float32_t offset) +{ + gain_extra = gain; + offset_extra = offset; +} diff --git a/zephyr/modules/owntech_data_acquisition/zephyr/data_conversion/data_conversion.h b/zephyr/modules/owntech_data_acquisition/zephyr/data_conversion/data_conversion.h index d400bfe..8d42f8e 100644 --- a/zephyr/modules/owntech_data_acquisition/zephyr/data_conversion/data_conversion.h +++ b/zephyr/modules/owntech_data_acquisition/zephyr/data_conversion/data_conversion.h @@ -97,6 +97,14 @@ float32_t data_conversion_convert_i_high(uint16_t raw_value); */ float32_t data_conversion_convert_temp(uint16_t raw_value); +/** + * @brief Converts the values of the extra parameter into a physical unit + * + * @param[in] raw_value + * + * @return a foat32_t value for the extra measurement + */ +float32_t data_conversion_convert_extra(uint16_t raw_value); /** @@ -155,6 +163,14 @@ void data_conversion_set_i_high_parameters(float32_t gain, float32_t offset); */ void data_conversion_set_temp_parameters(float32_t gain, float32_t offset); +/** + * @brief Change the parameters for the extra measurement + * + * @param[in] gain gain of temp sensor + * @param[in] offset offset of the sensor + */ +void data_conversion_set_extra_parameters(float32_t gain, float32_t offset); + #ifdef __cplusplus } diff --git a/zephyr/modules/owntech_data_acquisition/zephyr/public_api/DataAcquisition.cpp b/zephyr/modules/owntech_data_acquisition/zephyr/public_api/DataAcquisition.cpp index 028c4c3..9707eca 100644 --- a/zephyr/modules/owntech_data_acquisition/zephyr/public_api/DataAcquisition.cpp +++ b/zephyr/modules/owntech_data_acquisition/zephyr/public_api/DataAcquisition.cpp @@ -56,6 +56,7 @@ DataAcquisition::channel_assignment_t DataAcquisition::i1_low_assignement = DataAcquisition::channel_assignment_t DataAcquisition::i2_low_assignement = {0}; DataAcquisition::channel_assignment_t DataAcquisition::i_high_assignement = {0}; DataAcquisition::channel_assignment_t DataAcquisition::temp_sensor_assignement = {0}; +DataAcquisition::channel_assignment_t DataAcquisition::extra_sensor_assignement = {0}; ///// @@ -98,6 +99,11 @@ void DataAcquisition::setChannnelAssignment(uint8_t adc_number, const char* cha temp_sensor_assignement.adc_number = adc_number; temp_sensor_assignement.channel_rank = channel_rank; } + else if (strcmp(channel_name, "EXTRA_MEAS") == 0) + { + extra_sensor_assignement.adc_number = adc_number; + extra_sensor_assignement.channel_rank = channel_rank; + } } void DataAcquisition::start() @@ -174,6 +180,12 @@ uint16_t* DataAcquisition::getTemperatureRawValues(uint32_t& number_of_values_ac return data_dispatch_get_acquired_values(temp_sensor_assignement.adc_number, temp_sensor_assignement.channel_rank, &number_of_values_acquired); } +uint16_t* DataAcquisition::getExtraRawValues(uint32_t& number_of_values_acquired) +{ + return data_dispatch_get_acquired_values(extra_sensor_assignement.adc_number, extra_sensor_assignement.channel_rank, &number_of_values_acquired); +} + + float32_t DataAcquisition::getV1Low() { uint32_t data_count; @@ -279,6 +291,22 @@ float32_t DataAcquisition::getTemperature() return converted_data; } +float32_t DataAcquisition::getExtra() +{ + uint32_t data_count; + static float32_t converted_data = -10000; // Return an impossible value if no data has been acquired yet + uint16_t* buffer = getExtraRawValues(data_count); + + if (data_count > 0) // If data was received it gets converted + { + uint16_t raw_value = buffer[data_count - 1]; + converted_data = data_conversion_convert_extra(raw_value); + } + + return converted_data; +} + + float32_t DataAcquisition::convertV1Low(uint16_t raw_value) { return data_conversion_convert_v1_low(raw_value); @@ -314,6 +342,11 @@ float32_t DataAcquisition::convertTemperature(uint16_t raw_value) return data_conversion_convert_temp(raw_value); } +float32_t DataAcquisition::convertExtra(uint16_t raw_value) +{ + return data_conversion_convert_extra(raw_value); +} + void DataAcquisition::setV1LowParameters(float32_t gain, float32_t offset) { @@ -349,3 +382,8 @@ void DataAcquisition::setTemperatureParameters(float32_t gain, float32_t offset) { data_conversion_set_temp_parameters(gain, offset); } + +void DataAcquisition::setExtraParameters(float32_t gain, float32_t offset) +{ + data_conversion_set_extra_parameters(gain, offset); +} diff --git a/zephyr/modules/owntech_data_acquisition/zephyr/public_api/DataAcquisition.h b/zephyr/modules/owntech_data_acquisition/zephyr/public_api/DataAcquisition.h index 4085967..c14c20a 100644 --- a/zephyr/modules/owntech_data_acquisition/zephyr/public_api/DataAcquisition.h +++ b/zephyr/modules/owntech_data_acquisition/zephyr/public_api/DataAcquisition.h @@ -100,6 +100,7 @@ public: static uint16_t* getI2LowRawValues(uint32_t& number_of_values_acquired); static uint16_t* getIHighRawValues(uint32_t& number_of_values_acquired); static uint16_t* getTemperatureRawValues(uint32_t& number_of_values_acquired); + static uint16_t* getExtraRawValues(uint32_t& number_of_values_acquired); /** * These functions return the latest acquired measure expressed @@ -118,6 +119,7 @@ public: static float32_t getI2Low(); static float32_t getIHigh(); static float32_t getTemperature(); + static float32_t getExtra(); /** * Use these functions to convert values obtained using @@ -131,6 +133,7 @@ public: static float32_t convertI2Low(uint16_t raw_value); static float32_t convertIHigh(uint16_t raw_value); static float32_t convertTemperature(uint16_t raw_value); + static float32_t convertExtra(uint16_t raw_value); /** * Use these functions to tweak the conversion values for @@ -143,6 +146,7 @@ public: static void setVHighParameters(float32_t gain, float32_t offset); static void setIHighParameters(float32_t gain, float32_t offset); static void setTemperatureParameters(float32_t gain, float32_t offset); + static void setExtraParameters(float32_t gain, float32_t offset); private: @@ -162,6 +166,7 @@ private: static channel_assignment_t i2_low_assignement; static channel_assignment_t i_high_assignement; static channel_assignment_t temp_sensor_assignement; + static channel_assignment_t extra_sensor_assignement; }; diff --git a/zephyr/modules/owntech_hardware_configuration/zephyr/public_api/HardwareConfiguration.cpp b/zephyr/modules/owntech_hardware_configuration/zephyr/public_api/HardwareConfiguration.cpp index 8163b68..92846d9 100644 --- a/zephyr/modules/owntech_hardware_configuration/zephyr/public_api/HardwareConfiguration.cpp +++ b/zephyr/modules/owntech_hardware_configuration/zephyr/public_api/HardwareConfiguration.cpp @@ -329,6 +329,11 @@ void HardwareConfiguration::configureAdcDefaultAllMeasurements() configure_adc_default_all_measurements(); } +void HardwareConfiguration::configureAdcDefaultAllMeasurementsAndExtra() +{ + configure_adc_default_all_measurements_and_extra(); +} + void HardwareConfiguration::setLeg1DeadTime(uint16_t rise_ns, uint16_t fall_ns) { diff --git a/zephyr/modules/owntech_hardware_configuration/zephyr/public_api/HardwareConfiguration.h b/zephyr/modules/owntech_hardware_configuration/zephyr/public_api/HardwareConfiguration.h index 2180d4f..ba39fdf 100644 --- a/zephyr/modules/owntech_hardware_configuration/zephyr/public_api/HardwareConfiguration.h +++ b/zephyr/modules/owntech_hardware_configuration/zephyr/public_api/HardwareConfiguration.h @@ -142,6 +142,7 @@ public: static void configureAdcTriggerSource(uint8_t adc_number, adc_ev_src_t trigger_source); static void configureAdcDiscontinuousMode(uint8_t adc_number, uint32_t dicontinuous_count); static void configureAdcDefaultAllMeasurements(); + static void configureAdcDefaultAllMeasurementsAndExtra(); }; diff --git a/zephyr/modules/owntech_hardware_configuration/zephyr/src/adc_configuration.cpp b/zephyr/modules/owntech_hardware_configuration/zephyr/src/adc_configuration.cpp index 1b39bb7..23e3df0 100644 --- a/zephyr/modules/owntech_hardware_configuration/zephyr/src/adc_configuration.cpp +++ b/zephyr/modules/owntech_hardware_configuration/zephyr/src/adc_configuration.cpp @@ -150,3 +150,28 @@ void configure_adc_default_all_measurements() configure_adc_channels(1, adc1_channels, number_of_channels_adc1); configure_adc_channels(2, adc2_channels, number_of_channels_adc2); } + + +void configure_adc_default_all_measurements_and_extra() +{ + uint8_t number_of_channels_adc1 = 3; + uint8_t number_of_channels_adc2 = 4; + + const char* adc1_channels[] = + { + "I1_LOW", + "V1_LOW", + "V_HIGH" + }; + + const char* adc2_channels[] = + { + "I2_LOW", + "V2_LOW", + "I_HIGH", + "EXTRA_MEAS" + }; + + configure_adc_channels(1, adc1_channels, number_of_channels_adc1); + configure_adc_channels(2, adc2_channels, number_of_channels_adc2); +} diff --git a/zephyr/modules/owntech_hardware_configuration/zephyr/src/adc_configuration.h b/zephyr/modules/owntech_hardware_configuration/zephyr/src/adc_configuration.h index c22c5a2..4a72905 100644 --- a/zephyr/modules/owntech_hardware_configuration/zephyr/src/adc_configuration.h +++ b/zephyr/modules/owntech_hardware_configuration/zephyr/src/adc_configuration.h @@ -104,4 +104,17 @@ void configure_adc_discontinuous_mode(uint8_t adc_number, uint32_t dicontinuous_ void configure_adc_default_all_measurements(); +/** + * This function is used to configure all ADC channels in default configuration. + * Channels will be attributed as follows: + * ADC1 - V1_LOW ADC2 - I1_LOW + * V2_LOW I2_LOW + * V_HIGH I_HIGH + * EXTRA_MEAS + * + * This function must be called BEFORE ADC is started. + */ +void configure_adc_default_all_measurements_and_extra(); + + #endif // ADC_CONFIGURATION_H_ -- GitLab