From 4050527cdf6e7e8b2a10feb1533c6bd2e4ab65ba Mon Sep 17 00:00:00 2001 From: cui635 Date: Thu, 16 Oct 2025 17:22:59 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9ADC=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E5=8F=8ADMA=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E5=8F=82=E6=95=B0=EF=BC=8C=E8=B0=83=E6=95=B4=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E6=97=B6=E7=AD=89=E5=BE=85=E7=94=B5=E6=B5=81=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?=E9=87=87=E5=88=9D=E5=A7=8B=E7=94=B5=E6=B5=81=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project/HC32F460/MDK/HC32F460.uvoptx | 35 ++++++++++------- .../source/Module/dc_motor/dc_motor.c | 39 +++++++++++-------- .../source/Module/dc_motor/dc_motor.h | 4 ++ Project/HC32F460/source/User/Src/bsp.c | 18 ++++----- Project/HC32F460/source/User/Src/main.c | 1 + 5 files changed, 58 insertions(+), 39 deletions(-) diff --git a/Project/HC32F460/MDK/HC32F460.uvoptx b/Project/HC32F460/MDK/HC32F460.uvoptx index 2ee0cb8..29df438 100644 --- a/Project/HC32F460/MDK/HC32F460.uvoptx +++ b/Project/HC32F460/MDK/HC32F460.uvoptx @@ -153,7 +153,24 @@ - + + + 0 + 0 + 291 + 1 +
4146
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\source\Module\dc_motor\dc_motor.c + + \\BombSensor\../source/Module/dc_motor/dc_motor.c\291 +
+
0 @@ -248,17 +265,7 @@ 18 1 - newSpeed,0x0A - - - 19 - 1 - g_motorSpeed,0x0A - - - 20 - 1 - g_adc_val,0x0A + g_motor_data @@ -266,8 +273,8 @@ 0 - 0 - 1 + 1 + 0 0 0 0 diff --git a/Project/HC32F460/source/Module/dc_motor/dc_motor.c b/Project/HC32F460/source/Module/dc_motor/dc_motor.c index 1b5fee1..84d81f1 100644 --- a/Project/HC32F460/source/Module/dc_motor/dc_motor.c +++ b/Project/HC32F460/source/Module/dc_motor/dc_motor.c @@ -3,9 +3,6 @@ #include "Debug.h" #include "math.h" -#define ADC_CH_NUM 3 /* 需要转换的通道数目 */ -#define ADC_COLL 100 /* 单采集次数 */ -#define ADC_SUM ADC_CH_NUM * ADC_COLL /* 总采集次数 */ // 全局变量 @@ -71,15 +68,15 @@ void DCMOTORDBGOnOff(uint8_t OnOff) #endif -extern uint16_t m_au16Adc1SaValue[ADC_CH_NUM * ADC_COLL]; + uint16_t init_adc_val; uint16_t AdcInitCnt = 0; #define Adc 0.80566 //3.3/4096=0.00080566 //ADC分辨率 -#define ADC_CH_NUM 3 -uint16_t g_adc_val[ADC_CH_NUM]; +uint16_t g_adc_val[ADC_CH_NUM]; +extern uint16_t m_au16Adc1SaValue[ADC_CH_NUM * ADC_COLL]; /************************************* 第二部分 电压电流温度采集 **********************************************/ @@ -241,7 +238,7 @@ void speed_computer(int32_t encode_now, uint8_t ms) * 返 回 值: 无 *****************************************************************************************/ bool AdcInitStatus = false; //ADC初始化状态标志位 -bool AdcInitSta = false; //ADC电流电压采集初始化标志位 +volatile bool AdcInitSta = false; //ADC电流电压采集初始化标志位 uint16_t AdcDly = 0; //ADC采样定时计数 void Adc1mSRoutine(void) { @@ -266,16 +263,15 @@ void Adc1mSRoutine(void) *****************************************************************************************/ void AdcLoopHander(void) { + uint32_t temp = 0; + int i; float temp_c = 0.0; - //开机等待电流数据稳定,采集稳定电流值为初始值 + //开机等待电流数据稳定1秒,采集稳定电流值为初始值 if((AdcInitStatus == true) && (AdcInitSta == false)) { - AdcInitCnt++; - ADC_Start(); - while(DMA_GetChFlag(M4_DMA1, DmaCh0Sta) != DmaTransferComplete); - init_adc_val += m_au16Adc1SaValue[2u]; /* 现在的值和上一次存储的值相加 */ - init_adc_val /= 2; /* 取平均值 */ + + AdcInitCnt++; if(AdcInitCnt < 1000) { AdcInitStatus = false; @@ -283,6 +279,15 @@ void AdcLoopHander(void) } else { + while(DMA_GetChFlag(M4_DMA1, DmaCh0Sta) != DmaTransferComplete); + for(i=0;i 0) + { + init_adc_val /= 2; /* 取平均值 */ + } + } DCMOTOR_DBG_LOG("init_adc_val %d.\n", init_adc_val); AdcInitSta = true; } @@ -292,7 +297,7 @@ void AdcLoopHander(void) { float BatVoltage = 0; AdcDly = 1000; - if(AdcInitSta == true) + if(AdcInitSta != false) { while(DMA_GetChFlag(M4_DMA1, DmaCh0Sta) != DmaTransferComplete); DMA_Cmd(M4_DMA1, Disable); @@ -303,12 +308,14 @@ void AdcLoopHander(void) temp_c = (g_adc_val[2]-init_adc_val)*ADC2CURT; DCMOTOR_DBG_LOG("ADC3_IN3 value %d.\t Current:%.1fmA \r\n", g_adc_val[2u], temp_c); +// g_motor_data.current = temp_c; + g_motor_data.current = (float)((g_motor_data.current * (float)0.60) + ((float)0.40 * temp_c)); /* 一阶低通滤波 */ - if (g_motor_data.current <= 20) /* 过滤掉微弱浮动电流 */ + if (abs(g_motor_data.current) <= 20) /* 过滤掉微弱浮动电流 */ { g_motor_data.current = 0.0; } - DCMOTOR_DBG_LOG("\t\t\t g_motor_data.current:%.1fmA \r\n", g_adc_val[2u], g_motor_data.current); + DCMOTOR_DBG_LOG("\t\t\t g_motor_data.current:%.1fmA \r\n", g_motor_data.current); DMA_Cmd(M4_DMA1, Enable); } } diff --git a/Project/HC32F460/source/Module/dc_motor/dc_motor.h b/Project/HC32F460/source/Module/dc_motor/dc_motor.h index 356fc81..5e749a8 100644 --- a/Project/HC32F460/source/Module/dc_motor/dc_motor.h +++ b/Project/HC32F460/source/Module/dc_motor/dc_motor.h @@ -2,6 +2,10 @@ #ifndef __DCMOTOR_H #define __DCMOTOR_H +#define ADC_CH_NUM 3 /* 需要转换的通道数目 */ +#define ADC_COLL 100 /* 单采集次数 */ +#define ADC_SUM ADC_CH_NUM * ADC_COLL /* 总采集次数 */ + #define HC32F170 (0u) //HC32F170JATA diff --git a/Project/HC32F460/source/User/Src/bsp.c b/Project/HC32F460/source/User/Src/bsp.c index ba80f24..69237cc 100644 --- a/Project/HC32F460/source/User/Src/bsp.c +++ b/Project/HC32F460/source/User/Src/bsp.c @@ -17,7 +17,7 @@ static void SystemClockConfig(void); -uint16_t m_au16Adc1SaValue[4]; +uint16_t m_au16Adc1SaValue[ADC_CH_NUM * ADC_COLL]; void FlashWrite(uint32_t *wData, uint32_t wLen) { @@ -1163,15 +1163,15 @@ static void AdcSetChannelPinMode(uint32_t u32Channel) static void AdcChannelConfig(void) { stc_adc_ch_cfg_t stcChCfg; - uint8_t au8Adc1SaSampTime[4] = {255, 255, 255, 255}; + uint8_t au8Adc1SaSampTime[3] = {2255, 255, 255}; MEM_ZERO_STRUCT(stcChCfg); - stcChCfg.u32Channel = ADC1_CH0 | ADC1_CH1 | ADC1_CH2 | ADC1_CH3; + stcChCfg.u32Channel = ADC1_CH1 | ADC1_CH2 | ADC1_CH3; stcChCfg.u8Sequence = ADC_SEQ_A; stcChCfg.pu8SampTime = au8Adc1SaSampTime; - AdcSetChannelPinMode(ADC1_CH0); +// AdcSetChannelPinMode(ADC1_CH0); AdcSetChannelPinMode(ADC1_CH1); AdcSetChannelPinMode(ADC1_CH2); AdcSetChannelPinMode(ADC1_CH3); @@ -1210,12 +1210,12 @@ static void AdcDmaConfig(void) MEM_ZERO_STRUCT(stcDmaCfg); - stcDmaCfg.u16BlockSize = 4; + stcDmaCfg.u16BlockSize = 3; stcDmaCfg.u16TransferCnt = 0u; - stcDmaCfg.u32SrcAddr = (uint32_t)(&M4_ADC1->DR0); + stcDmaCfg.u32SrcAddr = (uint32_t)(&M4_ADC1->DR1); stcDmaCfg.u32DesAddr = (uint32_t)(m_au16Adc1SaValue); - stcDmaCfg.u16DesRptSize = 4; - stcDmaCfg.u16SrcRptSize = 4; + stcDmaCfg.u16DesRptSize = ADC_SUM; + stcDmaCfg.u16SrcRptSize = 3; stcDmaCfg.u32DmaLlp = 0u; stcDmaCfg.stcSrcNseqCfg.u16Cnt = 0u; stcDmaCfg.stcSrcNseqCfg.u32Offset = 0u; @@ -1228,7 +1228,7 @@ static void AdcDmaConfig(void) stcDmaCfg.stcDmaChCfg.enSrcNseqEn = Disable; stcDmaCfg.stcDmaChCfg.enDesNseqEn = Disable; stcDmaCfg.stcDmaChCfg.enTrnWidth = Dma16Bit; - stcDmaCfg.stcDmaChCfg.enLlpEn = Disable; + stcDmaCfg.stcDmaChCfg.enLlpEn = Enable; /* Enable DMA interrupt. */ stcDmaCfg.stcDmaChCfg.enIntEn = Enable; diff --git a/Project/HC32F460/source/User/Src/main.c b/Project/HC32F460/source/User/Src/main.c index b88fe35..256a9db 100644 --- a/Project/HC32F460/source/User/Src/main.c +++ b/Project/HC32F460/source/User/Src/main.c @@ -640,5 +640,6 @@ void RtcPeriod_IrqCallback(void) void ADC_DMA_CallBack(void) { + }