找回密码
 立即注册
楼主: 我的用户名

ADC采集为什么有时候是0?

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-11-14 17:53:33 | 显示全部楼层
rm5*** 发表于 2024-11-14 16:38
这个是考虑外部输入阻抗非常低的情况,内部的RC才能这样估算。当外部输入阻抗大的时候,内部电容抽取电荷 ...

输入对地有一个电容,一般是1nF~100nF,只要采样率设计好,就会消除高输入电阻的影响,在别的贴子我也说明过。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-11-19 22:19:37
已绑定手机

0

主题

12

回帖

80

积分

注册会员

积分
80
发表于 2024-11-16 16:47:05 | 显示全部楼层
梁*** 发表于 2024-11-13 22:42
我用各种型号的DAC做过很多东西,没有发现你说的读到0的情况。
好多控制器,如果ADC读到0,是会出大问题的 ...

重点是:使用SOP8 或DIP8  
使用8脚的就有这种现象 使用16脚的就没有
是不是设置上还要设置什么
试过STC8G1K08A SOP8 DIP8  和AI8h2K12U SOP8  都是一样

现在是P33脚直接接5V电源也是一样 不存在电路板设计或干扰问题

以下下是我的程序,在上面三个型号上都是一上电 几秒钟后得到0值
而用16脚的STC8G1K08A DIP16、DIP20   或STC8H8k64U_SOP16 和以前的15W系都没这个问题,希望在这里能得到解决...




/**************************************************
*实验项目:ADC转换显示
*MCU 配置:STC8G1K08A(DIP8/SOP8)  (1T 晶振11MHz)

**************************************************/
#include <REG51.H>     //定义头文件 包含端口及各种特殊寄存器
sfr P4=0xC0;           //端口4
sfr P5=0xC8;           //端口5
#include <INTRINS.H>   //包含内部函数 _nop_();空函数需要


//--------------- 定义端口功能 ----------------------
sbit SB0=P3^2;    //功能按键

sbit LED=P5^5;    //状态灯
sbit KA0=P5^4;    //继电器

sbit SDA_1637=P3^1;    //数据DIO
sbit SCL_1637=P3^0;    //时钟CLK

bit Mzh=0;   //转换显示

unsigned int DDadc;         //读取模拟量 存放电流量值
unsigned int DDmax=0, DDmin=1000; //用于存放最大和最小值

//----------------   端口初始化设置   --------------------------

sfr P0M1  = 0x93; //设置P0 端口模式寄存器
sfr P0M0  = 0x94; //
sfr P1M1  = 0x91; //设置P1 端口模式寄存器
sfr P1M0  = 0x92; //
sfr P2M1  = 0x95; //设置P2 端口模式寄存器
sfr P2M0  = 0x96; //
sfr P3M1  = 0xB1; //设置P3 端口模式寄存器
sfr P3M0  = 0xB2; //
sfr P4M1  = 0xB3; //设置P4 端口模式寄存器
sfr P4M0  = 0xB4; //
sfr P5M1  = 0xC9; //设置P5 端口模式寄存器
sfr P5M0  = 0xCA; //

/*===================================
STC8系端口初始化
====================================*/
void Port_Init(void) //端口初始化
{
P0M1 = 0x00; //0000 0000 设置P0全部为准双向模式
P0M0 = 0x00; //0000 0000

P1M1 = 0x00; //0000 0000 设置P1全部为准双向模式
P1M0 = 0x00; //0000 0000

P2M1 = 0x00; //0000 0000 设置P2全部为准双向模式
P2M0 = 0x00; //0000 0000

P3M1 = 0x08; //0000 1000 设置P3.3为高阻输入模式(读取模拟量)
P3M0 = 0x00; //0000 0000

P4M1 = 0x00; //0000 0000 设置P4全部为准双向模式
P4M0 = 0x00; //0000 0000

P5M1 = 0x00; //0000 0000 设置P5全部为准双向模式
P5M0 = 0x00; //0000 0000
}


//---------------------------------   程序开始   ---------------------------------//

//--------------------------------------------------------------------------------//

/*===================================
1毫秒延时函数(1T 晶振12MHz)
====================================*/
void Delay1ms(unsigned char x)       
{
unsigned char a,b;
for(;x>0;x--)
  for(b=222;b>0;b--)
   for(a=12;a>0;a--);
}//. . . . . . . . . . . . . . . . . .

//--------------------------------- 链接外部模块 ---------------------------------
//#include <EEPROM8.H> //包含IAPReadByte();IAPEraseSector();IAPWriteByte(,);
//#include <IIC_OLED12864.H>//显示模块 包含显示函数; OLED_Init();    //OLED初始化
//#include <MAX7219.H> //显示模块 包含显示函数display(H,L); Initial_MAX7219();//显示初始化
  #include <TM1637.H>  //包含display(x);Init_TM1637(); //TM1637初始化
//--------------------------------------------------------------------------------


//++++++++++++++++++++++++++++++++  ADC读取程序操作  ++++++++++++++++++++++++++++++++//
#define rAD0  GetADCResult(3)  //读取模拟量 设定为P1^3脚 ***修改要把该端口设成高阻模式

/*-------------STC8H系列 与ADC相关地址声明----------*/
sfr ADC_CONTR = 0xBC;  //控制寄存器
sfr ADC_RES   = 0xBD;  //转换结果高位寄存器
sfr ADC_RESL  = 0xBE;  //转换结果低位寄存器
sfr ADCCFG    = 0xDE;  //配置寄存器:设置转换结果保存格式和转换速度寄存器

#define ADCTIM  (*(unsigned char volatile xdata *)0xFEA8) //ADC时序控制寄存器

