ptz19861212 发表于 2016-9-9 15:28:24

义隆 EM78P372N 这个芯片 ADC感觉不对

最近在用EM78P372N 想做一个移动电源,但是发现EM78P372N ADC好像有问题,我用的是内部的3V基准,结果测试出来ADC数值不对。我后面负载接了240mA,通过的是0.05的电阻,在ADC引脚上面的电压是 11.8mV,理论上面应该是16个AD数值,但是实际只有2个AD数值。
我用仿真器的时候也发现了,ADC出来的数值总是和理论值相差几十个。我采样分频用了最大的 1/64,采样时间也是用的是最大的,寄存器也是读的是高位和低位寄存器。
是这个芯片不行?还是什么情况?

xjjiang 发表于 2016-9-9 15:31:53

这颗料批量什么价格?

rqiang 发表于 2016-9-9 15:42:10

仿真器能测到11.8mV?做个ADC DEMO程序,烧个芯片装板测试

ptz19861212 发表于 2016-9-9 15:49:21

xjjiang 发表于 2016-9-9 15:31
这颗料批量什么价格?

我当时问了以下,大概是 1.1 这个样子。 我也不清楚是贵了还是便宜了。

ptz19861212 发表于 2016-9-9 15:54:26

rqiang 发表于 2016-9-9 15:42
仿真器能测到11.8mV?做个ADC DEMO程序,烧个芯片装板测试

我现在就是实际烧录了芯片,焊接到板子上面的。
我程序里面直接 :
      if (adcLoad < 1)
      {
          LED_RED_ON;
      }
      else if (adcLoad < 2)
      {
          LED_GREEN_ON;
      }
      else
      {
          LED_BLUE_ON;
      }

然后差不多 250mA 以下一直亮红灯,250mA 以上才转为绿灯,采样电阻用的 0.05 欧姆的,算下来电压 12.5mV,实际 11.8mV。理论ADC 16,实际ADC是2。
我ADC采样4次然后求平均的。
我现在直接去掉了电池保护芯片 DW01,电池负极直接和整个电路的负极相连,去掉升压芯片,直接用 电池电压给负载供电。基本上干扰已经去除掉了,所以我才觉得奇怪。

ptz19861212 发表于 2016-9-9 15:58:45

rqiang 发表于 2016-9-9 15:42
仿真器能测到11.8mV?做个ADC DEMO程序,烧个芯片装板测试

仿真器我是测电池电量,然后计算理论和实际ADC偏差的,偏差几十个ADC。
而且我已经按照应用手册里面的 校准了ADC。
老实说,我用过好几家的芯片,感觉AVR,ST 的ADC不错,MSP430的ADC会莫名其妙的飘,而义隆的就是偏差太大了。。。

i7gly 发表于 2016-9-9 16:06:23

初始化时ADC要校准,具体找代理拿代码.

ptz19861212 发表于 2016-9-9 16:37:49

i7gly 发表于 2016-9-9 16:06
初始化时ADC要校准,具体找代理拿代码.

ADC 有校准呀,按照应用手册里面的进行校准的。
至于那个代理,简直不能忍,技术支持约等于0。 现在准备找其他的义隆代理拿芯片,有没有推荐的义隆代理呢?

void AdcInit(void)
{
AISR = 0X0C;
//ADCON = 0X0B;
//ADCON = 0X4B;
//ADCON = 0X4A;

/* internal vref vdd, clk = 1:64, power down, adc load channel */
ADCON = 0X42;
/* cali disable, vref = 3.0v, adc internal channel disable */
ADOC = 0X04;
/* use internal vref need 50us in the first time */
Delay50us();
/* adc power on */
ADPD = 1;
AdcCali();
}

void AdcCali(void)
{
uint8_t cnt;
cnt = 0x0F;
//ADOC = 0XFC;
ADOC |= 0XF8;
/* use internal vref need 50us in the first time */
//Delay50us();

do
{
    ADRUN = 1;
    while (ADRUN == 1);
    cnt--;
   
    if (!SIGN)
    {
      ADOC += 0X08;
    }
    else
    {
      ADOC -= 0X08;
    }
   
    if (cnt == 0)
    {
      cnt = 0x0F;
      if (SIGN)
      {
      //ADOC = 0X82;
      ADOC = 0X84;
      }
      else
      {
      CALI = 0;
      }
    }
} while (ADDATA1H || ADDATA1L && CALI);

CALI = 0;
}

