打印
[STM32F1]

STM32的ADC产生随机数

[复制链接]
3011|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 吃饱了不饿 于 2015-7-27 21:31 编辑

因为在做一样东西需要产生随机数,范围在[0,15],在网上找到一种方法,就是利用ADC悬空引脚产生随机数,所以做了尝试,把尝试的结果分享一下,总的来说,随机效果还算可以。
函数如下:

首先初始化ADC1,然后读取通道4PA4引脚上的电压值,转换成16位的数字值后取低4位,再赋给8位变量led_mode_value
将这个led_mode_value变量通过串口送至电脑观察,效果如下:


看来随机效果还算可以,23次取值,取到了8个不同值,这样的随机程度可以接受。





随机数产生过程改进版
函数如下:

初始化ADC1之后,先取一个低4位的值,然后再取一个16位随机值加到第一个随机4位值上,得到一个和,然后再取出这个和的低4位作为最终的范围在[0,15]中的随机数。
通过串口送到电脑,效果如下:
23次的取值统计,统计到了14个随机 值,随机效果提升。

当然,利用ADC产生随机数是一个可行的方法,但由于是利用ADC引脚悬空的噪声电压,经AD转换来获取的,所以随机效果取决于当时处理器周围的电磁环境,电磁干扰越多,随机效果就越好,貌似这样有悖于降低EMI环境的理论,但有些事物总要作出取舍,世界的天平总是在晃动中保持平衡,没有极好,也没有极坏,适合的就是最好的。

PS:
STM32的ADC引脚对应的IO
沙发
香水城| | 2015-7-14 14:28 | 只看该作者
很好的分享!

使用特权

评论回复
板凳
香水城| | 2015-7-14 14:29 | 只看该作者
记得下次发分享帖时,不要给分。这样就不会显示成问号了。:)

使用特权

评论回复
地板
gx_huang| | 2015-7-14 14:34 | 只看该作者
这显然不是标准含义的随机数,是靠近某个电平的随机数。
悬空的管脚,如果没有受外部影响,电平基本是固定范围内缓慢变化的。

使用特权

评论回复
5
搞IT的| | 2015-7-14 20:07 | 只看该作者
哈哈 第一次看到这样的应用,学习了。

使用特权

评论回复
6
chris2shen| | 2015-7-14 20:16 | 只看该作者
本来觉得不如用定时器里面产生累加值来做,比如有个32bit的整型数据放在定时器里面产生一次中断就累加一次质素。

使用特权

评论回复
7
小浣熊| | 2015-7-14 20:27 | 只看该作者
这个具体应用哪里呀

使用特权

评论回复
8
mmuuss586| | 2015-7-14 23:03 | 只看该作者

不错;

使用特权

评论回复
9
ticomi| | 2015-7-15 09:56 | 只看该作者
可以考虑采用软件的方式生成一个随机数,较为方便!

使用特权

评论回复
10
吃饱了不饿|  楼主 | 2015-7-27 21:33 | 只看该作者
在做一个带有触摸按键的面板,使用按键前点亮某个按键,这个点亮的对象要是随机的,所有需要随机数

使用特权

评论回复
11
吃饱了不饿|  楼主 | 2015-7-27 21:34 | 只看该作者
小浣熊 发表于 2015-7-14 20:27
这个具体应用哪里呀

随机点亮按键面板的某个背景LED

使用特权

评论回复
12
tototm| | 2015-7-28 16:45 | 只看该作者
学习了!

使用特权

评论回复
13
lgnativs| | 2015-7-28 17:24 | 只看该作者
用ADC的结果作为随机算法的种子,可以获得更好的效果.

使用特权

评论回复
14
donsbin| | 2015-7-28 17:42 | 只看该作者
我以前用过定时器来做随机数种子,效果一般

使用特权

评论回复
15
吃饱了不饿|  楼主 | 2015-7-31 14:14 | 只看该作者
lgnativs 发表于 2015-7-28 17:24
用ADC的结果作为随机算法的种子,可以获得更好的效果.

什么是随机数种子?我只是拿两个随机数相加求得随机数,这算是种子吗?

使用特权

评论回复
16
尤彼卡| | 2015-8-4 10:15 | 只看该作者
采用软件的方式生成一个随机数也可以的

使用特权

评论回复
17
可可球| | 2015-8-4 10:44 | 只看该作者
随机点亮按键面板的背景LED

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

21

帖子

1

粉丝