五一假期快乐哇大家! 祝大家旅途顺利假期开心(加班当我没说)
之前的文章陆陆续续介绍了STM32中的ADC采样与基于DMA的快速采样,本期我们介绍使用ADC的多通道采样。(好耶一篇文章拆开成三篇我真是天才)
首先我们需要明白一个ADC外设通常有许多个通道,合理的使用这些通道可以实现多个采样点的采样和利用多通道弥补采样率不足的问题。
首先我们需要知道,我们并不能直接获取某个通道的值。
我们HAL库中 的函数的函数仅有一个参数需要传入,因此我们不能直接的获取ADC的值,这时候我们就需要明白我们的ADC的转化规则。
在CubeMX中我们开启两个(或多个)ADC通道
开启扫描模式和离散转换模式,重点是这个离散转换模式。
允许在单个触发事件中执行多个ADC转换,而不是在每个触发事件中执行一次转换。这对于需要连续获取多个通道的数据时非常有用,因为可以在单个触发事件中获取多个通道的数据,而不需要多次触发。
这里的触发事件我们可以选择软件触发
这样子我们调用HAL_ADC_Start的时候就会开启ADC转化。
在下面的规则中规定我们的转换规则,这里我们是先测量Channel13再测量Channel11,我们调用HAL_ADC_GetValue的时候就会按照13->11->13->11…..的顺序获取我们的ADC的不同通道的值。
所以假如我们开启了4个通道,那么我们的多通道采样代码即可这样子写:
uint32_t adc_values[4]; // 存储4个通道的ADC值 while (1) { // 开始ADC转换 HAL_ADC_Start(&hadc1); // 依次转换4个通道 for (int i = 0; i < 4; i++) { // 等待转换完成 HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // 获取ADC值 adc_values[i] = HAL_ADC_GetValue(&hadc1); } HAL_ADC_Start(&hadc1);//再次开启采样 // 在这里处理ADC值 // adc_values数组包含了4个通道的ADC值 }}
这样子我们就可以获取四个通道的ADC采样的值了。
- DMA
同样,如果当我们配置了多通道DMA的时候,并且设置定时器实现采样率设置。
我们需要明白的是,DMA只是帮助我们为ADC的数据提供存储区,这样子就不需要利用MPU进行读取数据存放数据的操作了。
因此配置DMA并不影响ADC的采样规则,只是存入DMA缓存区的顺序发生了变化。
for(int i = 0;i<Lenth/2;i++) { ADC_V1[i] = ADC_Value[i*2]; ADC_V2[i] = ADC_Value[i*2+1] }
因此了解DMA的本质与多通道ADC采样的规则就可以实现多通道的ADC连续采样啦(不过这样子采样率会减半)。
别骂水文章了,五一人再旅游都还更新 ** (好吧是有点水了) **