[牛人杂谈]

N76E003 ADC使用方法

[复制链接]
2639|20
手机看帖
扫描二维码
随时随地手机跟帖
643757107|  楼主 | 2018-9-14 18:27 | 显示全部楼层 |阅读模式
主要特点:

1、12位ADC。

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

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

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

ADC模块结构图 790865b9b8cd0d2505.png
实例

不多说了,直接贴代码,实现的功能为使用内部参考电压测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 | 显示全部楼层
那个是你非要想知道具体电压采用的内部参考。

使用特权

评论回复
huangcunxiake| | 2018-9-15 18:49 | 显示全部楼层
ADC用好了,那简直太神奇了。

使用特权

评论回复
xinxianshi| | 2018-9-15 23:58 | 显示全部楼层
各种滤波用起来嗨皮。

使用特权

评论回复
antusheng| | 2018-9-16 16:37 | 显示全部楼层
用法好多啊。查询中断,能否DMA?

使用特权

评论回复
antusheng| | 2018-9-16 16:37 | 显示全部楼层
貌似003不能DMA,M0的可以

使用特权

评论回复
wanduzi| | 2018-9-18 23:59 | 显示全部楼层
学习,谢谢。

使用特权

评论回复
15228869197| | 2018-10-25 11:16 | 显示全部楼层
voltage = (uint16_t)((uint32_t)AIN3_v * 1220 / BandGap_v );
这个转换方式是怎么来的

使用特权

评论回复
yiy| | 2018-10-25 15:09 | 显示全部楼层
15228869197 发表于 2018-10-25 11:16
voltage = (uint16_t)((uint32_t)AIN3_v * 1220 / BandGap_v );
这个转换方式是怎么来的

这个是手册规定的吧

使用特权

评论回复
yiy| | 2018-10-25 15:09 | 显示全部楼层
我觉得那个强制类型转换的意思就是方便数据格式转换。比如小数点后的控制

使用特权

评论回复
hanzhen654| | 2018-10-25 20:15 | 显示全部楼层
跟32 的ADC 类似吧?用起来不知道差别大不大?

使用特权

评论回复
hanzhen654| | 2018-10-25 20:16 | 显示全部楼层
12位ADC 可以满足一般的场合了

使用特权

评论回复
15228869197| | 2018-10-29 16:36 | 显示全部楼层
BandGap_v = BandGap_H << 4 | BandGap_L;
BandGap_v 这个带隙电压值读出来为什么不是4095呢,我读出了相差有点大

使用特权

评论回复
寂静的火| | 2018-11-14 14:27 | 显示全部楼层
本帖最后由 寂静的火 于 2018-11-14 14:28 编辑

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

使用特权

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

使用特权

评论回复
jiekou001| | 2018-11-15 16:24 | 显示全部楼层
外部接口测一次就准吗

使用特权

评论回复
杨德金| | 2019-1-23 23:07 | 显示全部楼层

使用特权

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

使用特权

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

本版积分规则

199

主题

3689

帖子

11

粉丝