
基于STM32的任意波形发生器(项目不强,板子一定会好看)
简介
以STM32H750XBH6为控制核心,配以DDS-AD9910,借助于串口通信与MATLAB端进行数据连接,将Matlab生成的波形数据进行交互,实现任意波形的发生。
简介:以STM32H750XBH6为控制核心,配以DDS-AD9910,借助于串口通信与MATLAB端进行数据连接,将Matlab生成的波形数据进行交互,实现任意波形的发生。开源协议
:LGPL 3.0
描述
项目说明
本项目以STM32H750XBH6为控制核心,DDS-AD9910为信号响应输出源,与Matlab建立数据交互,将MATLAB端生成的波形数据通过串口或网络端口进行连接,实现任意波形的发生。同时利用MATLAB生成相关C代码,并移植Matlab端生成的C算法代码,实现任意占空比、幅度可调的方波输出,以及任意宽度、斜率幅度可调的的三角波输出基本功能:
- 1.正弦波输出(DDS自带的正弦输出功能)GUI界面如下所示。
参数调节界面如下所示。
- 2.方波输出(跑Matlab生成的算法C代码,幅度,占空比等参数可调)GUI界面如下所示。
黑色区域为波形输出显示,可同步输出相关的波形
参数设置界面如下所示
- 3.三角板输出(跑Matlab生成的算法C代码,可调节宽度、斜率等参数)GUI界面如下所示
参数设置界面如下所示
- 4.波形调制(功能预留)
- 5.任意波输出(与matlab建立通信连接,实现任意波形输出)GUI界面如下所示
开源协议
无特殊说明.1.STM32与Matlab建立通信连接,实现数据交互
-
2.移植Matlab端代码到STM32端运行
-
3.任意波形的绘制与输出
-
4.STM32与串口屏的交互
-
5.串口屏端绘制用户需要生成的波形
**以上的功能说明简单,但其实,实际调的时候需要花费的时间很多去调试,比如Matlab端与STM32段进行通信的时候,传输的数据波形位,MATLAB的串口通信如何等,具体会在设计原理尽可能的说明清楚
注:(虽然不是很强势的项目,但希望用到的人能明白看懂,既然都开源了,我们不喜欢搞那种,我没有义务回答你问题的那套,我们技术烂,但你至少能明白所以然,对吧。)
**
项目属性
提示:本项目为首次公开,为本人原创项目。项目未曾在别的比赛中获奖。
项目进度
# 已完成设计原理
以下主要论述Matlab生成C算法的主要路程及遇到的问题
第一个问题,这也是困扰我最长时间的问题!!!!!
如我在matlab端生成一个函数,
Tripuls_Wave1024_Date= zeros(1,1024); % 创建一个与Wave大小相同的数组,用于存储数据
//忽略中间的处理代码
end
在生成的对应C代码端,会有一个对应的函数
#这个------> emxArray_real_T *y
我的问题,这个怎么传出1024个波形数据,怎么把波形数组传入,这在网上我找了很久,都没有给出很好的答案,后来!我还是解决了
我们想要得到他传输的数据,需要通过指针进行访问这个结构体里面的Date成员,也就是y->data[i],一共1024位,这取决于你定义函数的输出量有几个。
{
AD9910_Date_Buff2[i]=y->data[i];
printf("Wave_date[%d]=%0.2f\r\n",i,y->data[i]);
}
通过C代码上诉操作就可以获取到波形输出的幅度参数。
问:为什么不能像C语言一样直接传入数组
答:我也想啊,但是这个是由Matlab端决定的,有时候可以直接传入输入,有时候会生成这个函数,不同代码不同的结果。
接下来论述怎么生成C算法代码并且移植
第一写一个脚本函数,文件名称与函数名称相同,如我写一个脚本名称如下图所示:
在Matlab中的函数名称如下图所示
这两个名称要一致,接下来按照步骤进行介绍代码移植过程
1.建立脚本名称与函数名称一致的.m脚本文件,并保证相关代码能正常运行
2.验证代码是否可以正常运行,在命令行窗口验证
3.开始生成C算法文件,菜单栏选择APP,找到MATLAB Code选择,并点击进入向导
4.载入相关生成的算法文件
5.传入参数进行验证
6.检测可行性
7.进入代码设置界面
8.设置输出,按照下图进行设置
选择32bitLinux也可以
但是推荐选择For ARM
不同的选择生成的C代码文件不一样
9.获取工程
10.算法生成完毕点击下一步
11.点击这个选项,进入文件目录
12.复制相关.c.h文件到STM32工程中
14.回到Matlab,点击Black按钮
15.复制main.h的头文件,添加到STM32工程上
16.复制main.c头文件到STM32工程上
16按照Main.c文件的提示进行函数使用
17.在STM32段按照MATLAB端的main.c文件进行相同步骤的使用即可实现波形代码生成操作
STM32端的工程截图
以上完成Matlab代码移植过程,对于多个函数也可同时生成,只是在这个这个页面选择添加按钮
按照上述步骤进行生成即可,这样可以减少文件生成的数量
-
(注1:为什么选择STM32H7这种贵的单片机,答:因为STM32F1跑不了Matlab端生成的C语言代码,想着设计 核心板,那就设计的好些)
-
(注2:STM32H750这块板子设计的时候预留了很多资源,如对模拟、数字、电源地进行处理,对STM32的参考电压进行处理,设计主要考虑的是核心板的可适用性。)
以MATLAB为上位机端,STM32H750为下位机端,在MATLAB端绘制相关的波形并生成相关的波形数据,通过串口与
STM32进行连接,传输相关的波形数据,实现任意波形的发生。将常规波形的输出算法移植到STM32H750上,实现相关波形参数的生成,无需MTALB端参与。
软件说明
软件部分主要是对Matlab端的代码进行说明
1.建立一个1024大小的全0数组,用于存储波形数据
2.建立一个7字节大小的全0的数组,用于存储波形发出的数据
波形数据最大16383,需要把波形数据拆分为高低位,采用如下函数。
%定义一个数组,把一个十进制数 转换为2bit的数据存起来 用于发送,在matlab端 需要对数据进行解析
Wave_Date=zeros(1,7); %定义一个全0数组,用于握手数据存储
Wave_Date(1)=0xCC;
Wave_Date(2)=bitand(bitshift(Tags_Bit,-8),255);
Wave_Date(3)=bitand(Tags_Bit,255);
Wave_Date(4)=0XFF;
Wave_Date(5)=bitand(bitshift(date,-8),255);%DATE<<8
Wave_Date(6)=bitand(date,255);%DATE&0xff
Wave_Date(7)=0xAA;
write(Usart, Wave_Date,"uint8");
end
1.bitand--相当于C语言的&函数
2.bitshift--相当于C语言的左移右移动函数
如:1.(16383<<8&)0xff 右移8位&255得到数据高位
2.163830xff &255得到数据低位
得到相关的数据后,通过Wave_Date_Send函数发送出去
在STM32对数据进行解析函数如下
{
static uint16_t val = 0;
static uint8_t *pBuf = (uint8_t*)&val;
pBuf[0] = huartx.rxBuf[2];
pBuf[1] = huartx.rxBuf[1];
return val;
}
uint16_t Get_Date(void)//获取数据位号
{
static uint16_t val = 0;
static uint8_t *pBuf = (uint8_t*)&val;
pBuf[0] = huartx.rxBuf[5];
pBuf[1] = huartx.rxBuf[4];
return val;
}
根据不同的位号获取对应的数据,上述的Matlab数组,结构为:标志位+数据位号+数据+标志位构成
STM32段的解析代码如下
{
AD9910_Date_Buff[Get_Tags_Bitdate()-1]=Get_Date();
sprintf(str, "t2.txt=\"数据位号:%d位\r\n\r\n\r\n\r\n波形数据:%d\"\xff\xff\xff",Get_Tags_Bitdate()-1,Get_Date());
uart_send_bits_COM(&huart3,(uint8_t*)str);
if(Get_Tags_Bitdate()>=1024)
{
Date_Flage=0;
sprintf(str, "t2.txt=\" 数据接收完成\r\n\r\n 数据位总数:%d\r\n\r\n 末位数据:%d\"\xff\xff\xff",Get_Tags_Bitdate(),AD9910_Date_Buff[1023]);//界面显示握手申请
uart_send_bits_COM(&huart3,(uint8_t*)str);
HAL_UART_Transmit_DMA(&huart2, Data_COM_Buff, 7);//发送COM端数据请求Data_COM_Buff
sprintf(str, "t2.txt=\"Com端数据获取\"\xff\xff\xff");//界面显示握手申请
uart_send_bits_COM(&huart3,(uint8_t*)str);
}
}
上述的STM32代码主要是判断帧头帧尾,获取数据位号,获取数据,驱动显示相关参数。
接下来对Matlab代码进行相关论述
串口通信代码,主要是对串口号和波特率进行设置
SerialObj.UserData = struct("Data",[]);
%删除所有已经打开的串口,这条很重要,防止之前运行没有关闭串口
delete(instrfindall); %删除开启的串口
Usart= serialport( 'COM12',115200);%设置串口及波特率
configureCallback(Usart,"byte",1,@serial_callback)%为与串行端口设备的通信设置回调函数和触发条件
pause
configureCallback(Usart,"off")
function serial_callback(Usart,~)
在数据传输部分,主要是通过回调函数进行相关交互
回调函数只要不关闭,数据交互就一直存在,串口屏的操作可以再次实现数据的传输
传输流程进行中,会根据进度绘制相关的波形并显示
Matlab 的命令行串口会显示相关进度
串口1会把串口1 串口2的数据转发到串口助手上
# STM32与Matlab通信--------------本项目的重点-----自定任意波形的关键---请仔细阅读以下例举的功能说明
STM32与matlab通信主要完成以下功能:
1.Matlab生成用户使用的1024点波形幅度数据.
2.Matlab把幅度数据存入Excel中进行波形数据存储(演示视频中不加,因为会卡顿).
3.Matlab通过自带的函数与Matlab进行串口通信.
4.STM32发送握手请求,Matlab回应,建立通信.
5.STM32对数据进行接收,并处理,将接收完成后的数据,写入DAC模块,进行用户自定义波形数据及参数调整.
6.实现相关的波形输出.
针对以上的功能,在MATLAB端以.m属性的进行代码编写,以下对其代码功能进行详细论述,若有不明处,请留言询问。MATLAB以进行相关必要的注释
实物展示
此处对核心板与DAC进行相应的展示
STM32H7核心板
DDS板(没有用相机拍,但应该挺好看,可以去PCB文件看3D文件)
底板
波形输出验证
1.正弦波
2.方波
3.三角波
4.任意波(Matlab端以SINC函数为例)
(注:时间有点匆忙,没有很硬核的项目功能,因此只能在PCB上进行弥补了!!!因为我觉得我们画的板子真的很好看,PCB应该也要带点美学成分,虽然工科人没有那玩意。但装也要装出来!)。
(在核心板设计部分,BTB采用60*2 0.8mm的BTB连接器,有一边的引脚没有用到,因为为了把尺寸契合泰山牌的尺寸大小,其他的BTB长度不合适,虽然造成浪费,但避免了很多问题)
(DAC部分,采用SPI串行,没有使用并行,SMA口采用半沉板的方式进行连接,这样的PCB会美观很多)
其他
演示视频:https://www.bilibili.com/video/BV1EYzBYVECY/
工程附件:参加活动的作品必须把工程相关的程序附件上传至开源平台或个人的代码存储云端,附件最大支持50M上传(请勿在立创工作区上传,有限制)
设计图

BOM


评论