单片机好难 发表于 2024-7-8 17:27:38

STC8G 量产时adc高阻输入有问题

STC的各位师傅好,最近一个项目已经量产了,2000片中有一片adc口有问题

图中是ADC接口电路,R11是电位器,CN3接口也是一个电位器,
两个电位器串联分压,都可以调节(都是10k电位器)
现在的不良现象是调节R11为最大阻值,和CN3电位器分压后为2.5v,
调节CN3电位器为最小值时,电压居然升到3.7v,


CN3的3脚,
第二个电位器的电压也升到了,3.7v
更换芯片后,一切正常,想请教一下,这是怎么回事呢?




zhuguoxin8 发表于 2024-7-8 17:31:58

2000个有一个坏的不也很正常吗

神农鼎 发表于 2024-7-8 17:39:39

关键我看不懂他这个原理图,我看不懂...
如下短路 R2, W1 用 10K, 接到 ADC输入,不是比较器





梁工 发表于 2024-7-8 17:45:09

本帖最后由 梁工 于 2024-7-8 18:01 编辑

断开R19,用数字万用表电流档(比如200uA档)代替R19,然后调整CN3的电位器,从最大调到最小,观察电流读数。
正常情况下,ADC输入是高阻,200uA档电流小于0.1uA,如果偏大,看看是否有漏电,或IO损坏。
按故障描述“调节CN3电位器为最小值时,电压居然升到3.7v”,这个跟电路原理严重不符。
见下图,当CN3调到最小,相当于动头接地,那么P5.5的状态不影响2个电位器本身的分压,但是现象是影响,这违背电路规律。请仔细检查。


单片机好难 发表于 2024-7-8 17:45:12

您可以理解为是这样的

单片机好难 发表于 2024-7-10 10:56:16

#include "reg51.h"
#include "intrins.h"
sfr   CCON    =   0xd8;
sbit    CF      =   CCON^7;
sbit    CR      =   CCON^6;
sbit    CCF2    =   CCON^2;
sbit    CCF1    =   CCON^1;
sbit    CCF0    =   CCON^0;
sfr   CMOD    =   0xd9;
sfr   CL      =   0xe9;
sfr   CH      =   0xf9;
sfr   CCAPM0=   0xda;
sfr   CCAP0L=   0xea;
sfr   CCAP0H=   0xfa;
sfr   PCA_PWM0 =0xf2;
sfr   CCAPM1=   0xdb;
sfr   CCAP1L=   0xeb;
sfr   CCAP1H=   0xfb;
sfr   PCA_PWM1 =0xf3;
sfr   CCAPM2=   0xdc;
sfr   CCAP2L=   0xec;
sfr   CCAP2H=   0xfc;
sfr   PCA_PWM2 =0xf4;
sfr   WDT_CONTR   =   0xc1;
sfr   AUXR      =   0x8e;
sfr   ADC_CONTR   =   0xbc;
sfr   ADC_RES   =   0xbd;
sfr   ADC_RESL    =   0xbe;
sfr   ADCCFG      =   0xde;
sfr   P5          =   0xC8;
sfr   P_SW2       =   0xba;
sfr   P_SW1       =   0xA2;
#define ADCTIM(*(unsigned char volatile xdata *)0xfea8)



sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;

sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;

sbit    P33    =   P3^3;
sbit    P32    =   P3^2;
sbit    P31    =   P3^1;
sbit    P30    =   P3^0;
sbit    P54    =   P5^4;
sbit    P55    =   P5^5;

unsigned char dwq=0;
bit kg =0 ;


void Delay1ms()                //@20.000MHz
{
        unsigned char i, j;

        i = 20;
        j = 113;
        do
        {
                while (--j);
        } while (--i);
}

