打印
[STM32F1]

ADC采样

[复制链接]
332|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
earlmax|  楼主 | 2024-9-21 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5 ADC采样5.1 ADC 采样基本与对齐

​ ADC采样是模拟量转化为数字量,DAC转换是数字量转化为模拟量。DMA可以用来做内存搬运,好处是不会占用CPU内存。使能ADC采样时,其有单信号采样(Single-ended)和差分信号采样(Differential),要根据原理图上的信号线数量来具体决定。ADC有很多通道1,有的通道支持差分信号采样,有的通道并不支持。

一般的ADC采样器是12位的,会把电压分成4096份,常见的数据对齐方式有左对齐和右对齐两种方法。所以:

  • 右对齐:是可以直接读取的。
  • 左对齐:读取后还需要除以64(2的4次方)才可以。
5.2 常用的采样模式

部分ADC模式:

  • **Clock Prescaler:**时钟预分频。配合时钟树调整适合的ADC采样频率,ADC采样频率太高会不稳定,并且从机(例如sht20传感器)的工作频率可能会跟不上。过高的频率没有意义。
  • **Resolution:**分辨率,分辨率越高,逐次逼近的转换时间越长。ADC转换时间=采样时间+逐次逼近转化时间。
  • **Scan Conversion mode:**是否开启扫描模式,即一个一个轮询每一个通道。多通道ADC采样时,默认使能。
  • **Continues Conversion mode:**选择是否使能连续转换模式。不使能相当于单次转换模式,ADC会将通道的所有转换执行一次。使能的话,相当于连续转换模式,该模式用于常规通道。在连续转换模式下,如果发生软件或者硬件触发,ADC会执行所有常规通道的转换,随后会自动重启并继续执行每一个通道的转换。若想使用ADC+DMA的话,必须先使能连续转换模式。
  • **Discontinuous Conversion Mode:**不连续序列转换模式,配置ADC规则组转换序列的不连续方式。这里的不连续含义是指每次触发进行一个子组的转换,跟Continuous Conversion Mode的连续含义不一样。例如使能了该配置,该参数的下方就立马出现Number Of Discontinuous Conversions,如果它设为2,且ADC1使能了通道1,2,5,7,10,11的话,那么第一次触发ADC1采样时,就会采样通道1与通道2的值,再一次触发ADC1采样的话,就会采样通道5与通道7值,如此类推。值得注意的是,Continuous Conversion Mode与Discontinuous Conversion Mode不能同时使能,两者不能共存。他会将n个通道分为一组,一次只采样一组。
  • **End of Conversion Selection:**结束转换的选择,End of single conversion(EOC) 与 End of sequence of conversion(EOS)两种选择。这两个事件会分别触发中断与DMA。一般选择EOS,等所有通道转换完毕后,产生中断后将全部数据取出来,或者使用DMA将全部数据取出来。
  • **Overrun behaviour:**溢出处理行为
  • **Low Power Auto Wait:**低功耗自动等待,需要低功耗时候使用。
  • **Enable Regular Conversions:**规则转换使能,一般都使能,即使用规则的方式进行ADC转换。
  • **Enable Regular Oversamping:**使能规则过采样,过采样的时候无法使用对齐模式。

ps:number of conversion:一定要根据ADC采样的个数来调整,他会决定我们分配几个RANK来存储数据。

5.3 ADC采样声音光强例程

CubeMX的配置:

//添加如下代码到adc.hextern int adc_sampel_lux_mic(uint32_t *lux, uint32_t *mic);//添加如下代码到adc.cenum{        LIG_ADC,        MIC_ADC,        MAX_ADC,};int adc_sampel_lux_mic(uint32_t *lux, uint32_t *mic){        uint8_t                                i;        uint32_t                        timeout=0xffffff;                for(i=0; i<MAX_ADC; i++)        {                HAL_ADC_Start(&hadc1);                HAL_ADC_PollForConversion(&hadc1, timeout);//等待转换完成                                if (i == LIG_ADC)                {                        *lux = HAL_ADC_GetValue(&hadc1);                }                if (i == MIC_ADC)                {                         *mic= HAL_ADC_GetValue(&hadc1);                }                HAL_Delay(10);        }        HAL_ADC_Stop(&hadc1);        return 0;}5.4 ADC采样常用函数//开启adc1的ADC采样HAL_ADC_Start(&hadc1);///查询函数,查询EOC标志位。每次采样,CPU在这里都要等待采样完成才能进行下一步,这段时间CUP没有干其他事,所以降低了CUP使用率HAL_ADC_PollForConversion(&hadc1, timeout);//获取ADC采样的值HAL_ADC_GetValue(&hadc1);//停止ADC采样HAL_ADC_Stop(&hadc1);

使用特权

评论回复
沙发
铁血丹心LLLL| | 2024-9-22 17:49 | 只看该作者
Single-ended)和差分信号采样(Differential)

使用特权

评论回复
板凳
qn7a12| | 2024-9-29 23:21 | 只看该作者
含义是指每次触发进行一个子组的转换

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

1414

帖子

1

粉丝