[创新制造展示] 21ic第三届设计大赛 + 波形发生器

[复制链接]
3056|30
 楼主 | 2019-5-31 16:48 | 显示全部楼层 |阅读模式
本帖最后由 一路向北lm 于 2019-6-17 13:55 编辑

为了调动大家的积极性,先开个贴,万一你们都不参加呢!哈哈侥幸心理...............
先发个波让你们看看 ,吓吓你们,快点来参赛!!!

1.png

2.png



1)项目方案的构想


01.产生五种波形,分别是正弦波,方波,三角波,锯齿波,杂波,离散点暂定一个周期内为36个点,频率范围为1-100K,幅值为STM32的电压范围(0-3.3V)。
1.PNG
后续经过广大网友提出要求,采样点数太少,故增加了10倍,现在已使用360点作为一个周期的数据。
2)设计、搭建

02.波形发生器设计流程如下图,采用STM32作为主控芯片,通过DA输出离散点的电压,通过LCD进行数据交互,控制MCU产生各种波形,以及几种波形的切换。增加串口,通过串口工具与开发的上位机进行数据通讯,完成各种波形的产生。
2.PNG
03.本次用到的硬件和调试器如下图,硬件选择野火电子的霸道开发板+LCD屏幕,调试器使用Jlink
3.png

04.示波器暂时借用学校实验室的示波器。(偷偷告诉大家,千万不能让导师知道,要不我又得挨骂!)
4.png


使用特权

评论回复

评论

21ic小喇叭 2019-6-10 10:50 回复TA
666 
 楼主 | 2019-6-14 11:36 | 显示全部楼层
本帖最后由 一路向北lm 于 2019-6-14 14:43 编辑

3)调试流程

1.正弦波的产生
01.使用matlab工具,生成一个周期内36点正弦波数据,由于正弦波的幅值位于-1~1之间,我们需要将幅值范围转为0~3.3 具体matlab代码如下,以及matlab绘制的正弦曲线图像如下所示,为了方便移植到我们的单片机中,我们将36点的数据输出到.c文件中。
m文件代码如下:

  1. %用于产生正弦数据表,输出到文件sinWave.c 文件中,复制到c语言数组即可

  2. n = 2*pi/36 : 2*pi/36 : 2*pi      %分成36等份

  3. a = sin(n)+1;                     %求取sin函数值并向上平移一个单位,消除负数值
  4. a = a * 3.3/2;                    %调整幅值,使范围限制为0~3.3   
  5. r = a* (2.^12) /3.3               %求取dac数值,12位dac LSB = 6.3/2.^12
  6. r = uint16(r);                    %把double型数据转化成16位整型数据

  7. for i = 1:36                        
  8. if r(i) > 4095                      %限制数据最大不超过4095
  9.     r(i) = 4095
  10. end
  11. end

  12. dlmwrite('C:\Users\JY-LM\Desktop\波形发生器\教程提到的正弦波表制作脚本\matlab脚本\sinWave.c',r);      %把数据写入到文件,方便添加到stm32工程中
  13. plot(n,r,'.')                     %把这些点画出来

复制代码
matlab图像如下:
5.png
02.36点的正弦波数据填入数组中,DMA周期性搬运数据到从该数组到DA外设。
  1. /* 36点正弦波数据---------------------------------------------------------*/
  2. const uint16_t Sine12bit[POINT_NUM] =
  3. {
  4.          2404, 2748,3072,3364,3617,3822,3972,4065,
  5.          4095, 4065,3972,3822,3617,3364,3072,2748,
  6.    2404, 2048,1692,1348,1024,732, 479, 274,
  7.    124,  31,  0,   31,  124, 274, 479, 732,   
  8.          1024, 1348,1692,2048
  9. };
复制代码
  1. /* 填充波形数据,单通道输出对应引脚PA5*/
  2. for (Idx = 0; Idx < POINT_NUM; Idx++)
  3. {
  4.     DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
  5. }
