[牛人杂谈] ADC的使用方法

[复制链接]
3371|15
 楼主| zhuomuniao110 发表于 2017-4-18 21:59 | 显示全部楼层 |阅读模式
新唐的ADC采样速度目前从300KSPS~1MSPS不等,通道8~16个不等。一般只有1组ADC,各个通道轮流采样。也有的是2组ADC,可以同时采样2个通道,例如:M0519。有的芯片有外部参考引脚Vref,有的只能使用AVDD(模拟电路电源脚)做参考。有的芯片有内部参考和温度传感器。但是内部参考一般不太准,全温度范围一般误差10%左右。使用内部参考的时候如果MCUVref 引脚可以从Vref输出,然后接1uF到地,这样内部参考更稳定。内部温度传感器使用ADC采样,规格如下,在Datasheet文件里面:

2.png
ADC采样得到的电压值,减去Offset,然后每降低1.68mV温度上升一度。

 楼主| zhuomuniao110 发表于 2017-4-18 22:00 | 显示全部楼层
下面代码演示的是ADC 单端,单次采样模式。照例需要先选择ADCIP的时钟源,使能ADC IP的时钟,然后配置多功能引脚。用到的时钟记得在Sys_Init中使能并等待时钟稳定。这里只列出跟 ADC有关的初始化。
  1. int32_t ADC_Init (void)
  2. {
  3.     /* 选择时钟源,ADC选HIRC,并且除频=12M/5 */
  4.     CLK_SetModuleClock(ADC_MODULE,CLK_CLKSEL1_ADC_S_HIRC,CLK_ADC_CLK_DIVIDER(5));
  5.     /* 使能ADC IP的时钟 */
  6.     CLK_EnableModuleClock(ADC_MODULE);
  7.     /* 配置 PA.0 用作ADC 通道0 */
  8.     SYS->PA_L_MFP = (SYS->PA_L_MFP & ~SYS_PA_L_MFP_PA0_MFP_Msk) |
  9. SYS_PA_L_MFP_PA0_MFP_ADC_CH0;

  10.     /* 关闭PA.0 的数字通路 */
  11.     PA->OFFD |= ((1 << 0) << GP_OFFD_OFFD_Pos);
  12.     /* ADC工作在单端single模式,并使能通道0准备采样 */
  13.     ADC_Open(ADC, ADC_INPUT_MODE_SINGLE_END, ADC_OPERATION_MODE_SINGLE, ADC_CH_0_MASK);

  14.     /* Power on ADC */
  15.     ADC_POWER_ON(ADC);

  16.     /* 使用AVDD电压作为参考*/


 楼主| zhuomuniao110 发表于 2017-4-18 22:01 | 显示全部楼层
ADC有3种工作模式:单次、单次循环和连续循环模式。
        单次:就是在某个使能的通道上完成一次转换就停止
        单次循环:就是在所有使能的通道上完成一次转换就停止
        连续循环:就是在所有使能的通道完成一次转换,再完成一次转换,连续不断的转换,直到软件将其停止
ADC的信号有2种输入模式:单端,差分
        单端:就是采样单个通道
        差分:就是两个通道的信号相减再采样
上面的代码选择HIRC做ADC的时钟源,并且进行除频,也就是ADC的工作频率为12M/5 = 2.4M。然后使能ADC的时钟,将PA.0配置为ADC功能,同时关闭PA.0的数字通路。最后配置ADC 为单端,单次模式,并使能通道0,选择Vref引脚作参考源,并使能ADC中断。启动ADC转换,等转换完成之后,读取转换结果。
 楼主| zhuomuniao110 发表于 2017-4-18 22:01 | 显示全部楼层
要让ADC工作很容易,但是要用好ADC是不容易的。ADC的转换结果受参考电压的影响很大,如果希望转换结果更准确,参考电压就不能波动。另外如果使能了多个通道轮流采样,因为内部只有一个采样电容,各个通道之间会互相影响。这个时候可以通过外加电容,并降低ADC的工作频率,增加ADC的采样时钟等办法来解决。
例如:使用ADC检测VDD电压。使用两个400K电阻分压然后拉到PA.0采样,同时PA.1也使能用来采样其它的信号。这时候如果PA.1的电压比PA.0高,检测到的VDD电压会偏高,否则会偏低。用示波器看PA.0的信号,也会看到信号是波动的,这个波动很正常。因为PA.1比PA.0高的时候,采样PA.0时,内部采样电容会放电,将PA.0的电压拉高。这时候降低ADC的工作频率,增加采样时钟个数,测到的PA.0的值就会正常了。如果PA.1比PA.0低,这时候PA.0外部需要接对地电容,它可以对PA.0快速充电,测到的PA.0的值就会正常了。
所以,
1)        外加电容
2)        降低 ADC 工作频率 3) 增加 ADC 采样时钟是调ADC精度常用的手段。
yiy 发表于 2017-4-18 22:03 | 显示全部楼层
这个太好了,把内部测温度的原理和计算方法都给出来了。
xixi2017 发表于 2017-4-18 23:07 | 显示全部楼层
难怪有的找不到参考电压的管脚,原来不是所有的都有的。
玛尼玛尼哄 发表于 2017-4-19 11:05 | 显示全部楼层
内部参考一般不太准,全温度范围一般误差10%左右
玛尼玛尼哄 发表于 2017-4-19 14:39 | 显示全部楼层
使用内部参考的时候如果MCU有Vref 引脚可以从Vref输出,然后接1uF到地,这样内部参考更稳定。
这个给力啊,终于知道怎么利用这个管脚了。
yiyigirl2014 发表于 2017-4-19 17:25 | 显示全部楼层
如果配置能全部用函数实现就行了,这看起来还有寄存器的,不伦不类。
wahahaheihei 发表于 2017-4-19 23:39 | 显示全部楼层
vref的使用很讲究的,用好了很难。
mintspring 发表于 2017-4-20 11:26 | 显示全部楼层
对于要求不严的时间定时,直接内部的就可以了。如果精确作为时钟使用,那就要外部用精密的晶振了。
gejigeji521 发表于 2017-4-20 22:51 | 显示全部楼层
需要先选择ADCIP的时钟源,使能ADC IP的时钟,然后配置多功能引脚。
 楼主| zhuomuniao110 发表于 2017-4-21 18:40 | 显示全部楼层
   ADC_POWER_ON(ADC);
有多少人知道,ADC其实是单独供电的,可以关闭或开启模块。
稳稳の幸福 发表于 2017-4-22 18:40 | 显示全部楼层
重要的不是代码,而是这个东西怎么用比较好。
598330983 发表于 2017-4-22 19:03 | 显示全部楼层
如果MCU有Vref 引脚可以从Vref输出,然后接1uF到地,这样内部参考更稳定。
huangcunxiake 发表于 2017-4-22 20:32 | 显示全部楼层
一般一组ADC就够用了,很少需要两个通道同时进行的情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

233

主题

3529

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部