void pwm_init(){
                CCON = 0x00;
    CMOD = 0x0A;                              //PCA时钟为系统时钟
    CL = 0x00;
    CH = 0x00;
    CCAPM0 = 0x42;                              //PCA模块2为PWM工作模式
    PCA_PWM0 = 0x00;                            //PCA模块2输出8位PWM
    CCAP0L = 0xff;                               //PWM占空比为0%[(100H-20H)/100H]
    CCAP0H = 0xff;
          CR=1;
    }

void main()
{
          P54=1;
          P55=0;
    P33=1;
          P32=0;
          P31=1;
          P30=1;
    P3M0 = 0x0C;
          P3M1 = 0x00;
    P33=1;
          P32=0;
          P31=1;
          P30=1;
    P5M0 = 0x10;
          P5M1 = 0x20;
   
   
    //ADC
          P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16
    ADC_CONTR = 0x85;                           //使能ADC模块
   
    WDT_CONTR = 0x24;                           //使能看门狗,溢出时间约为39-65

    while (1){
                   WDT_CONTR = 0x34;                     //清看门狗,否则系统复位
                       Delay1ms();
                       ADC_CONTR |= 0x40;                     //启动AD转换
       _nop_();
       _nop_();
                       _nop_();
       _nop_();
                       while (!(ADC_CONTR & 0x20));             //查询ADC完成标志
       ADC_CONTR &= ~0x20;                     //清完成标志
                     dwq=(ADC_RES*10)/12;
       
                       if(255-dwq<250 && kg==0){
                       pwm_init();
                       kg=1;       
                       }
                       if(kg==1){
                          if(255-dwq>=250){
                          PCA_PWM0 |= 0x3F;
                                        CCAP0H=255;
                               }
                       if(255- dwq<CCAP0H &&255- dwq<250){
                       if(CCAP0H>250){
                       PCA_PWM0 = (PCA_PWM0 & ~0x32) |((dwq >> 4) & 0x30);
                       CCAP0H=255;
                       CCAP0H -=1 ;
       Delay1ms();                               
                       CCAP0H -=1 ;
       Delay1ms();
                       CCAP0H -=1 ;
       Delay1ms();
       CCAP0H -=1 ;
       Delay1ms();
       CCAP0H -=1 ;
       Delay1ms();               
                       }
                          CCAP0H -=1 ;
                     
                       }
                        if(255- dwq>CCAP0H){
                  
                        CCAP0H +=1 ;

                }
                       
                        if(CCAP0H>=250){
                        PCA_PWM0 |= 0x3F;
                        CCAP0H=255;       
                        }       
                }   
}
}

网老四 发表于 2024-7-10 14:22:54

不用看程序,这简单应用,如果程序有问题会大批不良.
换芯片就正常,问题只能出在焊接和芯片本身.你把拆下来的芯片换到另一块板子上试试,

单片机好难 发表于 2024-7-10 14:50:43

网老四 发表于 2024-7-10 14:22
不用看程序,这简单应用,如果程序有问题会大批不良.
换芯片就正常,问题只能出在焊接和芯片本身.你把拆下来的 ...

前辈您好,换到别的板子也是不行,梁工说怕是程序运行当中,把端口改为了准双向口,所以我就担心是程序的问题{:4_167:}

hhh402 发表于 2024-8-1 10:59:25

看了一下楼主的程序,这一句有可能会出问题: dwq=(ADC_RES*10)/12; dwq和ADC_RES都是8位数据,ADC_RES*10有可能会发生溢出错误。楼主这个程序也敢出产品,真是服了{:4_199:},正常人使用ADC一般前面一两次数据都会丢弃,然后8次以上ADC取平均。楼主一次过牛

梁工 发表于 2024-8-4 20:49:21

hhh402 发表于 2024-8-1 10:59
看了一下楼主的程序,这一句有可能会出问题: dwq=(ADC_RES*10)/12; dwq和ADC_RES都是8位数据,ADC_RES*10 ...

确实是,我没空详细看其程序,这句确实有问题的,应该强转一下:
dwq=((u16))ADC_RES*10)/12;
页: [1] 2
查看完整版本: STC8G 量产时adc高阻输入有问题