复制代码
03.示波器探头连接stm32单片机PA5端口,可以看到已经输出了100kHZ的正弦波,当然还可以增加每个周期的采样点数,更加逼近正弦波。
6.png
7.png
2.方波的产生
01.对于方波就比较简单了,直接填充36个点的数据,前18点为低电平(DA数据位0),后18点为高电平(DA数据为4095 对应3.3V)。
  1. /* 方波数据 ---------------------------------------------------------*/
  2. const uint16_t Square12bit[POINT_NUM] =
  3. {
  4.          0,0,0,0,0,0,0,0,0,
  5.          0,0,0,0,0,0,0,0,0,
  6.          4095,4095,4095,4095,4095,4095,
  7.          4095,4095,4095,4095,4095,4095,
  8.          4095,4095,4095,4095,4095,4095,
  9. };
复制代码
02.想象是美好的,在低频段区域(1-10K)出现的方波还是比较好的,后面我将频率增大到100K时,示波器上出现的波形还是有一定的缺陷,这里的边缘处,高低电平的切换存在着过渡期,这个是我们所不想看到的。由于STM32 DA自身的响应速度,这个我也无能为力,如果我们采用PWM的方式这样出来的方波将会更加完美,本次比赛题目限定使用DA,所以这里就先这样了。

10 K时的方波图:
8.png
100K时的方波图:
9.png
3.三角波的产生
01.对于对于三角波也是采用matlab输出36个点,前18点从0V3.3V线性递增(DA数据从0线性增长到4095),后18点从3.3V0V线性递减(DA数据从4095线性递减到0)。
  1. /* 三角波数据 ---------------------------------------------------------*/
  2. const uint16_t Triangular12bit[POINT_NUM] =
  3. {
  4.          0,   227, 455, 682, 910, 1137,1365,1592,1820,
  5.          2047,2275,2502,2730,2957,3185,3412,3640,3867,
  6.          4095,3867,3640,3412,3185,2957,2730,2502,2275,
  7.          2047,1820,1592,1365,1137,910, 682, 455, 227,         
  8. };
复制代码
10kHZ100KHZ的波形如下,从波形上来看,随着频率的升高,三角波的波尖越来越平滑。这些是我们不希望看到的,由于DA本身的局限性,这里也在所难免。

10k三角波图:
10.png
100k三角波图:
11.png
4.锯齿波的产生
01.对于对于三角波也是采用matlab输出36个点,36点从3.3V0V线性递减(DA数据从4095线性递减到0)。
  1. /* 锯齿波数据---------------------------------------------------------*/
  2. const uint16_t Sawtooth12bit[POINT_NUM] =
  3. {
  4.          4095,3978,3861,3744,3627,3510,
  5.          3393,3276,3159,3042,2925,2808,
  6.          2691,2574,2457,2340,2223,2106,
  7.          1989,1872,1755,1638,1521,1404,
  8.          1287,1170,1053,936, 819, 702,
  9.          585, 468, 351, 234, 117, 0
  10. };
复制代码
02.10kHZ100KHZ的波形如下,从波形上来看,随着频率的升高,锯齿波的波尖越来越平滑。这些是我们不希望看到的,由于DA本身的局限性,这里也在所难免。

10k锯齿波图:
12.png
100k锯齿波图:
13.png
5.杂波的产生



使用特权

评论回复

评论

一路向北lm 2019-6-15 12:10 回复TA
@zhanzr21 :增加点,使劲增加 
一路向北lm 2019-6-15 12:09 回复TA
@zhanzr21 : 
zhanzr21 2019-6-14 22:03 回复TA
因为最后还有幅度变换, 建议尽量还是本机运算. 
zhanzr21 2019-6-14 22:01 回复TA
36个点的正弦波太寒酸了, 多做些点, 反正这个点可以存在flash区, 方波,三角波这样的就没有必要查表了, 小Cortex M算得过来. 个人意见,仅供参考! 
 楼主 | 2019-6-17 11:14 | 显示全部楼层
本帖最后由 一路向北lm 于 2019-6-17 13:53 编辑

