hujjj 发表于 2020-4-8 12:33:19

基于STM32G431开发板ADC的问题

    我使用STM32G431RB开发板开通了ADC1的11、14、15三个通道,通过DMA获得转化值,存在两个问题一直没有解决,一是获得的数组数据与实际通道很难一一对应,即有时重启后会出现数组对应通道的数据会与前次不同,比方说前次数组下标0是对应14通道,而重启后有可能会对应15通道。二是得到的数值不准确,我是用杜邦线连接的,将连接全部切断后数据仍然照旧显示,只有重启后才会显示近似0值,此时再连接上杜邦线,ADC的数值并不会变化。我的代码是通过STM32CubeMX配置的,也许是我哪里配置不正确所致。基本配置的截图如下:

    GPIO的设置:



    DMA设置:






    NVIC设置:



    用户常数设置:



    CAD参数设置:















    在程序中相关的代码:
    DAM数组定义:
uint32_t adc_buff;
uint16_tadc_val;//存放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 = (float)(adc_buff&0xfff)*2000/4096;//最大测量电压20V,保留两位小数
    }
    HAL_ADC_Stop_DMA(&hadc1);
}

    请教各位看看我的设置有哪些问题,谢谢!

hujjj 发表于 2020-4-8 12:36:32

这是主程序中调取ADC数据和计算平均值的代码:

            //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 = 0;      //计算10次测量的平均值
                                for( j=0; j<10; j++){
                                  adc_val += adc_val;
                                }
                                adc_val = adc_val / 10;
                        }

hujjj 发表于 2020-4-8 14:04:08

是不是开启的通道不连续的问题?我目前开通的是11、14和15三个通道。

hujjj 发表于 2020-4-8 18:44:28

经过上网搜索,对比各项设置,已经基本解决了问题。由于反复修改,目前尚不清楚究竟是哪里设置不正确,还待慢慢对比截图。
页: [1]
查看完整版本: 基于STM32G431开发板ADC的问题