打印
[牛人杂谈]

ADC的使用方法

[复制链接]
2929|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新唐的ADC采样速度目前从300KSPS~1MSPS不等,通道8~16个不等。一般只有1组ADC,各个通道轮流采样。也有的是2组ADC,可以同时采样2个通道,例如:M0519。有的芯片有外部参考引脚Vref,有的只能使用AVDD(模拟电路电源脚)做参考。有的芯片有内部参考和温度传感器。但是内部参考一般不太准,全温度范围一般误差10%左右。使用内部参考的时候如果MCUVref 引脚可以从Vref输出,然后接1uF到地,这样内部参考更稳定。内部温度传感器使用ADC采样,规格如下,在Datasheet文件里面:

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

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

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

    /* Power on ADC */
    ADC_POWER_ON(ADC);

    /* 使用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精度常用的手段。

使用特权

评论回复
5
yiy| | 2017-4-18 22:03 | 只看该作者
这个太好了,把内部测温度的原理和计算方法都给出来了。

使用特权

评论回复
6
xixi2017| | 2017-4-18 23:07 | 只看该作者
难怪有的找不到参考电压的管脚,原来不是所有的都有的。

使用特权

评论回复
7
玛尼玛尼哄| | 2017-4-19 11:05 | 只看该作者
内部参考一般不太准,全温度范围一般误差10%左右

使用特权

评论回复
8
玛尼玛尼哄| | 2017-4-19 14:39 | 只看该作者
使用内部参考的时候如果MCU有Vref 引脚可以从Vref输出,然后接1uF到地,这样内部参考更稳定。
这个给力啊,终于知道怎么利用这个管脚了。

使用特权

评论回复
9
yiyigirl2014| | 2017-4-19 17:25 | 只看该作者
如果配置能全部用函数实现就行了,这看起来还有寄存器的,不伦不类。

使用特权

评论回复
10
wahahaheihei| | 2017-4-19 23:39 | 只看该作者
vref的使用很讲究的,用好了很难。

使用特权

评论回复
11
mintspring| | 2017-4-20 11:26 | 只看该作者
对于要求不严的时间定时,直接内部的就可以了。如果精确作为时钟使用,那就要外部用精密的晶振了。

使用特权

评论回复
12
gejigeji521| | 2017-4-20 22:51 | 只看该作者
需要先选择ADCIP的时钟源,使能ADC IP的时钟,然后配置多功能引脚。

使用特权

评论回复
13
zhuomuniao110|  楼主 | 2017-4-21 18:40 | 只看该作者
   ADC_POWER_ON(ADC);
有多少人知道,ADC其实是单独供电的,可以关闭或开启模块。

使用特权

评论回复
14
稳稳の幸福| | 2017-4-22 18:40 | 只看该作者
重要的不是代码,而是这个东西怎么用比较好。

使用特权

评论回复
15
598330983| | 2017-4-22 19:03 | 只看该作者
如果MCU有Vref 引脚可以从Vref输出,然后接1uF到地,这样内部参考更稳定。

使用特权

评论回复
16
huangcunxiake| | 2017-4-22 20:32 | 只看该作者
一般一组ADC就够用了,很少需要两个通道同时进行的情况。

使用特权

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

本版积分规则

206

主题

3358

帖子

10

粉丝