打印
[牛人杂谈]

N76E003 ADC使用方法

[复制链接]
1017|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
主要特点:
1、12位ADC。

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

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

4、启动方式:软件启动、硬件触发方式启动
ADC模块结构图



使用特权

评论回复
沙发
734774645|  楼主 | 2019-4-20 07:30 | 只看该作者
实例
不多说了,直接贴代码,实现的功能为使用内部参考电压测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);
    }
}


使用特权

评论回复
板凳
734774645|  楼主 | 2019-4-20 07:31 | 只看该作者
注意事项:
这里多次测内部产考电压的原因是:

连续(不延时)多次读取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,当然具体多少次自己定义。

使用特权

评论回复
地板
734774645|  楼主 | 2019-4-20 07:32 | 只看该作者
实验结果
vcc万用表测得的电压为3.3v,adc测得的电压为3.27v左右,误差30mv左右。

最后说一句,假如vcc不固定的,想用内部参考电压,但要求精度高的方案,慎用这款mcu。因此,你最好有一个靠谱的电源输入。

使用特权

评论回复
5
734774645|  楼主 | 2019-4-20 07:32 | 只看该作者
单片机是非常好的,但是要会用,了解它的性格,摸准它的脾气。

使用特权

评论回复
6
bayga456| | 2019-4-20 10:48 | 只看该作者
感谢分享,网上这单片机的资料不多。

使用特权

评论回复
7
zhuotuzi| | 2019-4-21 11:12 | 只看该作者
这个作为电压测量非常好用

使用特权

评论回复
8
jasontu| | 2019-4-22 08:10 | 只看该作者
734774645 发表于 2019-4-20 07:30
实例
不多说了,直接贴代码,实现的功能为使用内部参考电压测VCC电压值。

在切ADC通道時,我記得要ADC關閉。
可以參考BSP之中,ADC_multi_channel這一隻
https://github.com/OpenNuvoton/N76E003-BSP/blob/master/Sample_Code/ADC_multi_channel/Code/ADC.C

使用特权

评论回复
9
whtwhtw| | 2019-4-22 14:52 | 只看该作者
734774645 发表于 2019-4-20 07:32
单片机是非常好的,但是要会用,了解它的性格,摸准它的脾气。

看来兄弟还没有摸清楚该ic的脾气啊,虽然我也是新手,但是我知道N76E003这款芯片如果要用好ADC功能,除了通行的注意事项外,还有一点需要注意,就是ADC有专门一个通道测带隙电压,并且UID寄存器中存储有该带隙电压的校准数据!该数据可以反过来测量VCC,校准其它通道数据。

使用特权

评论回复
10
liangcha| | 2019-4-22 18:00 | 只看该作者
734774645 发表于 2019-4-20 07:31
注意事项:
这里多次测内部产考电压的原因是:

手册写得很明白了,每块MCU都有自己的BandGap需要读取UID确定,你直接用1.22那当然是不准确

使用特权

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

本版积分规则

197

主题

3451

帖子

14

粉丝