找回密码
 立即注册
查看: 746|回复: 8

关于STC8H1K08的ADC读取数据运算的疑问

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-03-13 23:33:33

3

主题

7

回帖

29

积分

新手上路

积分
29
发表于 2024-1-10 20:04:47 | 显示全部楼层 |阅读模式
本帖最后由 621 于 2024-1-10 20:09 编辑

微信图片_20240110200150.png

画红圈的这里是我用ADC读取值乘2929,但是没办法显示正常答案

画红圈的这里是我用ADC读取值乘2929,但是没办法显示正常答案

第一行的值是adc_read(ADC_P11)的值,第二行是V的值,明显运算结果不正确

第一行的值是adc_read(ADC_P11)的值,第二行是V的值,明显运算结果不正确
微信图片_20240110195148.png

第二个图是我用ADC读取到的值乘2929,第三个图第一行是adc_read(ADC_P11)的值,第二行是V,也就是adc_read(ADC_P11)*2929出来的值,明显不正确,试了很多其他数,发现结果数值超过5位数就错,但是我V,和adc_read(ADC_P11)都是u16,不应该呀
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:437
  • 最近打卡:2025-05-07 13:06:10

33

主题

2355

回帖

4876

积分

论坛元老

积分
4876
发表于 2024-1-11 09:00:09 | 显示全部楼层
..94*2929=275326 > 65535
截图202401110900057167.jpg
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:437
  • 最近打卡:2025-05-07 13:06:10

33

主题

2355

回帖

4876

积分

论坛元老

积分
4876
发表于 2024-1-11 09:01:22 | 显示全部楼层
去到溢出的位 结果就是你的13182
截图202401110901031347.jpg

这你还知道是u16的变量....
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-03-13 23:33:33

3

主题

7

回帖

29

积分

新手上路

积分
29
发表于 2024-1-11 11:01:15 | 显示全部楼层
_奶*** 发表于 2024-1-11 09:01
去到溢出的位 结果就是你的13182

STM32我都学完了,但是这种直接加减乘除平时都没用过

点评

0.0 啊 也行吧,,也算是自己踩了第一个计算上的坑。看好你哟~  发表于 2024-1-11 11:09
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2024-03-13 23:33:33

3

主题

7

回帖

29

积分

新手上路

积分
29
发表于 2024-1-11 11:16:20 | 显示全部楼层
_奶*** 发表于 2024-1-11 09:01
去到溢出的位 结果就是你的13182

原来这是16位单片机,每次参与运算的数据最大不能超过65535

在32位的编译系统中,int的范围如下
-2147483648~ 2147483647[-2的31次方- 2^31-1]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:437
  • 最近打卡:2025-05-07 13:06:10

33

主题

2355

回帖

4876

积分

论坛元老

积分
4876
发表于 2024-1-11 11:26:41 | 显示全部楼层
,,这个是8位机,也可以计算16位和32位数据。  你自己定义的u16变量,你就要清除 你这个变量的范围是0-65535。
这不关这个单片机什么事情,,你把u16的变量改称u32的变量 也可以得到正确结果。

但是要注意的是 在数据类型的占用位数上 Keil MDK 与 Keil C51 是不同的。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-05-07 07:52:03

45

主题

381

回帖

1591

积分

金牌会员

静坐常思己过,闲谈莫论人非

积分
1591
发表于 2024-1-11 11:35:47 | 显示全部楼层
STC8H1K08的单片机ADC的转换结果是10位,左移6位,也就相当于*64,你把结果*2929,你说溢出了没?这个*2929的结果,ADC结果是10位且让V不溢出的话,至少需要保证V是22位;即使ADC结果是12位则需要V至少是24位。所以你的V是16位显然是不够的。
处事要代人所想,读书需切己用功
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-05-07 07:52:03

45

主题

381

回帖

1591

积分

金牌会员

静坐常思己过,闲谈莫论人非

积分
1591
发表于 2024-1-11 11:46:52 | 显示全部楼层
62*** 发表于 2024-1-11 11:16
原来这是16位单片机,每次参与运算的数据最大不能超过65535

在32位的编译系统中,int的范围如下

1、你用C语言写,干嘛关心每次参与运算的数据大小呢?你定义好结果的变量和两个乘数的变量的大小,保证结果能够存到变量里而不溢出就得了。你又不是用汇编编写,需要考虑累加器的数据大小。你用8位的单片机照样能计算两个十六位的数,只要你的保存结果的变量大小足够大就行。几位的单片机是单片机每次计算的能力,关系到运行速度,不是你关心的结果溢出的问题。2、其次,你说的32位编译系统,int的范围,这是编译器规定的数据类型大小,不是和位数有关。
处事要代人所想,读书需切己用功
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-8 07:06 , Processed in 0.118468 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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