我使用STM32G431RB开发板开通了ADC1的11、14、15三个通道,通过DMA获得转化值,存在两个问题一直没有解决,一是获得的数组数据与实际通道很难一一对应,即有时重启后会出现数组对应通道的数据会与前次不同,比方说前次数组下标0是对应14通道,而重启后有可能会对应15通道。二是得到的数值不准确,我是用杜邦线连接的,将连接全部切断后数据仍然照旧显示,只有重启后才会显示近似0值,此时再连接上杜邦线,ADC的数值并不会变化。我的代码是通过STM32CubeMX配置的,也许是我哪里配置不正确所致。基本配置的截图如下: GPIO的设置: DMA设置: NVIC设置: 用户常数设置: CAD参数设置: 在程序中相关的代码: DAM数组定义: uint32_t adc_buff[4]; uint16_tadc_val[3][11]; //存放10组数据及平均值 主程序中的相关代码: HAL_ADCEx_Calibration_Start(&hadc1,1); //开启自动校准 HAL_ADC_Start_DMA(&hadc1,adc_buff,3); //启动AD转换开关并使能DMA传输和中断 读取转换值的函数: void Get_ADC_Val(uint8_t id) { uint8_t i; HAL_ADC_Start_DMA(&hadc1,(uint32_t *) adc_buff,3); HAL_ADC_ConvHalfCpltCallback(&hadc1); for ( i=0; i<3; i++ ) //分别处理三路ADC { adc_val[id] = (float)(adc_buff&0xfff)*2000/4096; //最大测量电压20V,保留两位小数 } HAL_ADC_Stop_DMA(&hadc1); } 请教各位看看我的设置有哪些问题,谢谢! |
//ADC处理
adc_id++;
if(adc_id > 9) adc_id = 0;
Get_ADC_Val(adc_id); //读取adcl转换数据,存放在id下标数组中
for( i=0; i<3; i++){
adc_val[i][10] = 0; //计算10次测量的平均值
for( j=0; j<10; j++){
adc_val[i][10] += adc_val[i][j];
}
adc_val[i][10] = adc_val[i][10] / 10;
}