第二次调试
      为了响应广大网友的号召,将采样点数增加10倍,一个周期内的点数为360个点。好多网友说正弦波可以采用查表的方式,对于方波、三角波、锯齿波就没有必要采用查表的方式了。这里我主要是采用DMA搬运列表数据到DA外设的方式,这样就不会占用CPU的资源了。为了后面的LCD和串口接受部分程序顺利执行,使用DMA搬运是比较好的方法。当然使用操作系统也可以,根据自己的方式,找到最适合自己的方法。
        增加到360点的正弦波,matlab生成的波形和数据点如下,这样一看,哇!波形不错啊,不知道stm32可以增加到多少个点!360个点不少了!再多了,我怕DMA被累死了!
  1. %用于产生正弦数据表,输出到文件sinWave.c 文件中,复制到c语言数组即可
  2. n = 2*pi/360 : 2*pi/360 : 2*pi      %分成36等份
  3. a = sin(n)+1;                     %求取sin函数值并向上平移一个单位,消除负数值
  4. a = a * 3.3/2;                    %调整幅值,使范围限制为0~3.3   
  5. r = a* (2.^12) /3.3               %求取dac数值,12位dac LSB = 6.3/2.^12
  6. r = uint16(r);                    %把double型数据转化成16位整型数据
  7. for i = 1:360                        
  8. if r(i) > 4095                      %限制数据最大不超过4095
  9.     r(i) = 4095
  10. end
  11. end
  12. dlmwrite('C:\Users\JY-LM\Desktop\21ic第三届大赛\波形发生器\教程提到的正弦波表制作脚本\matlab脚本\sinWave.c',r);      %把数据写入到文件,方便添加到stm32工程中
  13. plot(n,r,'.')                     %把这些点画出来
复制代码
庞大的数据集………..DMA来也……….
  1. const uint16_t Sine12bit[POINT_NUM] =
  2. {
  3.          2084,2119,2155,2191,2226,2262,2298,2333,2368,2404,
  4.          2439,2474,2509,2543,2578,2613,2647,2681,2715,2748,
  5.          2782,2815,2848,2881,2914,2946,2978,3009,3041,3072,
  6.          3103,3133,3163,3193,3223,3252,3281,3309,3337,3364,
  7.          3392,3418,3445,3471,3496,3521,3546,3570,3594,3617,
  8.          3640,3662,3684,3705,3726,3746,3766,3785,3803,3822,
  9.          3839,3856,3873,3889,3904,3919,3933,3947,3960,3972,
  10.          3984,3996,4007,4017,4026,4035,4044,4051,4058,4065,
  11.          4071,4076,4081,4085,4088,4091,4093,4095,4095,4095,
  12.          4095,4095,4093,4091,4088,4085,4081,4076,4071,4065,
  13.          4058,4051,4044,4035,4026,4017,4007,3996,3984,3972,
  14.          3960,3947,3933,3919,3904,3889,3873,3856,3839,3822,
  15.          3803,3785,3766,3746,3726,3705,3684,3662,3640,3617,
  16.          3594,3570,3546,3521,3496,3471,3445,3418,3392,3364,
  17.          3337,3309,3281,3252,3223,3193,3163,3133,3103,3072,
  18.          3041,3009,2978,2946,2914,2881,2848,2815,2782,2748,
  19.          2715,2681,2647,2613,2578,2543,2509,2474,2439,2404,
  20.          2368,2333,2298,2262,2226,2191,2155,2119,2084,2048,
  21.          2012,1977,1941,1905,1870,1834,1798,1763,1728,1692,
  22.          1657,1622,1587,1553,1518,1483,1449,1415,1381,1348,
  23.          1314,1281,1248,1215,1182,1150,1118,1087,1055,1024,
  24.          993, 963, 933, 903, 873, 844, 815, 787, 759, 732,
  25.          704, 678, 651, 625, 600, 575, 550, 526, 502, 479,
  26.          456, 434, 412, 391, 370, 350, 330, 311, 293, 274,
  27.          257, 240, 223, 207, 192, 177, 163, 149, 136, 124,
  28.          112, 100, 89,  79,  70,  61,  52,  45,  38,  31,
  29.          25,  20,  15,  11,  8,   5,   3,   1,   0,   0,
  30.          0,   1,   3,   5,   8,   11,  15,  20,  25,  31,
  31.          38,  45,  52,  61,  70,  79,  89,  100, 112, 124,
  32.          136, 149, 163, 177, 192, 207, 223, 240, 257, 274,
  33.          293, 311, 330, 350, 370, 391, 412, 434, 456, 479,
  34.          502, 526, 550, 575, 600, 625, 651, 678, 704, 732,
  35.          759, 787, 815, 844, 873, 903, 933, 963, 993, 1024,
  36.          1055,1087,1118,1150,1182,1215,1248,1281,1314,1348,
  37.          1381,1415,1449,1483,1518,1553,1587,1622,1657,1692,
  38.          1728,1763,1798,1834,1870,1905,1941,1977,2012,2048
  39. };
