找回密码
 立即注册
查看: 127|回复: 7

ADC读取计算问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-04-22 13:35:43
已绑定手机

3

主题

4

回帖

81

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:107
  • 最近打卡:2026-04-30 14:22:38
已绑定手机

4

主题

272

回帖

6183

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-04-22 13:35:43
已绑定手机

3

主题

4

回帖

81

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:730
  • 最近打卡:2026-05-01 00:13:58
已绑定手机

49

主题

2668

回帖

2752

积分

荣誉版主

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:107
  • 最近打卡:2026-04-30 14:22:38
已绑定手机

4

主题

272

回帖

6183

积分

论坛元老

积分
6183
发表于 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. }
复制代码



回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2026-04-22 13:35:43
已绑定手机

3

主题

4

回帖

81

积分

注册会员

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

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

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:334
  • 最近打卡:2026-04-28 11:53:20

85

主题

7349

回帖

1万

积分

超级版主

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

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


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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2026-05-01 00:01:26
已绑定手机

0

主题

45

回帖

459

积分

中级会员

积分
459
发表于 2026-4-17 20:56:07 | 显示全部楼层
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-5-1 10:32 , Processed in 0.144746 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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