ADC是什么意思,adc是什么意思现实生活中

  

  前段时间开发了STM32常规通道的ADC。由于定时采集的需要,采用了外部触发方式。第一次接触STM32 ADC的时候,我觉得我可以驾驭它。但是随着开发进度,我发现STM32ADC还有很多我不知道的地方。现在我想和大家分享一下我在开发过程中的经验。   

  

  1.在STM32F103中,少于100个引脚的芯片的ADC基准电压连接到芯片内部的Vadd引脚,这在任何情况下都不能通过设置寄存器来改变。那么STM32内部有参考电压吗?答案是否定的,没有参考电压,但是有1.2V的参考电压说实话,一开始我以为这个参考电压就是参考电压,但是随着我学习的跟进,发现这个参考电压的作用只是“参考”。前面说过,基准电压Vref已经接在Vadd上了,所以这个基准电压和Vref不是一回事。它只是用来校正你读取的ADC值。例如,假设Vref=Vadd=3.3,adC通道和通道17的值(即基准电压)应在AD采集期间读取一次。假设此时读取的AD值为2000,通道17读取的值为1500。此时如果基准电压准确,Vadd有波动,那么Vref的实际值应该是4095*1.2/1500=3.27V,AD值2000对应的电压应该是2000/4095 * 3.27V=1.597V,这样就可以理解基准电压的作用了。如果对内部基准电压的精度不满意,可以打开另一个AD通道,连接外部基准电压芯片。   

  

  AD采集后的计算方法与内部基准电压相同。   

  

  2.STM32F103ADC的通道转换模式问题;   

  

  STM32的ADC有单次转换和连续转换两种模式,可以结合扫描模式。   

  

  CONT=0,SCAN=0单转换模式一次扫描一个通道。   

  

  CONT=1,SCAN=0连续转换模式连续扫描一个通道。   

  

  CONT=0,SCAN=1扫描模式:所有ADC_SQR串行通道转换一次,然后停止。(单一扫描组)   

  

  CONT=1,SCAN=1扫描模式:所有ADC_SQR串行通道转换一次,然后从第一个通道开始循环。连续扫描一组   

  

  请注意,如果您的转换序列中有多个通道需要转换,则必须开启扫描模式;否则,总是只转换第一个通道。   

  

  按照Ch0、Ch1、Ch2、Ch3的顺序使用ADC1常规通道启动扫描模式。   

  

  在单一转换模式下:   

  

  当ADC1启动时,则   

  

  1.开始转换Ch0   

  

  2.转换完成后,Ch1的转换将自动开始。   

  

  3.转换完成后,Ch2的转换将自动开始。   

  

  4.转换完成后,Ch3的转换将自动开始。   

  

  5.转换完成后停止,等待ADC的下一次启动。下一次ADC启动从第一步开始。   

  

  在连续转换模式下:   

  

  当ADC1启动时,则   

  

  1.开始转换Ch0   

  

  2.转换完成后,Ch1的转换将自动开始。   

  

  3.转换完成后,Ch2的转换将自动开始。   

  

  4.转换完成后,Ch3的转换将自动开始。   

  

  5.转换完成后,返回第一步。   

  

  如果没有启动Sacn模式,则上述过程中没有步骤2、3、4。   

  

  前提是不连续模式未启用。   

  

  关于这个扫描模式,我真的纠结了很久。起初,根据中文手册。   

  

  不使用DMA收集两个通道的常规通道。   

  

  中文手册定期通道组扫描介绍   

  

  手册上说转换后每个常规通道都设置了EOC,即每个通道都可以中断。既然如此,我们为什么要用DMA呢?打断一下,好吗?就是这样。程序写好了。经过跟踪调试,发现虽然中断已经进入,但是只有第二组数据。为什么不呢?手册讲的很好,为什么不呢?带着这个问题,楼主开始了探索之旅。   

  

  首先,继续在没有DMA的情况下读取ADC数据,在main函数中使用以下语句。   

  

  while (1)   

  

  {   

  

  If((ADC1-SR)0x02)//读取EOC位。   

  

  {   

  

  adcx=ADC _ GetConversionValue(ad C1);//返回最后一个ADC1规则组的转换结果   

  

  Filter _ Table Filter _ Tab _ Count=adcx;   

  

  }   

  

  }   

  

  或者只是最后一组数据。好吧,是这样的:   

  

  while (1)   

  

  {   

  

  adcx=ADC _ GetConversionValue(ad C1);//返回最后一个ADC1规则组的转换结果   

  

  Filter _ Table Filter _ Tab _ Count=adcx;   

  

  }   

  

  终于,成功了。在不同时间跟踪和停止时,可以读取第一组和第二组数据。这是为什么呢?说明第一个通道也在转换,但是转换结束时EOC没有置位,所以不能触发ADC的中断。   

  

  看来我又被手册忽悠了。不可能中断多个通道。   

  

  PS:手册中的一个规则通道应该指的是一个规则通道组。   

  

  扫描模式   

  

  好吧,那么启用DMA,那么问题来了。手动扫描模式中提到,设置EOC后DMA才会传输数据,所以不会耗费大量数据!   

  

  当然也提到了中文手册,以英文手册为准。如有疑问,打开英文手册再次确认。   

  

  英文手册扫描方式   

  

  如上面英文手册所述,DMA只会在ADC_DR寄存器每次更新后传输数据。   

  

  总结:ADC在采用规则通道组采集的时候必须启用扫描模式,并且启用DMA传输支持。   

相关文章