ADC采样不准
未解决
YTM32B1H系列
-
目前情况为:对于ADC0分配了三个通道 ADC1分配了一个通道,其中ADC0的ADC_INPUTCHAN_EXT25和ADC1的ADC_INPUTCHAN_EXT21是不准确(前者偏差0.7v,后者偏差0.4v),ADC0的ADC_INPUTCHAN_EXT14和ADC_INPUTCHAN_EXT19是准确的
具体配置如下:const adc_converter_config_t adc_config0={ .clockDivider=0, .startTime=12, .sampleTime=16, .overrunMode=false, .autoOffEnable=false, .waitEnable=false, .trigger=ADC_TRIGGER_SOFTWARE, .align=ADC_ALIGN_RIGHT, .resolution=ADC_RESOLUTION_12BIT, .dmaWaterMark=0, .dmaEnable=false, .sequenceConfig={ .sequenceMode=ADC_CONV_STEP, .sequenceIntEnable=true, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .channels={ ADC_INPUTCHAN_EXT14, ADC_INPUTCHAN_EXT19, ADC_INPUTCHAN_EXT25, }, .totalChannels=3, }, .adcCompareCnt=0, }; const adc_converter_config_t adc_config1={ .clockDivider=0, .startTime=12, .sampleTime=16, .overrunMode=false, .autoOffEnable=false, .waitEnable=false, .trigger=ADC_TRIGGER_SOFTWARE, .align=ADC_ALIGN_RIGHT, .resolution=ADC_RESOLUTION_12BIT, .dmaWaterMark=0, .dmaEnable=false, .sequenceConfig={ .sequenceMode=ADC_CONV_STEP, .sequenceIntEnable=true, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .channels={ ADC_INPUTCHAN_EXT21, }, .totalChannels=1, }, .adcCompareCnt=0, }; /* ADC0通道配置数组 - 单通道独立配置 */ const adc_sequence_config_t adc0_ChnConfigArray[8] = { /* 通道0: PTC_16 -> ADC0_S14 -> EXT14 (ON_AD功能) */ { .sequenceIntEnable = false, .convIntEnable = false, .readyIntEnable = false, .ovrunIntEnable = false, .sampIntEnable = false, .sequenceMode = ADC_CONV_STEP, .channels = { ADC_INPUTCHAN_EXT14 }, .totalChannels = 1, }, /* 通道1: PTB_22 -> ADC0_S19 -> EXT19 (ACC_AD功能) */ { .sequenceIntEnable = false, .convIntEnable = false, .readyIntEnable = false, .ovrunIntEnable = false, .sampIntEnable = false, .sequenceMode = ADC_CONV_STEP, .channels = { ADC_INPUTCHAN_EXT19 }, .totalChannels = 1, }, /* 通道2: PTB_9 -> ADC0_S25 -> EXT25 (备用) */ { .sequenceIntEnable = false, .convIntEnable = false, .readyIntEnable = false, .ovrunIntEnable = false, .sampIntEnable = false, .sequenceMode = ADC_CONV_STEP, .channels = { ADC_INPUTCHAN_EXT25 }, .totalChannels = 1, }, // /* 通道3-7: 备用通道 */ // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, }; /* ADC1通道配置数组 - 顺序与adc_config1的channels列表保持一致 */ const adc_sequence_config_t adc1_ChnConfigArray[8] = { /* 通道0: PTD_27 -> ADC1_S21 -> EXT21 (5V_AD功能) */ { .sequenceIntEnable = false, .convIntEnable = false, .readyIntEnable = false, .ovrunIntEnable = false, .sampIntEnable = false, .sequenceMode = ADC_CONV_STEP, .channels = { ADC_INPUTCHAN_EXT21 }, .totalChannels = 1, }, // /* 通道1-4: 原INPUT1~4通道,已停用 */ // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // /* 通道5-7: 备用通道 */ // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, // { .sequenceIntEnable=false, .convIntEnable=false, .readyIntEnable=false, .ovrunIntEnable=false, .sampIntEnable=false, .sequenceMode=ADC_CONV_STEP, .channels={ ADC_INPUTCHAN_EXT0 }, .totalChannels=1 }, };调用情况如下
int16_t HAL_ADC_GetValue(uint32_t instance, uint8_t chn) { uint32_t convtime = 0; uint16_t value; /* 根据ADC实例选择对应的配置数组 */ const adc_sequence_config_t *chnConfig; if (instance == INST_ADC0) { chnConfig = &adc0_ChnConfigArray[chn]; } else if (instance == INST_ADC1) { chnConfig = &adc1_ChnConfigArray[chn]; } else { return -1; // 无效的ADC实例 } ADC_DRV_ConfigSequence(instance, chnConfig); ADC_DRV_Start(instance); while(!ADC_DRV_GetEndOfSequenceFlag(instance)) { /* AD值采集超时,避免死循环等待 */ if (++convtime >= ADC_TIMEOUT) { return -1; } } ADC_DRV_ClearEoseqFlagCmd(instance); value = ADC_DRV_ReadFIFO(instance); return value; }打印出来的FIFO如下图 ADC0和ADC1是准确的 ADC3和ADC4分别有0.7v和0.4v的偏差

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