打印
[牛人杂谈]

N76E003 ADC使用方法

[复制链接]
2965|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
主要特点:

1、12位ADC。

2、8通道单端输入模式。(一次只能测一个通道电压,值都存在ACCRH、ACCRL)

3、内部带隙电压(band-gap voltage)为1.22V,可作为内部参考电压

4、启动方式:软件启动、硬件触发方式启动

ADC模块结构图
实例

不多说了,直接贴代码,实现的功能为使用内部参考电压测VCC电压值。

void main(void)
{
    uint16_t BandGap_H, BandGap_L, AIN3_H, AIN3_L;
    uint16_t BandGap_v;
    uint32_t AIN3_v = 0;
        uint16_t voltage = 0;
       
    while(1)
    {
        Enable_ADC_BandGap;               
            clr_ADCF;
            set_ADCS;                                // Each time ADC start trig signal
            while(ADCF == 0);
        clr_ADCF;
            set_ADCS;                                // Each time ADC start trig signal
            while(ADCF == 0);
        clr_ADCF;
            set_ADCS;                                // Each time ADC start trig signal
            while(ADCF == 0);
            BandGap_H = ADCRH;
            BandGap_L = ADCRL;
            BandGap_v = BandGap_H << 4 | BandGap_L;
            //printf ("\n Value = 0x%bx",ADCRH);
            //printf ("\n Value = 0x%bx",ADCRL);
       
            Enable_ADC_AIN3;
            clr_ADCF;
            set_ADCS;                                // Each         time ADC start trig signal
            while(ADCF == 0);
            AIN3_H = ADCRH;
            AIN3_L = ADCRL;
            AIN3_v = AIN3_H << 4 | AIN3_L;
            //printf ("\n AIN3 Value = 0x%bx",ADCRH);
            //printf ("\n AIN3 Value = 0x%bx",ADCRL);
            voltage = (uint16_t)((uint32_t)AIN3_v * 1220 / BandGap_v );

        Timer0_Delay1ms(1000);
    }
}
注意事项:

这里多次测内部产考电压的原因是:

连续(不延时)多次读取band-gap voltage的值 与 单次读取然后延时再次读取到的值不同,而且延时时间不同,读取到的值也不同(相当无语)

例如下面两段代码:

Enable_ADC_BandGap;                        //Find in "Function_define.h" - "ADC INIT"
while(1)
{
    clr_ADCF;
    set_ADCS;                                        // Each time ADC start trig signal
    while(ADCF == 0);
    BandGap_H = ADCRH;
    BandGap_L = ADCRL;
    Timer0_Delay1ms(1000);
}
Enable_ADC_BandGap;                                                //Find in "Function_define.h" - "ADC INIT"
while(1)
{
    clr_ADCF;
    set_ADCS;                                                        // Each time ADC start trig signal
    while(ADCF == 0);
    BandGap_H = ADCRH;
    BandGap_L = ADCRL;
    //Timer0_Delay1ms(1000);
}

加延时和不加延时读出来的值是不一样的,实测不加延时读出来的比较准确。所以实例中使用的小技巧是连续读3次内部参考电压后再测vcc,当然具体多少次自己定义。



沙发
643757107|  楼主 | 2018-9-14 18:28 | 只看该作者
实验结果
vcc万用表测得的电压为3.3v,adc测得的电压为3.27v左右,误差30mv左右。
当然可能万用表不准,25元包邮的那种。

使用特权

评论回复
板凳
734774645| | 2018-9-14 19:27 | 只看该作者
一般不用参考,如果不是要标准电压呢,比如测的是其他量的变化导致的,那直接用VCC参考,反正怎么波动都是同步的,比例是一样的。

使用特权

评论回复
地板
mintspring| | 2018-9-14 20:10 | 只看该作者
那个是你非要想知道具体电压采用的内部参考。

使用特权

评论回复
5
huangcunxiake| | 2018-9-15 18:49 | 只看该作者
ADC用好了,那简直太神奇了。

使用特权

评论回复
6
xinxianshi| | 2018-9-15 23:58 | 只看该作者
各种滤波用起来嗨皮。

使用特权

评论回复
7
antusheng| | 2018-9-16 16:37 | 只看该作者
用法好多啊。查询中断,能否DMA?

使用特权

评论回复
8
antusheng| | 2018-9-16 16:37 | 只看该作者
貌似003不能DMA,M0的可以

使用特权

评论回复
9
wanduzi| | 2018-9-18 23:59 | 只看该作者
学习,谢谢。

使用特权

评论回复
10
15228869197| | 2018-10-25 11:16 | 只看该作者
voltage = (uint16_t)((uint32_t)AIN3_v * 1220 / BandGap_v );
这个转换方式是怎么来的

使用特权

评论回复
11
yiy| | 2018-10-25 15:09 | 只看该作者
15228869197 发表于 2018-10-25 11:16
voltage = (uint16_t)((uint32_t)AIN3_v * 1220 / BandGap_v );
这个转换方式是怎么来的

这个是手册规定的吧

使用特权

评论回复
12
yiy| | 2018-10-25 15:09 | 只看该作者
我觉得那个强制类型转换的意思就是方便数据格式转换。比如小数点后的控制

使用特权

评论回复
13
hanzhen654| | 2018-10-25 20:15 | 只看该作者
跟32 的ADC 类似吧?用起来不知道差别大不大?

使用特权

评论回复
14
hanzhen654| | 2018-10-25 20:16 | 只看该作者
12位ADC 可以满足一般的场合了

使用特权

评论回复
15
15228869197| | 2018-10-29 16:36 | 只看该作者
BandGap_v = BandGap_H << 4 | BandGap_L;
BandGap_v 这个带隙电压值读出来为什么不是4095呢,我读出了相差有点大

使用特权

评论回复
16
寂静的火| | 2018-11-14 14:27 | 只看该作者
本帖最后由 寂静的火 于 2018-11-14 14:28 编辑

这神奇的操作,,还好看到了,,正准备用呢

使用特权

评论回复
17
huangcunxiake| | 2018-11-14 14:57 | 只看该作者
我去,带隙电压测量,前两次是要丢弃?终于看懂为何重复操作了。

使用特权

评论回复
18
jiekou001| | 2018-11-15 16:24 | 只看该作者
外部接口测一次就准吗

使用特权

评论回复
19
杨德金| | 2019-1-23 23:07 | 只看该作者

使用特权

评论回复
20
kongabc| | 2019-1-26 17:23 | 只看该作者
你好 请问一下ADC采样的值怎么可以看出来???或者怎么在串口软件的显示出来?谢谢 刚刚学不太懂

使用特权

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

本版积分规则

213

主题

3784

帖子

11

粉丝