void AdcChanLoad(void)
{
ADCON &= 0XF8;
ADCON |= 0X02;
//ADCON |= 0x04;
//ADOC |= 0X01;
}

void AdcLoadAver(void)
{
adcLoadSum -= adcLoadBuffer;
adcLoadBuffer = adcTmp;
adcLoadSum += adcTmp;
adcLoad = adcLoadSum >> ADC_LOAD_BUFFER_BITS;

adcLoadIndex++;
if (adcLoadIndex >= ADC_LOAD_BUFFER_MAX)
{
    adcLoadIndex = 0;
}
}

ptz19861212 发表于 2016-9-9 16:41:05

i7gly 发表于 2016-9-9 16:06
初始化时ADC要校准,具体找代理拿代码.

请问, 校准是不是ADC模块供电 后只要校准一次就行了? ADC模块不断电,就不需要重新校准了吧?

i7gly 发表于 2016-9-9 16:41:36

ptz19861212 发表于 2016-9-9 16:37
ADC 有校准呀,按照应用手册里面的进行校准的。
至于那个代理,简直不能忍,技术支持约等于0。 现在准备 ...

我这边也是用过这颗芯片做移动电源,没有这个问题.
这颗料已经没什么性价比了,所以现在都很少用了,

i7gly 发表于 2016-9-9 16:43:22

ptz19861212 发表于 2016-9-9 16:41
请问, 校准是不是ADC模块供电 后只要校准一次就行了? ADC模块不断电,就不需要重新校准了吧? ...

开机校准一次就可以了,还有为什么不用2V参考要用3V呢?当锂电池掉到3V后这个基准就不准了.

rqiang 发表于 2016-9-9 16:43:48

ptz19861212 发表于 2016-9-9 15:54
我现在就是实际烧录了芯片,焊接到板子上面的。
我程序里面直接 :
      if (adcLoad < 1)


一般ADC低端是不准的,除非校准过。检查一下你的校准程序有没有问题。

ptz19861212 发表于 2016-9-9 16:48:08

i7gly 发表于 2016-9-9 16:43
开机校准一次就可以了,还有为什么不用2V参考要用3V呢?当锂电池掉到3V后这个基准就不准了. ...

因为看了规格书里面这么一段:

If ADC uses internal VREF 2V function, the resulting conversion data will be
inaccurate.So user must ensure that the minimum analog reference voltage of AD
electrical characteristics is not less than 2.5V.

所以当时就没有敢选择2V的内部参考。

校准之前我就选择开启了3V内部参考,校准就是用的内部3V进行校准的。
想请问一下,你当时校准的时候是不是也是用内部参考源校准的?或是用手册里面的VDD进行校准的?

PS: 小声问下,能不能指点一下,性价比比较好的芯片?{:tongue:}



ptz19861212 发表于 2016-9-9 16:53:43

rqiang 发表于 2016-9-9 16:43
一般ADC低端是不准的,除非校准过。检查一下你的校准程序有没有问题。

那个代理没有给我工程联系方式,我怀疑那就是个贸易公司。

我当时问过这个事情,那个代理说出厂校准过了,不用在校准。但是我持怀疑态度。

兄台用过这个芯片的话,我想问下,校准过了以后,最低能够测出来多少mV的。你们当时做的最低是检测出来多少的电流?采样电阻是多大呢? 我手头有个样板,采样电阻是 0.05,采样电流能够检测到 7mA 这个样子。


ptz19861212 发表于 2016-9-9 16:56:08

i7gly 发表于 2016-9-9 16:41
我这边也是用过这颗芯片做移动电源,没有这个问题.
这颗料已经没什么性价比了,所以现在都很少用了, ...

那个代理没有给我工程联系方式,我怀疑那就是个贸易公司。

我当时问过这个事情,那个代理说出厂校准过了,不用在校准。但是我持怀疑态度。

兄台用过这个芯片的话,我想问下,校准过了以后,最低能够测出来多少mV的。你们当时做的最低是检测出来多少的电流?采样电阻是多大呢? 我手头有个样板,采样电阻是 0.05,采样电流能够检测到 7mA 这个样子。

