diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 131c940..205f9d6 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Core/Inc/FreeRTOSConfig.h b/Core/Inc/FreeRTOSConfig.h index 05cc8ff..6a60f93 100644 --- a/Core/Inc/FreeRTOSConfig.h +++ b/Core/Inc/FreeRTOSConfig.h @@ -64,7 +64,7 @@ #define configTICK_RATE_HZ ((TickType_t)1000) #define configMAX_PRIORITIES ( 7 ) #define configMINIMAL_STACK_SIZE ((uint16_t)128) -#define configTOTAL_HEAP_SIZE ((size_t)30000) +#define configTOTAL_HEAP_SIZE ((size_t)40360) #define configMAX_TASK_NAME_LEN ( 16 ) #define configUSE_16_BIT_TICKS 0 #define configUSE_MUTEXES 1 diff --git a/graphite_digester_temperature_sensors_board.ioc b/graphite_digester_temperature_sensors_board.ioc index bda76a7..c1208d4 100644 --- a/graphite_digester_temperature_sensors_board.ioc +++ b/graphite_digester_temperature_sensors_board.ioc @@ -89,10 +89,11 @@ Dma.USART3_TX.1.PeriphInc=DMA_PINC_DISABLE Dma.USART3_TX.1.Priority=DMA_PRIORITY_LOW Dma.USART3_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode FREERTOS.FootprintOK=true -FREERTOS.IPParameters=Tasks01,FootprintOK,configUSE_NEWLIB_REENTRANT,configUSE_RECURSIVE_MUTEXES,configUSE_COUNTING_SEMAPHORES,configRECORD_STACK_HIGH_ADDRESS,configENABLE_FPU +FREERTOS.IPParameters=Tasks01,FootprintOK,configUSE_NEWLIB_REENTRANT,configUSE_RECURSIVE_MUTEXES,configUSE_COUNTING_SEMAPHORES,configRECORD_STACK_HIGH_ADDRESS,configENABLE_FPU,configTOTAL_HEAP_SIZE FREERTOS.Tasks01=defaultTask,-3,1024,StartDefaultTask,As weak,NULL,Dynamic,NULL,NULL FREERTOS.configENABLE_FPU=1 FREERTOS.configRECORD_STACK_HIGH_ADDRESS=1 +FREERTOS.configTOTAL_HEAP_SIZE=35360 FREERTOS.configUSE_COUNTING_SEMAPHORES=1 FREERTOS.configUSE_NEWLIB_REENTRANT=1 FREERTOS.configUSE_RECURSIVE_MUTEXES=1 diff --git a/graphite_digester_temperature_sensors_board.launch b/graphite_digester_temperature_sensors_board.launch index 1beb399..0805101 100644 --- a/graphite_digester_temperature_sensors_board.launch +++ b/graphite_digester_temperature_sensors_board.launch @@ -45,7 +45,7 @@ - + diff --git a/usrc/main.cpp b/usrc/main.cpp index 299e5a3..a1b07a2 100644 --- a/usrc/main.cpp +++ b/usrc/main.cpp @@ -24,6 +24,10 @@ using namespace std; static ZCancmderSubboardIniter initer; static Serial485ToAnalog serial485_to_analog; +static ZThread temperature_capture_thread; + +extern DMA_HandleTypeDef hdma_usart2_rx; +extern DMA_HandleTypeDef hdma_usart2_tx; extern void umain(); extern "C" { @@ -75,6 +79,16 @@ static void initsubmodule() { m_temperature_sensor[2].initialize(&hadc1, ADC_CHANNEL_12); m_temperature_sensor[3].initialize(&hadc1, ADC_CHANNEL_13); m_temperature_sensor[4].initialize(&hadc1, ADC_CHANNEL_14); + + temperature_capture_thread.init("temperature_capture_thread", 1024, osPriorityLow); + temperature_capture_thread.start([]() { + while (1) { + for (int i = 0; i < 5; i++) { + m_temperature_sensor[i].loop(); + } + osDelay(1); + } + }); } { /******************************************************************************* diff --git a/usrc/serial485_to_analog.cpp b/usrc/serial485_to_analog.cpp index 7d05b68..77299e1 100644 --- a/usrc/serial485_to_analog.cpp +++ b/usrc/serial485_to_analog.cpp @@ -16,7 +16,7 @@ void Serial485ToAnalog::reg(TemperatureSensor* ts) { } void Serial485ToAnalog::start() { - zthread.init("Serial485ToAnalog-thread"); + zthread.init("Serial485ToAnalog-thread",1024); zthread.start([this]() { while (!zthread.getExitFlag()) { float temperture_i_val[5] = {0}; // 温度电流数值 @@ -39,7 +39,7 @@ void Serial485ToAnalog::start() { write_reg_val[i] = (uint16_t)(temperture_i_val[i] * 1000); } writeReg10Muti(0x01, 0x0064, write_reg_val, m_sensorNum, 1000); - zthread.sleep(10); + zthread.sleep(100); } }); } @@ -58,7 +58,7 @@ int32_t Serial485ToAnalog::writeReg10Muti(uint8_t slaveAddr, uint16_t regAddr, u } modbus_pack_crc_to_packet(m_txbuff, 7 + nreg * 2 + 2); - HAL_UART_Transmit(m_uart, m_txbuff, 7 + nreg * 2 + 2, 1000); - + HAL_UART_Transmit_DMA(m_uart, m_txbuff, 7 + nreg * 2 + 2); + // HAL_UARTDTranm return 0; } diff --git a/usrc/temperature_sensor.cpp b/usrc/temperature_sensor.cpp index 98ae717..4934228 100644 --- a/usrc/temperature_sensor.cpp +++ b/usrc/temperature_sensor.cpp @@ -5,54 +5,76 @@ using namespace iflytop; void TemperatureSensor::initialize(ADC_HandleTypeDef* hadc1, int32_t channel) { // m_adc.initialize(hadc1, channel); + m_mutex.init(); } -float TemperatureSensor::readCurrentVal() { +int32_t TemperatureSensor::_readAdcVal() { int32_t adcval = 0; m_adc.get_adc_value(adcval); - float v = adcval * 3.3 / 4096; - float I = v / 150.0 * 1000; + return adcval; +} - return I; +int32_t TemperatureSensor::_readAdcValMuti() { + int32_t ival[30] = {0}; + for (int32_t i = 0; i < 30; i++) { + ival[i] = _readAdcVal(); + } + // 排序 + for (int32_t i = 0; i < 30; i++) { + for (int32_t j = i + 1; j < 30; j++) { + if (ival[i] > ival[j]) { + int32_t temp = ival[i]; + ival[i] = ival[j]; + ival[j] = temp; + } + } + } + // 去掉最大最小值 + int32_t sum = 0; + for (int32_t i = 5; i < 25; i++) { + sum += ival[i]; + } + return sum / 20.0; +} +void TemperatureSensor::loop() { + // currentI + int32_t adcVal = _readAdcValMuti(); + { + zlock_guard l(m_mutex); + m_advVal = adcVal; + } + osDelay(30); } -int32_t TemperatureSensor::_getTemperature(int32_t& sensorval) { - // 4000ma->20ma ==> 0->350 - // V=150*I - // I=V/150 + + +int32_t TemperatureSensor::getTemperature(int32_t& sensorval) { int32_t adcval = 0; - m_adc.get_adc_value(adcval); + { + zlock_guard l(m_mutex); + adcval = m_advVal; + } + float v = adcval * 3.3 / 4096; float I = v / 150.0 * 1000; int32_t temperature001 = (I - 4) / (20 - 4) * 350 * 100; // 0.01度 if (temperature001 < 0) { temperature001 = 0; } - sensorval = temperature001; return 0; } -int32_t TemperatureSensor::getTemperature(int32_t& sensorval) { // - int32_t adcval[10] = {0}; - for (int32_t i = 0; i < 10; i++) { - _getTemperature(adcval[i]); - } - // 排序 - for (int32_t i = 0; i < 10; i++) { - for (int32_t j = i + 1; j < 10; j++) { - if (adcval[i] > adcval[j]) { - int32_t temp = adcval[i]; - adcval[i] = adcval[j]; - adcval[j] = temp; - } - } - } - // 去掉最大最小值 - int32_t sum = 0; - for (int32_t i = 1; i < 9; i++) { - sum += adcval[i]; +float TemperatureSensor::readCurrentVal() { + int32_t adcval = 0; + + { + zlock_guard l(m_mutex); + adcval = m_advVal; } - sensorval = sum / 8.0; - return 0; -} + + float v = adcval * 3.3 / 4096; + float I = v / 150.0 * 1000; + + return I; +} \ No newline at end of file diff --git a/usrc/temperature_sensor.hpp b/usrc/temperature_sensor.hpp index 8305080..c68fb17 100644 --- a/usrc/temperature_sensor.hpp +++ b/usrc/temperature_sensor.hpp @@ -19,6 +19,9 @@ class TemperatureSensor : public ZITemperature { ADC_HandleTypeDef* hadc1; int32_t channel; + float currentI = 0; + int32_t m_advVal; + zmutex m_mutex; /** * @brief @@ -48,11 +51,14 @@ class TemperatureSensor : public ZITemperature { void initialize(ADC_HandleTypeDef* hadc1, int32_t channel); virtual int32_t getTemperature(int32_t& sensorval); + float readCurrentVal(); - float readCurrentVal();//读取当前电流数值 + void loop(); private: - int32_t _getTemperature(int32_t& sensorval); + // int32_t _getTemperature(int32_t& sensorval); + int32_t _readAdcVal(); + int32_t _readAdcValMuti(); }; } // namespace iflytop \ No newline at end of file