复制代码
从matlab 绘制的正弦波来看,还是有模有样的!
14.png
示波器输出波形如下,没看出来与36点的区别,方正现在可以称得上是正弦波了吧!

360点的正弦波
15.png

360点的方波
16.png

360点的三角波
18.png

360点的锯齿波
17.png

你怕,你怕,生活欺骗了你,所以你不敢想象,你不敢去尝试。如今,我尝试了,为什么波还是那个波,没有什么起色呢?也许是生活又欺骗了你吧!


使用特权

评论回复
 楼主 | 2019-6-17 13:58 | 显示全部楼层
本帖最后由 一路向北lm 于 2019-6-29 23:29 编辑

LCD驱动显示界面
LCD显示界面如下,使用按键1来切换波形,使用按键2来切换频率。
1.产生方波 10k Hz  3.3V
19.png
2.产生正弦波 10HZ  3.3V
20.png

LCD驱动代码
lcd.zip (12.79 KB, 下载次数: 2)

使用特权

评论回复
 楼主 | 2019-6-17 14:01 | 显示全部楼层
本帖最后由 一路向北lm 于 2019-6-29 23:39 编辑

波形发生器PC端软件开发部分

采用Qt开发了一个可以在PC端运行,通过串口转485和开发板通讯,采用modbus通讯协议来控制板卡产生不同的波形,上位机打算在自己以前开发串口助手上面进行改进。
178065d0c7c845579e.png

哈哈,有点感觉了,进步一点。
778125d178626cf1d0.png





使用特权

评论回复
| 2019-5-31 19:12 | 显示全部楼层
期待大作!

使用特权

评论回复
| 2019-5-31 21:32 | 显示全部楼层
连心理战都用上了  牛叉

使用特权

评论回复
 楼主 | 2019-6-2 20:42 | 显示全部楼层

一起来,参与下

使用特权

评论回复

评论

zhanzr21 2019-6-2 23:11 回复TA
我是评委之一, 为了避嫌, 不能参与, 呵呵 
 楼主 | 2019-6-2 20:42 | 显示全部楼层
王栋春 发表于 2019-5-31 21:32
连心理战都用上了  牛叉

气势上压倒他们

使用特权

评论回复
| 2019-6-2 20:57 | 显示全部楼层
支持各种波形调制吗?

使用特权

评论回复
| 2019-6-2 21:24 | 显示全部楼层

期待你具体的资料分享

使用特权

评论回复
 楼主 | 2019-6-4 17:39 | 显示全部楼层
王栋春 发表于 2019-6-2 21:24
期待你具体的资料分享

哈哈,

使用特权

评论回复
| 2019-6-13 17:33 | 显示全部楼层
相关资料呢

使用特权

评论回复
 楼主 | 2019-6-14 13:21 | 显示全部楼层

后续更新

使用特权

评论回复
| 2019-6-17 18:28 | 显示全部楼层
哈哈,我还是慢了一步,楼主很厉害的,还加上了上位机还有LCD屏,绝对是大作,本人还是准备考试吧

使用特权

评论回复
 楼主 | 2019-6-17 20:06 | 显示全部楼层
enderman1 发表于 2019-6-17 18:28
哈哈,我还是慢了一步,楼主很厉害的,还加上了上位机还有LCD屏,绝对是大作,本人还是准备考试吧[e ...

不要放弃哈,加油

使用特权

评论回复
| 2019-6-17 20:34 | 显示全部楼层
能做到任意频率否?

使用特权

评论回复

评论

zhanzr21 2019-6-19 22:18 回复TA
任何发生信号的装置都有带宽的啊, MCU这种低端芯片也是如此. 题目中要求也是给出频率发生范围. 
 楼主 | 2019-6-17 21:13 | 显示全部楼层
gujiamao12345 发表于 2019-6-17 20:34
能做到任意频率否?

频率有上限,而且stm32 DA精度不够

使用特权

评论回复
| 2019-6-19 17:08 | 显示全部楼层
一路向北lm 发表于 2019-6-17 21:13
频率有上限,而且stm32 DA精度不够

楼主的作品不错,来学习下,方波,锯齿波,三角波的生成

使用特权

评论回复
| 2019-6-19 17:32 | 显示全部楼层
这个做一个简单的示波器挺好的

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /5 下一条

在线客服 快速回复 返回顶部 返回列表