YTM32B1ME05 ADC不稳问题
-
在ADC中断中每次读8次FIFO可以解决
-
quanfeng 忘记说了,下午重新验证了下,发现并没有通道错位情况,数据还是一样波动比较大。
代码如下:
/** * @brief ADC0 interrupt handler * @return none */ void ADC0_IRQHandler(void) { uint32_t adcSampleSum = 0U; uint8_t expectedChannel = adcInst[UserAdcParams.pwmIndex][1]; uint8_t validCnt = 0U; ADC_DRV_ClearEoseqFlagCmd(0); adcSampleSum = 0U; for(uint8_t readCnt = 0U; readCnt < 8U; readCnt++) { adcSampleResult[readCnt].u32DualWord = ADC0->FIFO; if(readCnt < 4U) { if(adcSampleResult[readCnt].parts.u16ChnIndex == expectedChannel) { adcSampleSum += adcSampleResult[readCnt].parts.u16ChnResult; validCnt++; } else { misMatchFlag = true; } } } if (validCnt > 0U) { updateAdcResult((uint16_t)(adcSampleSum / validCnt)); } else { updateAdcResult(0x8000); } if(adcSampleResult[4].parts.u16ChnIndex == ADC_INPUTCHAN_EXT17) { UserAdcParams.boardSupplyVolt.rawAdcValue = adcSampleResult[4].parts.u16ChnResult; }else{ misMatchFlag = true; } if(adcSampleResult[5].parts.u16ChnIndex == ADC_INPUTCHAN_EXT18) { UserAdcParams.ledSupplyVolt.rawAdcValue = adcSampleResult[5].parts.u16ChnResult; }else{ misMatchFlag = true; } } /** * @brief ADC1 interrupt handler * @return none */ void ADC1_IRQHandler(void) { uint32_t adcSampleSum = 0U; uint8_t expectedChannel = adcInst[UserAdcParams.pwmIndex][1]; uint8_t validCnt = 0U; ADC_DRV_ClearEoseqFlagCmd(1); for(uint8_t readCnt = 0U; readCnt < 8U; readCnt++) { adcSampleResult[readCnt].u32DualWord = ADC1->FIFO; if(readCnt < 4U){ if(adcSampleResult[readCnt].parts.u16ChnIndex == expectedChannel) { adcSampleSum += adcSampleResult[readCnt].parts.u16ChnResult; validCnt++; } else { misMatchFlag = true; } } } if (validCnt > 0U) { updateAdcResult((uint16_t)(adcSampleSum / validCnt)); } else { updateAdcResult(0x8000); } }进不到misMatchFlag 为true情况,采集到的数据波动比较大。

-
ADC0配置:

ADC1配置

代码
void user_adc_start_conversion(void) { tmu_target_module_t targetModule = TMU_TARGET_MODULE_ADC1_EXT_TRIG; /* Configure ADC channel selection based on PWM index */ if(adcInst[UserAdcParams.pwmIndex][0] == ADC1_INST) { // ADC1->CHSEL[0] = adcInst[UserAdcParams.pwmIndex][1]; // ADC1->CHSEL[1] = adcInst[UserAdcParams.pwmIndex][1]; // ADC1->CHSEL[2] = adcInst[UserAdcParams.pwmIndex][1]; // ADC1->CHSEL[3] = adcInst[UserAdcParams.pwmIndex][1]; targetModule = TMU_TARGET_MODULE_ADC1_EXT_TRIG; } else { // ADC0->CHSEL[0] = adcInst[UserAdcParams.pwmIndex][1]; // ADC0->CHSEL[1] = adcInst[UserAdcParams.pwmIndex][1]; // ADC0->CHSEL[2] = adcInst[UserAdcParams.pwmIndex][1]; // ADC0->CHSEL[3] = adcInst[UserAdcParams.pwmIndex][1]; targetModule = TMU_TARGET_MODULE_ADC0_EXT_TRIG; } /* Update TMU target module directly without reinitializing entire TMU * This is more efficient than TMU_DRV_Init which resets all target modules */ TMU->MUX[3] = 0; TMU->MUX[4] = 0; TMU_SetTrigSourceForTargetModule(TMU, TMU_TRIG_SOURCE_eTMR0_EXT_TRIG, targetModule); }结果如下

快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...





