STM32F429 ADC实验三:cubemx实现多通道连续采集(DMA)

此次采用DMA的方式采集多通道,这个过程是参照微雪课堂来修改的http://www.waveshare.net/study/article-646-1.html

与不采用DMA的方式多通道连续采样相比,开启了DMA采样询问

添加DMA,设置模式为循环,数据宽度为16位(跟微雪不同,因为精度为12位,最大也就是4096,够用即可)

由于DMA采用了连续传输的模式,ADC采集到的数据会不断传到到存储器中(此处即为数组ADC_Value)。ADC采集的数据从ADC_Value[0]一直存储到ADC_Value[99],然后采集到的数据又重新存储到ADC_Value[0],一直到ADC_Value[99]。所以ADC_Value数组里面的数据会不断被刷新。这个过程中是通过DMA控制的,不需要CPU参与。我们只需读取ADC_Value里面的数据即可得到ADC采集到的数据。

在我们的实验里,ADC_Value[0]放通道4,ADC_Value[1]放通道5,ADC_Value[2]放通道4。。。以此类推。。。

uint16_t 	_u16ADC_Value[100];
uint32_t 	_u32Value1;
uint32_t 	_u32Value2;

int main(void)
{
    uint8_t 	i = 0;
    MX_ADC1_Init();
    HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&_u16ADC_Value, 100);
    while(1)
    {
        for(i=0,_u32Value1=0,_u32Value2=0;i < 100;)
	{
		_u32Value1 += _u16ADC_Value[i++];
		_u32Value2 += _u16ADC_Value[i++];
	}
	_u32Value1 = _u32Value1/50;
	_u32Value2 = _u32Value2/50;
	sprintf((char*)InLtdcBuff1, "ADC1_CH4: %1.2f V\r\n", _u32Value1*3.3f/4096);  
	sprintf((char*)InLtdcBuff2, "ADC1_CH5: %1.2f V\r\n", _u32Value2*3.3f/4096); 
 
        LTDC_Refresh(InLtdcBuff1, InLtdcBuff2);				//屏幕的刷新
        
        //喂狗
	HAL_IWDG_Refresh(&hiwdg);
	delay_ms(100);
    }
}

现象如下图:

总结:

DMA方式采集ADC还是十分简单的,而且真的很方便有没有,还节省CPU资源,还刷新速度超快,还顺便把滤波给做了。以后就这么用就完事儿了!

发布了26 篇原创文章 · 获赞 0 · 访问量 2989

猜你喜欢

转载自blog.csdn.net/nianzhu2937/article/details/103770733