找回密码
 立即注册
查看: 86|回复: 6

ADC读取计算问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-02-26 10:58:26
已绑定手机

3

主题

4

回帖

75

积分

注册会员

积分
75
发表于 2026-2-10 10:16:48 | 显示全部楼层 |阅读模式
仿真过程中发现每次读取的ADC数值正常,但是加和后的sum是错误的,基本上在u32的最高位有数据  比如1D多少的 导致后续无法进行计算
截图202602101013399274.jpg
截图202602101014026055.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2026-03-07 09:59:50
已绑定手机

4

主题

198

回帖

748

积分

高级会员

积分
748
发表于 2026-2-10 10:36:07 | 显示全部楼层
哪个型号?
SAMPLE_128_SHIFT是多少?
假如adc每次都是4095,你的结果应是多少?实际是多少?sum每次的值是多少?
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-02-26 10:58:26
已绑定手机

3

主题

4

回帖

75

积分

注册会员

积分
75
发表于 2026-2-10 10:59:13 | 显示全部楼层
STC32G12K128
SAMPLE_128_SHIFT 为7
假如adc每次都是4095  4095*128为524288即0x80000
实际sum好像是为1d000086
ADC每次读取来的结果放到数组中,仿真出来得到的结果为0x03
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:685
  • 最近打卡:2026-03-07 01:17:49
已绑定手机

49

主题

2643

回帖

2856

积分

荣誉版主

积分
2856
发表于 2026-2-10 11:32:24 | 显示全部楼层
定义变量和赋初值分开来操作一下
~~~
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2026-03-07 09:59:50
已绑定手机

4

主题

198

回帖

748

积分

高级会员

积分
748
发表于 2026-2-10 11:59:03 | 显示全部楼层
ama*** 发表于 2026-2-10 10:59
STC32G12K128
SAMPLE_128_SHIFT 为7
假如adc每次都是4095  4095*128为524288即0x80000

我这里正常,sum为0x0007FF80,最终Get_ADCResult_128返回值为0x0FFF
傲游截图20260210115740.jpg


  1. u16 Get_ADCResult(u8 channel)//chamnel=0 15
  2. {
  3.         u16 adc;
  4.         channel=channel;
  5.         adc=4095;
  6.         return adc;
  7. }
  8. #define SAMPLE_128_SHIFT 7
  9. static u16 Get_ADCResult_128(u8 ch)
  10. {
  11.         u32 sum=0;
  12.         u8 i = 0;
  13.         for(i=0;i< 128;i++)//你原来的单次采样函数
  14.                 sum += Get_ADCResult(ch);
  15.        
  16.         u1tx(0x66);
  17.         u1tx(sum>>24);
  18.         u1tx(sum>>16);
  19.         u1tx(sum>>8);
  20.         u1tx(sum);       
  21.         return(u16)(sum>>SAMPLE_128_SHIFT);
  22. }
  23. void main(void)
  24. {
  25.         u16 v;
  26.         EAXFR=1;//使能访问XFR
  27.         CKCON=0x00;//外部数据总线等待时间,置0就好
  28.         WTST=0x00;//读取程序等待时间控制,置0最快       
  29.         init_devices();
  30.        
  31.         u1tx(0xAA);
  32.         u1tx(0x55);
  33.         //while(1)
  34.         {
  35.                 P11=~P11;
  36.                 delayms(100);//38ms
  37.                 v=Get_ADCResult_128(0);
  38.                 u1tx(0x55);
  39.                 u1tx(v>>8);
  40.                 u1tx(v);
  41.         }
  42.         while(1);
  43. }
复制代码



回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-02-26 10:58:26
已绑定手机

3

主题

4

回帖

75

积分

注册会员

积分
75
发表于 2026-2-11 15:23:01 | 显示全部楼层
晓*** 发表于 2026-2-10 11:32
定义变量和赋初值分开来操作一下

好像将sum变为全局变量 再对其清0就可以了 原理是什么呢

点评

不需要全局变量,很明显是因为你计算sum之前没有清零,应该改为下面的: u32 sum; u8 i; for(i=0,sum=0; i  详情 回复 发表于 7 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-03-06 09:14:52

84

主题

7283

回帖

1万

积分

超级版主

积分
15618
发表于 7 天前 | 显示全部楼层
ama*** 发表于 2026-2-11 15:23
好像将sum变为全局变量 再对其清0就可以了 原理是什么呢

不需要全局变量。
你定义的函数是static,你计算sum之前没有清零才导致错误,应该改为下面的:
u32 sum;
u8  i;
for(i=0,sum=0; i<128; i++)  


或者,函数定义成void也可以,不要定义成static。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 16:51 , Processed in 0.112578 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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