Browse Source

修复代码崩溃的BUG

master
zhaohe 1 year ago
parent
commit
8882c71af6
  1. 4
      .settings/language.settings.xml
  2. 2
      Core/Inc/FreeRTOSConfig.h
  3. 3
      graphite_digester_temperature_sensors_board.ioc
  4. 2
      graphite_digester_temperature_sensors_board.launch
  5. 14
      usrc/main.cpp
  6. 8
      usrc/serial485_to_analog.cpp
  7. 86
      usrc/temperature_sensor.cpp
  8. 10
      usrc/temperature_sensor.hpp

4
.settings/language.settings.xml

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="824669307326889509" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1639727099451158917" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="873797463188616470" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1688855255312885878" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

2
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

3
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

2
graphite_digester_temperature_sensors_board.launch

@ -45,7 +45,7 @@
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_logging" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_max_halt_delay" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_shared_stlink" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.frequency" value="0"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.frequency" value="8000"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.halt_all_on_reset" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.log_file" value="D:\workspace\project_boditech_vidas_a8000_v2\graphite_digester_temperature_sensors_board\Debug\st-link_gdbserver_log.txt"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.low_power_debug" value="disable"/>

14
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);
}
});
}
{
/*******************************************************************************

8
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;
}

86
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;
}

10
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
Loading…
Cancel
Save