i7gly 发表于 2016-9-9 16:57:49

ptz19861212 发表于 2016-9-9 16:56
那个代理没有给我工程联系方式,我怀疑那就是个贸易公司。

我当时问过这个事情,那个代理说出厂校准过了 ...

总之做移动电源,50mA关机电流没有问题.

kebaojun305 发表于 2016-9-9 17:02:53

AD输入1.5V 试试 采样值是多少

rqiang 发表于 2016-9-9 17:04:08

ptz19861212 发表于 2016-9-9 16:53
那个代理没有给我工程联系方式,我怀疑那就是个贸易公司。

我当时问过这个事情,那个代理说出厂校准过了 ...

没有用过这个芯片,先检查一下电源布线,看看电源纹波及电源有无干扰

lgg88 发表于 2016-9-9 20:20:16

精度达不到12位 好像。我也用过兼容这个芯片的 国产芯片 ,说是12位 ,实际上要少一位算下来 ,问代理说就这样的

lgg88 发表于 2016-9-9 20:21:23

精度达不到12位 好像。我也用过兼容这个芯片的 国产芯片 ,说是12位 ,实际上要少一位算下来 ,问代理说就这样的

ptz19861212 发表于 2016-9-9 22:13:33

i7gly 发表于 2016-9-9 16:57
总之做移动电源,50mA关机电流没有问题.

按照现在这个做的话,就是250mA 电流关机了。。。。

请问你那边有没有关于ADC模块的代码呢?我和手册里面的比较了一下,没什么区别,除了我用了更慢的分频,其他的AIN口,3V的内部基准。

这个是我从网站上面搞到的资料。

void main()
{

        WDTC();
        DISI();
        SCR=0X7F;                                        //选择主频,4MHz
        P5CR=0XFF;                                        //P50设为输入
        AISR=1;                                                //P50/ADC0引脚作为ADC0输入口
        ADCON=0X08;                                        //打开AD电源,并选择ADC0输入口
        AD_CALI_P();                                //调用AD子程序
        ADRUN=1;                                        //使能AD转换
        while(ADRUN==1);                        //等待AD转换完成
        D_ADDATA1H=ADDATA1H;
        D_ADDATA1L=ADDATA1L;                //保存AD转换值
        while(1);
       
       
}
void AD_CALI_P()
{
        unsigned char cnt;
        cnt=0x0F;
        ADOC=0XF8;                                //使能ADC位校正功能
        do
        {
                ADRUN=1;                        //开始AD转换
                while(ADRUN==1);        //等待AD转换完成
                cnt--;
                if(!SIGN)                        //offset 负电压
                {
                       ADOC+=0X08;
                }
                else                                 //offset 正电压
                {
                       ADOC-=0X08;
                }
                if(cnt==0)
                {
                        cnt=0x0F;
                        if(SIGN)
                        {
                                ADOC=0X80;
                        }
                        else
                        {
                                CALI=0;
                        }
                }
        }while(ADDATA1H||ADDATA1L&&CALI);
        CALI=0;               
}

ptz19861212 发表于 2016-9-9 22:16:36

kebaojun305 发表于 2016-9-9 17:02
AD输入1.5V 试试 采样值是多少

AD输入1.83V,理论是2498,实际数值是 2559.
相差这个大,我本能的怀疑是我配置错了,但是仔细对比来对比去,都没发现问题 =。=

下面是寄存器

ptz19861212 发表于 2016-9-9 22:17:08

lgg88 发表于 2016-9-9 20:21
精度达不到12位 好像。我也用过兼容这个芯片的 国产芯片 ,说是12位 ,实际上要少一位算下来 ,问代理   ...

我这个差的就不是1位的精度了。。。

ptz19861212 发表于 2016-9-9 22:46:43

i7gly 发表于 2016-9-9 16:06
初始化时ADC要校准,具体找代理拿代码.

我现在直接用的官网上面的 例程,什么都没改,还是不行=。=

不知道兄台手上面有没有代理给的demo? 能否分享一下?

