srand函数_工程师实战:基于STM32 MCU的数字函数发生器

本文介绍了一位博主使用STM32F410单片机通过其DAC功能产生各种线性波形的过程。主要内容包括理论分析、方案构想、硬件设计和软件设计,特别讨论了如何克服产生高斯噪声的难点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(本文摘自21ic论坛,作者:21ic网友 enderman1)

写在前面的话:

第一次参加论坛里的比赛,相对自己的能力进行一个检验,请大家多多关照~听说比赛截止时间是下月月底?本人决定慢慢来(虽然现在程序都写的差不多了),所以准备一天更新一次吧~(或许。。。)

本次设计采用硬件有

主控: STM32F410 主要原因是本人手头正好有个STM32F410 nucleo的官方板卡(自带ST_link)美滋滋~

示波器: 蹭实验室的~

三极管若干:可能考虑到放大产生的信号

其它:....

思路:

使用stm32 DAC功能产生各种信号 (0~3v)

先来一个板卡的靓图~~

bcb5dc8cc39884ae14e5d19476625fb3.png

关于这次设计我准备分为三大部分来实现:

第一部分:理论分析与方案构想

第二部分:基本功能实现与论证

第三部分:代码优化与功能扩展

额外部分:作品展示与总结+视频演示

【第一部分】

一、实现方案分析

1、大概分析:首先拿到这个题目,要求要用MCU产生各种波形(线性波形)。要了解一个道理:MCU现在采用的是stm32,它是一个离散(数字)的系统(类比计算机),若要让他产生一个模拟信号,由于单片机拥有自身的工作频率,因此每次产生的信号理想状态都是冲击函数δ(t-τ)(序列)与想要产生的波形f(t-τ)的乘积,如图所示:(忽略垃圾字...)

4679d48bb99e7dd41c1f22b8d9a9b77b.png

在实际情况下相当于对t时刻进行平顶抽样之后产生的那个值(也可以看作一个很窄门函数平移的结果),如图:

6c33632c1e73500cdf2391f18d72e38e.png

而目的是产生一个线性的模拟信号,因此当取样周期τ趋近于无穷小的时候,才可以达到理想状态,当然对于单片机来说(对于一个离散的数字系统而言)是不可能的,因此要尽量减少产生信号的周期;当然就算再减少,在示波器也可以看到阶梯状的信号~如图:

678ddf9a09f6088c7840d2978700841c.png

放大--

1c79c29025a17235e929a694a56b7d19.png

2、难点分析:这个题目的难点个人认为是产生高斯噪声,主要原因是噪声是随机的,一个离散的系统(计算机,单片机等)无法产生一个真正的随机数,因为srand()里放的种子一般是时间或是与时间相关的值,都是有规律可循的,因此很难产生一个真正的随机数。当然解决办法也是有的,我会在后面提到。但是我又审了一遍题突然又发现原来是周期高斯函数。。。。。。。波形是这样的:

7a0b0685091c7e795b86100bd052acfd.png

当然,还有就是自定义信号,可能会比较难设计。。。

3、题目分析:产生正弦信号,三角波,锯齿波等等,都可以用公式来实现;信号叠加功能可以直接叠加两个产生信号的函数相加即可;总而言之,主要是实现它们的算法。

4、实现思路分析:配置一个固定频率的dac产生信号,也就是说门函数是固定的,这也带来一个弊端:产生的信号频率越高,越失真(说白了就是越容易变成阶梯状的函数),好处就是容易写~ 请看下图:

3823cd0882fa7a5e44ff63075d3df0e6.png
51d28040ef026637e6196e24dd39cc40.png

显而易见,频率大的信号在一个周期之内所遍历的梳状函数更少。。

二、硬件设计分析

设计框图:

cf522c6f8847ac986880fc541d179d67.png

1、说实话,这个题目涉及的硬件设计部分并不多,最多也就是用洞洞板或是画PCB电路图制作一个板卡的转接板,转接板上可以搞一些按键,和OLED显示转接口;按键来控制输出信号的参数,OLED来显示当前输出信号的参数。

2、我选择打板(听说现在打板很便宜??)我居然有个骚气的想法:这个转接板甚至连原理图都不用画,直接。。。

三、软件设计分析

说实话,快半年没有正儿八经的写32的程序了,于是我决定省点事儿,主要是跑思路。。。

软件设计用的keil 5 STM32CubeMX(自动生成初始化代码美滋滋)

总之今天就到这里了,其实今天已经吧功能写的差不多了;明天准备把今天写的代码完善一下。。。主要是晚上刚刚从实验室回来懒得拎示波器,所以也没法往下进行咯,今天先整理下思路,明天见~

更多内容,请点击 查看更多 阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值