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