OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7978|回复: 2

(stm32)为啥数组中的第一个元素不好用?

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2012-8-23
在线时间
3 小时
发表于 2012-12-2 14:08:21 | 显示全部楼层 |阅读模式
我在STM32上作了一个触摸键,触摸时程序累加计数,至到该端口电平变化为止。
我用该值,去和数组中给定的值作比较,以判断该键是否被触摸。
问题是b[0]中的值会变化,。.............
我定义了一个数组u16 b[11];
(因我用11个键),
在b[0]写了个基准值45000,
因程序实验结果感觉不对,
就用串口将b[0]的值发送到显示器上,观察b[0]中的值,
不触摸时是45000,没错。
当我触摸键时,b[0]的值,变为36319,36312,28631,3103 等等,当不再触摸时,就稳在已变化的那个值上。
但我将b[0]中的0改为1,5,8等(即b[1],b[5],b[8])值时,
相应的b[] 都是45000,无论怎样触摸,都很稳定。
试了很多次,为啥就是数组中的第一个元素不好用???
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-12-2 19:38:01 | 显示全部楼层
回复【楼主位】liu5jiang:
---------------------------------
你代码问题吧。仿真跟踪下!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2012-8-23
在线时间
3 小时
 楼主| 发表于 2012-12-2 21:44:04 | 显示全部楼层
回复【楼主位】liu5jiang:
---------------------------------
补充一下
 说明:
1. 基准值只在每次通电或复位时做一次动态获取,每次获取的值差别不大,这属于正常。
2. 端口未触摸时,端口由高电平变到低电平期间,计数值较大在50000(这个是5万)到60000之间。
3. 端口被触摸时,端口由高电平变到低电平期间,计数值较小在5000(这里是5千,上面那个是5万)到30000之间

4. 乘了个0.8和1.25的原因是让触摸和未触摸端口时的计数值,做大小比较时判断更加可靠。
5.下面是测试时显示的结果。一个是将基准值放到数组的b[1]元素中,触摸和未触摸时b[1]的值都很稳(见例1)

。另一个是将基准值放到数组的b[0]元素中,触摸和未触摸时b[0]的值会变化(见例2).直接给b[0]赋个值如

40000,在触摸端口时b[0]的值依然会变化(只向小处变,数值不定)。
6.  b[0]或b[1]只在每次通电或复位时做一次动态获取的值,运行在While(1)之前。而在While(1)循环中不停地做

端口是否被触摸的检测,被触摸的检测值用c=表示。

7.  只有b[0]存在不稳的问题,我用b[1],b[5],b[8]试了下没问题。
-------------------------------------------------------------------------------
例1
未触摸时(上电后未触摸时b[1]和不停地采样的c 的值,我把它输出到显示器上得到的)。

 b[1]=46229   //b[1]是开机上电后端口电平变化7次采样的7个计数值值,去掉最大值,次大值和最小值后的平   

                均值, 再乘了个0.8,放到b[1]中,作为基准值。即b[1]作为基准值。
 
 c=62241    // c 是上电未触摸端口的采样的平均值(在While(1)循环中不停地采样),乘了个1.25.作为和基准 

               值 b[1]做比较用。

 b[1] =46229
 c=61535

 b[1] =46229
 c=60871   //因 b[1]这里很稳,下面的就省略不写出来了。只写c=的。

 c=60886
 c=61535
 c=62290
 c=62300
 c=62300
 c=61643
 c=60996
 c=61091
 c=61643
 c=62393
 c=62427
 c=62427
 c=61692
 c=61085
 c=61360
 c=61692
 c=61972
 c=62202
 .......

触摸时(上电后触摸时b[1]和不停地采样的c 的值,我把它输出到显示器上得到的)

 b[1] =46229  // 触摸后 b[1]的值很稳。一直是46229.下面的就省略不写出来了。只写c=的值。

 c=11516     //c为触摸时将采样的值平均后乘以1.25,其值也在5000到22000之间,完全可以和基准值46229
             //做大小的比较
 c=11516  
 c=11438
 c=5081
 c=10953
 c=10968
 c=11432
 c=11438
 c=11438
 c=11381
 c=5043
 c=10897
 c=10916
 c=11375
 c=11381
 c=12417
 c=12418
 c=12896
 c=11033
 c=11512
 c=16576
 c=21903
 c=21908
 c=21911
***********************************
例2
未触摸时(上电后未触摸时b[0]和不停地采样的c 的值,我把它输出到显示器上得到的)


 b[0]=45692  //未触摸时,b[0]一直是45692.下面的就省略不写出来了。只写c=的值.

 c=61027
 c=61206
 c=61576
 c=61636
 c=61688
 c=61688
 c=61230
 c=61021
 c=61206
 c=61230
 c=61260
 c=61406 
 c=61406
--------------

触摸中(上电后触摸时b[0]和不停地采样的c 的值,我把它输出到显示器上得到的)这时就有问题了,

b[0]的值在触摸中会自己改变。见下:

b[0] =3613  //  b[0]的值由上面的那个稳定值45692因触摸端口开始变得不稳定,见下:
 c=5573


b[0] =3613
 c=5978


b[0] =3529
 c=6006


b[0]=3524
 c=6006


b[0] =3524
 c=6655


b[0] =3524
 c=5236


b[0] =3524
 c=6132


b[0] =3524
 c=6227


b[0] =3524
 c=6643


b[0] =3456
 c=6676


b[0] =3420
 c=6676


b[0] =3420
 c=10196


b[0] =3420
 c=5057


b[0] =3420
 c=9738


b[0] =3420
 c=9743


b[0] =3420

 c=10192


b[0] =3327
 c=10225


b[0] =3315
 c=10225


b[0] =3315
 c=6910


b[0] =3315
 c=4951


b[0] =3315
 c=6452


b[0] =3315
 c=6497


b[0] =3315
 c=6900


b[0] =3290
 c=6917


b[0] =3257
 c=6917


b[0] =3257
 c=10098


b[0] =3257
 c=4936


b[0] =3257
 c=9666


b[0] =3257
 c=9671


b[0] =3257
 c=10093


b[0] =3257
 c=10098


b[0] =3256
 c=10098


b[0] =3256
 c=6942


b[0] =3256
 c=4892


b[0] =3256
 c=6520

搞不清是什么原因?

谢谢回复,刚开始学STM32,代码写的很少。我试试看。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 04:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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