/*-------设定ADC_CONTR寄存器的操作常量---------*/
#define ADC_POWER   0x80  //1000 0000 ADC电源控制位   
#define ADC_START   0x40  //0100 0000 ADC启动转换控制位
#define ADC_FLAG    0x20  //0010 0000 ADC转换结束标志位

/*-------设定ADCCFG寄存器的操作常量---------*/
#define RESFMT   0x20

#define SPEED16  0x0F

/*----------------------------
Initial ADC sfr 寄存器初始化
----------------------------*/
void InitADC() //ADC初始化
{
ADCTIM = 0x3F;              //设置ADC内部时序
ADCCFG = RESFMT | SPEED16;  //设置对齐方式为高4位低8位 、时钟为系统时钟/2/16
}//. . . . . . . . . . . . . . . . . .

/*----------------------------
Get ADC result 模数转换
----------------------------*/
unsigned int GetADCResult(unsigned char ch)
{
unsigned int Temp = 0;

ADC_CONTR = ADC_POWER | ADC_START | ch ;
_nop_();  //查询前等待
_nop_();   
while (!(ADC_CONTR & ADC_FLAG));          //等待FLAG为1即等待转换完成
ADC_CONTR &= ~ADC_FLAG;                   //清FLAG为0

Temp=ADC_RES*256+ADC_RESL;
  
return Temp;              //返回 ADC结果
}//. . . . . . . . . . . . . . . . . .
//++++++++++++++++++++++++++++++ AD模块操作结束 ++++++++++++++++++++++++++++++//

/*===================================
主函数 --- 程序执行入口=== >>>>>>>>
====================================*/
void main()
{
Port_Init();   //端口初始化
InitADC();     //ADC寄存器初始化
Init_TM1637(); //TM1637初始化
while (1)
{
  DDadc=rAD0;

  if(DDadc > DDmax) DDmax=DDadc; //获取最大值
  if(DDadc < DDmin) DDmin=DDadc; //获取最小值


  if(SB0==0){Mzh=~Mzh; DDmin=1000; while(SB0==0); Delay1ms(200);}

  if(Mzh==0)display(DDmin);else display(DDadc); //显示ADC结果
}
}//. . . . . . . . . . . . . . . . . .

//------------------------------ END ------------------------------


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-03-10 07:20:32
已绑定手机

6

主题

63

回帖

429

积分

中级会员

积分
429
发表于 2024-11-17 07:13:41 来自手机 | 显示全部楼层
如果官方愿意,把你的板子烧好程序发给官方,让他们看一下是最好的,这样的描述,谁也不能很好判断问题在哪
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2025-04-28 09:23:48

3

主题

43

回帖

493

积分

中级会员

积分
493
发表于 2024-11-18 11:44:36 | 显示全部楼层
pzeg*** 发表于 2024-11-16 16:47
重点是:使用SOP8 或DIP8  
使用8脚的就有这种现象 使用16脚的就没有
是不是设置上还要设置什么

https://oshwhub.com/rm543/dig_loader_v06
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2025-04-28 09:23:48

3

主题

43

回帖

493

积分

中级会员

积分
493
发表于 2024-11-18 11:47:56 | 显示全部楼层
pzeg*** 发表于 2024-11-16 16:47
重点是:使用SOP8 或DIP8  
使用8脚的就有这种现象 使用16脚的就没有
是不是设置上还要设置什么


我这个开源工程里面用的就是这个SOP8 的STC8G1K08A,ADC采样只读一次直接使用结果,不使用任何滤波,目前长时间运行还没遇到异常(如果数据不对会直接停止工作)
网址:oshwhub.com/rm543/dig_loader_v06
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-11-19 22:19:37
已绑定手机

0

主题

12

回帖

80

积分

注册会员

积分
80
发表于 2024-11-18 19:51:10 来自手机 | 显示全部楼层
rm543 发表于 2024-11-18 11:47
我这个开源工程里面用的就是这个SOP8 的STC8G1K08A,ADC采样只读一次直接使用结果,不使用任何滤波,目 ...

因为你不用连续读数,我的程序是要读取最小值,需要用最小值来做判断,他应该是在采集外部数值时,内部有什么置0值的某些原因,也许要特别设置一下,在这里看看哪位大佬帮忙一下?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-05-02 21:48:56

6

主题

48

回帖

614

积分

高级会员

积分
614
发表于 2024-11-19 10:44:47 | 显示全部楼层
我之前用STC8G和STC8H以及STC15W系列做ADC案子都没有出现问题还特别稳定,这次新案子用STC8H1K08-36I-QFN20也出现ADC输出值为零,PCBA设计时ADC_REF和ADC IN都用了10U电容滤波但还是在加负载时严重输出异常,我怀疑是我的代码配置不匹配导致,没有找到非库文件版ADC代码,用范例代码改的.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-11-19 22:19:37
已绑定手机

0

主题

12

回帖

80

积分

注册会员

积分
80
发表于 2024-11-19 12:45:33 来自手机 | 显示全部楼层
已经不是输入端外部问题了,我已直接把输入端连接5V电源了,在用眼看显示值一直是1023的,但如果用程序取最小值时,就很快会得到0值,再把变量置一个值,不到几秒,就会读到0值,现在我就是在8脚的SOP8或DlP8,8G和8H系发现是这样,而同一程序在DlP16/20 ,SOP16系正常

点评

不管多少引脚,ADC外设都是一样的,不应该有差别。  详情 回复 发表于 2024-11-19 15:09
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-11-19 12:58:54 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-11-19 15:09:58 | 显示全部楼层
pzeg*** 发表于 2024-11-19 12:45
已经不是输入端外部问题了,我已直接把输入端连接5V电源了,在用眼看显示值一直是1023的,但如果用程序取最 ...

不管多少引脚,ADC外设都是一样的,不应该有差别。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 04:14 , Processed in 0.135840 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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