我手上面的例程是这个样子的:
void main()
{

        WDTC();
        DISI();
        SCR=0X7F;                                        //选择主频,4MHz
        P5CR=0XFF;                                        //P50设为输入
        AISR=1;                                                //P50/ADC0引脚作为ADC0输入口
        ADCON=0X08;                                        //打开AD电源,并选择ADC0输入口
        AD_CALI_P();                                //调用AD子程序
        ADRUN=1;                                        //使能AD转换
        while(ADRUN==1);                        //等待AD转换完成
        D_ADDATA1H=ADDATA1H;
        D_ADDATA1L=ADDATA1L;                //保存AD转换值
        while(1);
       
       
}
void AD_CALI_P()
{
        unsigned char cnt;
        cnt=0x0F;
        ADOC=0XF8;                                //使能ADC位校正功能
        do
        {
                ADRUN=1;                        //开始AD转换
                while(ADRUN==1);        //等待AD转换完成
                cnt--;
                if(!SIGN)                        //offset 负电压
                {
                       ADOC+=0X08;
                }
                else                                 //offset 正电压
                {
                       ADOC-=0X08;
                }
                if(cnt==0)
                {
                        cnt=0x0F;
                        if(SIGN)
                        {
                                ADOC=0X80;
                        }
                        else
                        {
                                CALI=0;
                        }
                }
        }while(ADDATA1H||ADDATA1L&&CALI);
        CALI=0;               
}

liufabing 发表于 2016-9-9 22:59:48

ptz19861212 发表于 2016-9-9 16:48
因为看了规格书里面这么一段:

If ADC uses internal VREF 2V function, the resulting conversion dat ...

我们有颗芯片做三合一比较合适,增加了PWM的驱动能力,ADC可以校准.
输出用30mR的电流采样电阻,做到60mA关机没问题.

liufabing 发表于 2016-9-9 23:04:19

ptz19861212 发表于 2016-9-9 16:56
那个代理没有给我工程联系方式,我怀疑那就是个贸易公司。

我当时问过这个事情,那个代理说出厂校准过了 ...

采样电阻是 0.05,采样电流能够检测到 7mA 这个样子
这么牛叉.可靠么?

ptz19861212 发表于 2016-9-9 23:18:57

liufabing 发表于 2016-9-9 23:04
这么牛叉.可靠么?

我手里面就这一个板子,所以我也说不清楚可靠不可靠。。。

ptz19861212 发表于 2016-9-9 23:20:11

liufabing 发表于 2016-9-9 22:59
我们有颗芯片做三合一比较合适,增加了PWM的驱动能力,ADC可以校准.
输出用30mR的电流采样电阻,做 ...

要不你发个资料给我看看吧。

liufabing 发表于 2016-9-10 11:38:18

ptz19861212 发表于 2016-9-9 23:20
要不你发个资料给我看看吧。

芯片型号:M8R612

i7gly 发表于 2016-9-10 11:55:31

ptz19861212 发表于 2016-9-9 22:46
我现在直接用的官网上面的 例程,什么都没改,还是不行=。=

不知道兄台手上面有没有代理给的demo? 能否 ...

void AD_CALI_P(void)
{
        u8 cnt;
        cnt=0x07;
        ADOC=0XFE;                                //使能ADC位校正功能   2V参考电压
        do
        {
                ADRUN=1;                        //开始AD转换
                while(ADRUN==1);        //等待AD转换完成
                cnt--;
                if(!SIGN)                        //offset 负电压
                {
                       ADOC+=0X08;
                }
                else                                 //offset 正电压
                {
                       ADOC-=0X08;
                }
                if(cnt==0)
                {
                        cnt=0x07;
                        if(SIGN)
                        {
                                ADOC=0X86;
                        }
                        else
                        {
                                CALI=0;
                        }
                }
        }while((ADDATA1H||ADDATA1L)&&CALI);
        CALI=0;               
}

p4s5j6 发表于 2016-9-10 12:23:35

移动电源升压降压都要经过电感,对电源干扰很大,ADC数值采样要有滤波算法才行的。

zwcled 发表于 2016-9-11 11:33:09

在低端芯片方面,ADC最好的之一,应该是芯海了,因为他做电子枰芯片起家的。

desireyao 发表于 2017-5-3 23:28:41

楼主不知可有空,有空帮忙写个程序,基于义隆这款单片机
页: [1]
查看完整版本: 义隆 EM78P372N 这个芯片 ADC感觉不对