此次采用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资源,还刷新速度超快,还顺便把滤波给做了。以后就这么用就完事儿了!