找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1170|回复: 13
打印 上一主题 下一主题
收起左侧

单片机读取两个通道ADC电压出现问题

[复制链接]
跳转到指定楼层
楼主
ID:322939 发表于 2024-11-19 19:40 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家有没有遇到使用AI8G1J08A这款芯片在使用查询方式读取两个通道ADC电压时,只能正确读取一个通道电压值,另一个通道读取的不是输入电压值,甚至如:通道2输入5V,数值没有变化,如将5V接入通道3那么通道2显示(1020)数值,通道2输入接地,在通道3输入接5V通道2也会显示正确读数,使用一个ADC通道就没问题,如使用两个通道则会出现前面的问题。奇怪了!

unsigned int Tvuer=0;
unsigned int sum=0,Set_Sum=0;
void Delay(unsigned  int z)
{
unsigned  int y,x;
for(y=0;y<z;y++)
   for(x=0;x<1140;x++);
   }


void Uart1_Init(void)        //9600bps@11.0592MHz
{
      SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器时钟1T模式  
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设置定时器模式
        TL1 = 0xE0;                        //设置定时初始值
        TH1 = 0xFE;                        //设置定时初始值
        ET1 = 0;                        //禁止定时器中断
        TI=1;
        TR1 = 1;                        //定时器1开始计时
        EA=1;
}

/****************Io设置**************/
void IO_init(void)
{
        P3M0=0X03;
        P3M1=0XfC;
        P5M0=0XDF;
        P5M1=0X20;
}

/*************ADC初始化************/
void  ADC_Init(void)
{
        //  P3M0=0x03;
         // P3M1=0xfc;

   ADC_RES=0;
    ADC_RESL=0;           
    P_SW2|=0x80;
    ADCTIM=0x3f;  //??????
   P_SW2&=0x7f;
    ADCCFG=0x0f;   //????????2/16
    ADC_CONTR=0x80;
    Delay(1);
}

/**************ADC处理*************/
unsigned  int Get_adc_tep(unsigned char channel)
{

         ADC_CONTR|=0x40|channel;
              
                _nop_();
         _nop_();
                 
       while(!(ADC_CONTR&0x20));         //????                                       
         ADC_CONTR&=~0x20;                     //??     
     return  (ADC_RES<<2)|ADC_RESL;//??+??????
}

void fighting_1(void)
{
        u8 f;
        u16 volue=0;
        for(f=0;f<20;f++)
        {
                volue+=Get_adc_tep(3);
        }
        Tvuer=volue/20;        
        ZKB=(unsigned  char)Tvuer;
        volue=0;
}
void fighting_2()
{
        u8 t;
        u16 Imst=0;
        for(t=0;t<10;t++)
        {
                Imst+=Get_adc_tep(2);
        }
        sum=Imst/10;
        Imst=0;

}

/***************主程序*****************/
void main(void)
{
        IO_init();        
        ADC_Init();
        Uart1_Init();
        while(1)
        {
        fighting_1();  
          fighting_2();        
                printf("读取ADC5的值=%x\n",sum);
                Delay(1000);
        }   
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

14#
ID:322939 发表于 2024-11-25 16:15 | 只看该作者
coody_sz 发表于 2024-11-25 11:38
如果两路采样ADC值一样,则可能是硬件短路、软件通道选择没改变。

两路采样ADC值不一样,明明设置选通道2的,数值读出来相差很大,如通道3输入电压,则通道2读出来很稳定
回复

使用道具 举报

13#
ID:322939 发表于 2024-11-25 16:12 | 只看该作者
aldnoahz 发表于 2024-11-24 16:01
没找到这个芯片的资料,想看看其是否同时支持多路adc,如果按你所说的,要么是芯片坏了,要么就是干扰问题

看了官网的资料可以支持多路ADC,也换过芯片,故障还是一样
回复

使用道具 举报

12#
ID:322939 发表于 2024-11-25 16:11 | 只看该作者
wohaiainine 发表于 2024-11-25 09:55
可能的原因:
1、通道间干扰:
当两个ADC通道同时工作时,可能会存在通道间的电磁干扰或信号串扰,导致一 ...

芯片也换过了,还是一样
回复

使用道具 举报

11#
ID:1034262 发表于 2024-11-25 11:38 | 只看该作者
如果两路采样ADC值一样,则可能是硬件短路、软件通道选择没改变。
回复

使用道具 举报

10#
ID:1100726 发表于 2024-11-25 09:55 | 只看该作者
可能的原因:
1、通道间干扰:
当两个ADC通道同时工作时,可能会存在通道间的电磁干扰或信号串扰,导致一个通道的读取结果受到另一个通道的影响。
2、多路复用器配置问题:
AI8G1J08A芯片可能使用多路复用器来选择不同的ADC通道。如果多路复用器配置不正确或存在故障,可能会导致通道选择错误,从而影响读取结果。
3、内部寄存器或电路故障:
芯片内部的寄存器或电路可能发生故障,导致无法正确读取或处理两个通道的ADC电压值。
回复

使用道具 举报

9#
ID:1072347 发表于 2024-11-24 16:01 | 只看该作者
没找到这个芯片的资料,想看看其是否同时支持多路adc,如果按你所说的,要么是芯片坏了,要么就是干扰问题
回复

使用道具 举报

8#
ID:1136609 发表于 2024-11-23 17:38 | 只看该作者
加长采样时间也没用,一样会影响别的通道
回复

使用道具 举报

7#
ID:322939 发表于 2024-11-22 08:28 | 只看该作者
概然解决不了还是换别的芯片来得快
回复

使用道具 举报

6#
ID:322939 发表于 2024-11-21 16:37 | 只看该作者
wufa1986 发表于 2024-11-20 16:01
大部分单片机ADC切换通道过快的时候,就会有通道相互影响的问题,因为本质是电容充电,解决办法是加长采样 ...

加长采样时间也没用,一样会影响别的通道
回复

使用道具 举报

5#
ID:879348 发表于 2024-11-20 16:01 | 只看该作者
大部分单片机ADC切换通道过快的时候,就会有通道相互影响的问题,因为本质是电容充电,解决办法是加长采样时间(内部电容充电时间)
回复

使用道具 举报

地板
ID:322939 发表于 2024-11-20 15:51 | 只看该作者
厂家芯片都做出来了正常不会有这问题吧?其它系列型号以这代码不会出现这问题
回复

使用道具 举报

板凳
ID:322939 发表于 2024-11-20 11:56 | 只看该作者

问题还是一样,就相当于第2通道和第3通道并在一起,以第3通道为主,当第3通道有电压输入它就有变化,通道2输入电压却没显示变化.
回复

使用道具 举报

沙发
ID:161164 发表于 2024-11-20 09:12 | 只看该作者
  1. /**************ADC处理*************/
  2. unsigned  int Get_adc_tep(unsigned char channel)
  3. {

  4.          [color=Red]ADC_CONTR=0xC0|channel;[/color]
  5.               
  6.                 _nop_();
  7.          _nop_();
  8.                  
  9.        while(!(ADC_CONTR&0x20));         //????                                       
  10.          ADC_CONTR&=~0x20;                     //??     
  11.      return  (ADC_RES<<2)|ADC_RESL;//??+??????
  12. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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