关于STM32F0 ,ADC多通道采集,AD值与通道对应不上,有遇到过的吗

 请教大师们个问题,我用的是F0系列的ST,在做ADC采集,单路采集时AD值很准确,但是多路采集时,AD值与AD通道对应不上,我用的是cube软件,有遇到过的吗 


已邀请:

cruse

赞同来自:

同样出现过这样的问题。如果是多通道DMA,需要每次进入中断时停止采集,等到数据处理完之后再打开DMA。DMA模式选择Normal就好了。

下面是测试过可行的代码:

#define ADC_WindowSize 4
volatile uint16_t ADC_RawBuffer[ADC_WindowSize][2];
// 2代表两个通道
uint16_t ADC_SumBuffer[2];
uint16_t ADC_Filtered[2];
float ADC_Voltage[2];
float ADC_Temperature[2];

开始采集:

HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_RawBuffer, ADC_WindowSize * 2);

回调函数:

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
    if (hadc->Instance == ADC1) {
        HAL_ADC_Stop_DMA(&hadc1);    // !IMPORTANT! Remember to stop ADC before enabling DMA again.
// Data alignment!

// 这里换成您的数据处理

// Filter for each channel: Average of (ADC_WindowSize) samples.
for (uint8_t channel = 0; channel < 2; channel++) {

    // Summing.
            ADC_SumBuffer[channel] = 0;
    for (uint8_t i = 0; i < ADC_WindowSize; i++) {
ADC_SumBuffer[channel] += ADC_RawBuffer[i][channel];
    }

    // Calculate average.
    ADC_Filtered[channel] = ADC_SumBuffer[channel] / ADC_WindowSize;

    // Convert to voltage.
    ADC_Voltage[channel] = ADC_Filtered[channel] * 3.3f / 4096.0f;
        }

// Restart ADC Conversion.
while (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_RawBuffer, ADC_WindowSize * 2) != HAL_OK);
    }
}


Courage

赞同来自: 神弃-之子

通道和采集数据不对是因为adc采集速率太快,还有就是配置dma有问题

niiuxingrun - .........

赞同来自: 神弃-之子

cube里面通道配置错误,需要把用到的通道打开,默认打开都是0通道

t289466080

赞同来自:

DMA模式选择Normal,每次都要执行一次HAL_ADC_Start_DMA

l1w1w1

赞同来自:

不错,学习了

要回复问题请先登录注册