From aaec99337803a17c4558dd6bd42e5a8e5b1ff31b Mon Sep 17 00:00:00 2001 From: 95384 <664090429@qq.com> Date: Mon, 16 Dec 2024 17:03:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A8=8B=E6=8E=A7=E5=A2=9E?= =?UTF-8?q?=E7=9B=8A=EF=BC=88=E6=9C=AA=E6=B5=8B=E8=AF=95=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E5=B0=8F=E4=BA=8E180=E5=BC=80=E5=90=AF=EF=BC=8C=E5=A4=A7?= =?UTF-8?q?=E4=BA=8E1900=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/Inc/anemometer_dev.h | 14 ++++++ App/Src/anemometer_dev.c | 103 +++++++++++++++++++++++++++++++++++---- 2 files changed, 107 insertions(+), 10 deletions(-) diff --git a/App/Inc/anemometer_dev.h b/App/Inc/anemometer_dev.h index e40d523..49b0ee1 100644 --- a/App/Inc/anemometer_dev.h +++ b/App/Inc/anemometer_dev.h @@ -134,6 +134,7 @@ typedef struct _mcs_para{ }mcs_para; extern mcs_para g_stMcs_Para; +//错误日志 typedef struct _error_log{ uint16_t tof_error_NS:1; /* 接受南北信号(tofy,tofx<0)很小 */ uint16_t tof_error_WE:1; /* 接受东西信号(tofy,tofx<0)很小 */ @@ -153,6 +154,19 @@ typedef struct _error_log{ uint16_t error_15:1; /* 保留 */ }error_log; extern error_log g_error_log; + +//增益控制位 +typedef struct _adc_gain_status{ + uint16_t gain_status_s:1; + uint16_t gain_status_n:1; + uint16_t gain_status_e:1; + uint16_t gain_status_w:1; + uint16_t bit4:1; + uint16_t bit5:1; + uint16_t bit6:1; + uint16_t bit7:1; +}adc_gain_status; + #pragma pack(pop) #define MAX_VALUES 50 diff --git a/App/Src/anemometer_dev.c b/App/Src/anemometer_dev.c index 65e94b0..c9b0815 100644 --- a/App/Src/anemometer_dev.c +++ b/App/Src/anemometer_dev.c @@ -40,10 +40,6 @@ AverageCalculator wave_max_val_1; AverageCalculator wave_max_val_2; AverageCalculator wave_max_val_3; AverageCalculator wave_max_val_4; -uint16_t wave_max_val1; -uint16_t wave_max_val2; -uint16_t wave_max_val3; -uint16_t wave_max_val4; int16_t adc_val[ADC_VAL_LEN]; int16_t adc_val1[ADC_VAL_LEN]; @@ -80,12 +76,76 @@ int32_t max_val_index_f32; // adc增益使能 void enable_adc_gain(void) { - HAL_GPIO_WritePin(GPIO_GAIN_SET_GPIO_Port, GPIO_GAIN_SET_Pin, GPIO_PIN_SET); + HAL_GPIO_ReadPin(GPIO_GAIN_SET_GPIO_Port, GPIO_GAIN_SET_Pin) ? (void)0 : HAL_GPIO_WritePin(GPIO_GAIN_SET_GPIO_Port, GPIO_GAIN_SET_Pin, GPIO_PIN_SET); } // adc增益取消使能 void disable_adc_gain(void) { - HAL_GPIO_WritePin(GPIO_GAIN_SET_GPIO_Port, GPIO_GAIN_SET_Pin, GPIO_PIN_RESET); + HAL_GPIO_ReadPin(GPIO_GAIN_SET_GPIO_Port, GPIO_GAIN_SET_Pin) ? HAL_GPIO_WritePin(GPIO_GAIN_SET_GPIO_Port, GPIO_GAIN_SET_Pin, GPIO_PIN_RESET) : (void)0; +} + +adc_gain_status gain_status = {0}; +// adc增益控制,0x01:S,0x02:N,0x03:E,0x04:W,当次使能下次生效,暂定为180开,1900关 +void config_adc_gain(uint8_t channel, uint16_t max_val) +{ + switch(channel) + { + case 0x01: + if(max_val <= 180) + gain_status.gain_status_s = 1; + else if(max_val >= 1900) + gain_status.gain_status_s = 0; + break; + + case 0x02: + if(max_val <= 180) + gain_status.gain_status_n = 1; + else if(max_val >= 1900) + gain_status.gain_status_n = 0; + break; + + case 0x03: + if(max_val <= 180) + gain_status.gain_status_e = 1; + else if(max_val >= 1900) + gain_status.gain_status_e = 0; + break; + + case 0x04: + if(max_val <= 180) + gain_status.gain_status_w = 1; + else if(max_val >= 1900) + gain_status.gain_status_w = 0; + break; + + default: + break; + } +} + +void use_adc_gain(uint8_t channel) +{ + switch(channel) + { + case 0x01: + gain_status.gain_status_s ? enable_adc_gain() : disable_adc_gain(); + break; + + case 0x02: + gain_status.gain_status_n ? enable_adc_gain() : disable_adc_gain(); + break; + + case 0x03: + gain_status.gain_status_e ? enable_adc_gain() : disable_adc_gain(); + break; + + case 0x04: + gain_status.gain_status_w ? enable_adc_gain() : disable_adc_gain(); + break; + + default: + break; + } } // 多项式插值 @@ -401,6 +461,11 @@ char str[100]; void wind_task(void const * argument) { + // 最大幅值 + uint16_t wave_max_val1; + uint16_t wave_max_val2; + uint16_t wave_max_val3; + uint16_t wave_max_val4; //错误次数统计,南北,东西分开(接受信号很小) uint8_t tof_error_log_NS = 0; uint8_t tof_error_log_WE = 0; @@ -423,6 +488,7 @@ void wind_task(void const * argument) // 通道1 通道2 测试南北风速 // 通道1发送 通道2接收 change_channel(0x01); + use_adc_gain(0x01); // 等待通道切换稳定 // adc开启采集数据有个固定的延时,这里取消等待 //HAL_Delay(0); @@ -432,14 +498,22 @@ void wind_task(void const * argument) osDelay(1); // 通道2发送 通道1接收 change_channel(0x02); + use_adc_gain(0x02); // 等待通道切换稳定 //HAL_Delay(0); // 发送pwm 并启动adc采集数据 play_one_measure(adc_val1,ADC_VAL_LEN); - tofx = cal_tof(adc_val,ADC_VAL_LEN, &wave_max_val1);addValue(&wave_max_val_1, wave_max_val1); - tofy = cal_tof(adc_val1,ADC_VAL_LEN, &wave_max_val2);addValue(&wave_max_val_2, wave_max_val2); + tofx = cal_tof(adc_val,ADC_VAL_LEN, &wave_max_val1); + //最大值平均+增益控制 + addValue(&wave_max_val_1, wave_max_val1); + config_adc_gain(0x01, wave_max_val_1.ave); + + tofy = cal_tof(adc_val1,ADC_VAL_LEN, &wave_max_val2); + //最大值平均+增益控制 + addValue(&wave_max_val_2, wave_max_val2); + config_adc_gain(0x02, wave_max_val_2.ave); // 接受信号很小 @@ -483,6 +557,7 @@ void wind_task(void const * argument) // 通道3 通道4 测试东西风速 // 通道3发送 通道4接收 change_channel(0x03); + use_adc_gain(0x03); // 等待通道切换稳定 //HAL_Delay(0); // 发送pwm 并启动adc采集数据 @@ -491,14 +566,22 @@ void wind_task(void const * argument) osDelay(1); // 通道4发送 通道3接收 change_channel(0x04); + use_adc_gain(0x04); // 等待通道切换稳定 //HAL_Delay(0); // 发送pwm 并启动adc采集数据 play_one_measure(adc_val1,ADC_VAL_LEN); - tofx = cal_tof(adc_val,ADC_VAL_LEN, &wave_max_val3);addValue(&wave_max_val_3, wave_max_val3); - tofy = cal_tof(adc_val1,ADC_VAL_LEN, &wave_max_val4);addValue(&wave_max_val_4, wave_max_val4); + tofx = cal_tof(adc_val,ADC_VAL_LEN, &wave_max_val3); + //最大值平均+增益控制 + addValue(&wave_max_val_3, wave_max_val3); + config_adc_gain(0x03, wave_max_val_3.ave); + + tofy = cal_tof(adc_val1,ADC_VAL_LEN, &wave_max_val4); + //最大值平均+增益控制 + addValue(&wave_max_val_4, wave_max_val4); + config_adc_gain(0x04, wave_max_val_4.ave); // 如果测量的信号幅值过小。 if(tofx<0||tofy<0)