搜索
bottom↓
回复: 32

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

[复制链接]

出0入0汤圆

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

出0入0汤圆

发表于 2016-9-9 15:31:53 | 显示全部楼层
这颗料批量什么价格?

出0入0汤圆

发表于 2016-9-9 15:42:10 | 显示全部楼层
仿真器能测到11.8mV?做个ADC DEMO程序,烧个芯片装板测试

出0入0汤圆

 楼主| 发表于 2016-9-9 15:49:21 | 显示全部楼层
xjjiang 发表于 2016-9-9 15:31
这颗料批量什么价格?

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

出0入0汤圆

 楼主| 发表于 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,电池负极直接和整个电路的负极相连,去掉升压芯片,直接用 电池电压给负载供电。基本上干扰已经去除掉了,所以我才觉得奇怪。

出0入0汤圆

 楼主| 发表于 2016-9-9 15:58:45 | 显示全部楼层
rqiang 发表于 2016-9-9 15:42
仿真器能测到11.8mV?做个ADC DEMO程序,烧个芯片装板测试

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

出0入0汤圆

发表于 2016-9-9 16:06:23 | 显示全部楼层
初始化时ADC要校准,具体找代理拿代码.

出0入0汤圆

 楼主| 发表于 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[adcLoadIndex];
  adcLoadBuffer[adcLoadIndex] = adcTmp;
  adcLoadSum += adcTmp;
  adcLoad = adcLoadSum >> ADC_LOAD_BUFFER_BITS;
  
  adcLoadIndex++;
  if (adcLoadIndex >= ADC_LOAD_BUFFER_MAX)
  {
    adcLoadIndex = 0;
  }
}

出0入0汤圆

 楼主| 发表于 2016-9-9 16:41:05 | 显示全部楼层
i7gly 发表于 2016-9-9 16:06
初始化时ADC要校准,具体找代理拿代码.

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 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: 小声问下,能不能指点一下,性价比比较好的芯片?



出0入0汤圆

 楼主| 发表于 2016-9-9 16:53:43 | 显示全部楼层
rqiang 发表于 2016-9-9 16:43
一般ADC低端是不准的,除非校准过。检查一下你的校准程序有没有问题。

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

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

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


出0入0汤圆

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

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

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

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

出0入0汤圆

发表于 2016-9-9 16:57:49 | 显示全部楼层
ptz19861212 发表于 2016-9-9 16:56
那个代理没有给我工程联系方式,我怀疑那就是个贸易公司。

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

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

出0入8汤圆

发表于 2016-9-9 17:02:53 | 显示全部楼层
AD输入1.5V 试试 采样值是多少

出0入0汤圆

发表于 2016-9-9 17:04:08 | 显示全部楼层
ptz19861212 发表于 2016-9-9 16:53
那个代理没有给我工程联系方式,我怀疑那就是个贸易公司。

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

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

出0入0汤圆

发表于 2016-9-9 20:20:16 | 显示全部楼层
精度达不到12位 好像。我也用过兼容这个芯片的 国产芯片 ,说是12位 ,实际上要少一位  算下来 ,问代理  说就这样的

出0入0汤圆

发表于 2016-9-9 20:21:23 | 显示全部楼层
精度达不到12位 好像。我也用过兼容这个芯片的 国产芯片 ,说是12位 ,实际上要少一位  算下来 ,问代理  说就这样的

出0入0汤圆

 楼主| 发表于 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;               
}

出0入0汤圆

 楼主| 发表于 2016-9-9 22:16:36 | 显示全部楼层
kebaojun305 发表于 2016-9-9 17:02
AD输入1.5V 试试 采样值是多少

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

下面是寄存器

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 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;               
}

出0入0汤圆

发表于 2016-9-9 22:59:48 | 显示全部楼层
ptz19861212 发表于 2016-9-9 16:48
因为看了规格书里面这么一段:

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

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

出0入0汤圆

发表于 2016-9-9 23:04:19 | 显示全部楼层
ptz19861212 发表于 2016-9-9 16:56
那个代理没有给我工程联系方式,我怀疑那就是个贸易公司。

我当时问过这个事情,那个代理说出厂校准过了 ...
采样电阻是 0.05,采样电流能够检测到 7mA 这个样子

这么牛叉.可靠么?

出0入0汤圆

 楼主| 发表于 2016-9-9 23:18:57 | 显示全部楼层
liufabing 发表于 2016-9-9 23:04
这么牛叉.可靠么?

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

出0入0汤圆

 楼主| 发表于 2016-9-9 23:20:11 | 显示全部楼层
liufabing 发表于 2016-9-9 22:59
我们有颗芯片[m8r612]做三合一比较合适,增加了PWM的驱动能力,ADC可以校准.
输出用30mR的电流采样电阻,做 ...

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

出0入0汤圆

发表于 2016-9-10 11:38:18 | 显示全部楼层
ptz19861212 发表于 2016-9-9 23:20
要不你发个资料给我看看吧。

芯片型号:M8R612

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-9-10 11:55:31 | 显示全部楼层
ptz19861212 发表于 2016-9-9 22:46
我现在直接用的官网上面的 例程,什么都没改,还是不行=。=

不知道兄台手上面有没有代理给的demo? 能否 ...
  1. void AD_CALI_P(void)
  2. {
  3.         u8 cnt;
  4.         cnt=0x07;
  5.         ADOC=0XFE;                                //使能ADC位校正功能   2V参考电压
  6.         do
  7.         {
  8.                 ADRUN=1;                        //开始AD转换
  9.                 while(ADRUN==1);        //等待AD转换完成
  10.                 cnt--;
  11.                 if(!SIGN)                        //offset 负电压
  12.                 {
  13.                          ADOC+=0X08;
  14.                 }
  15.                 else                                 //offset 正电压
  16.                 {
  17.                          ADOC-=0X08;
  18.                 }
  19.                 if(cnt==0)
  20.                 {
  21.                         cnt=0x07;
  22.                         if(SIGN)
  23.                         {
  24.                                 ADOC=0X86;
  25.                         }
  26.                         else
  27.                         {
  28.                                 CALI=0;
  29.                         }
  30.                 }
  31.         }while((ADDATA1H||ADDATA1L)&&CALI);
  32.         CALI=0;               
  33. }
复制代码

出0入0汤圆

发表于 2016-9-10 12:23:35 | 显示全部楼层
移动电源升压降压都要经过电感,对电源干扰很大,ADC数值采样要有滤波算法才行的。

出0入0汤圆

发表于 2016-9-11 11:33:09 | 显示全部楼层
在低端芯片方面,ADC最好的之一,应该是芯海了,因为他做电子枰芯片起家的。

出0入0汤圆

发表于 2017-5-3 23:28:41 来自手机 | 显示全部楼层
楼主不知可有空,有空帮忙写个程序,基于义隆这款单片机
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 11:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表