基于FPGA的温度采集系统工程:Max6675驱动源码与QT控制软件工程代码
基于fpga的温度采集系统工程,max6675驱动源码,可上传到电脑上位机软件绘制温度曲线! fpga代码、和QT控制软件!是工程代码!
该工程包含FPGA端硬件驱动代码与PC端上位机软件代码两大部分,实现了温度采集、实时显示、数据存储及温度曲线绘制功能,核心围绕MAX6675温度传感器展开,适配Cyclone IV E系列FPGA芯片,采用Qt框架开发上位机界面。
一、FPGA端代码(max6675_disp目录)
1. 工程配置文件
- max6675disp.qpf:Quartus II项目配置文件,记录工程基础信息,包括使用Quartus II 13.1版本,项目创建时间为2020年2月29日,项目版本标识为“max6675disp”,明确版权归属Altera Corporation,限定工具仅用于Altera生产的逻辑器件编程。
- max6675_disp.qsf:项目设置文件,定义硬件参数与文件依赖,关键配置如下表:
| 配置项 | 具体参数 | 说明 |
|---|---|---|
| FPGA芯片型号 | Cyclone IV E系列EP4CE10F17C8 | 确定硬件适配的核心芯片 |
| 顶层模块 | max6675_disp | 工程逻辑入口模块 |
| 输入输出引脚分配 | 如sysclk(时钟)接PINE1,sysrstn(复位)接PIN_M1 | 定义FPGA与外部硬件的物理连接 |
| 核心文件依赖 | max6675disp.v、segled.v、max6675_dri.v | 指定工程所需的3个Verilog逻辑文件 |
| 工作温度范围 | 0°C~85°C | 限定芯片正常工作的核心结温 |
| 输出目录 | output_files | 编译生成文件(如.sof)的存储路径 |
2. 核心逻辑模块(Verilog代码)
(1)顶层模块:max6675_disp.v
- 功能:整合温度驱动模块与数码管显示模块,实现信号转发与模块间数据交互。
- 端口定义:
- 输入:sysclk(系统时钟)、sysrst_n(系统复位,低电平有效)、miso1(MAX6675的SPI从机输出信号);
- 输出:cs1(MAX6675片选信号)、sck1(MAX6675时钟信号)、sel[5:0](数码管位选信号)、seg_led[7:0](数码管段选信号)。
- 模块例化:
- 数码管驱动模块(seg_led):接收温度数据,控制6位数码管显示;
- MAX6675驱动模块(max6675_dri):生成传感器控制信号,采集并转换温度数据。
(2)温度驱动模块:max6675_dri.v
- 核心功能:实现3路MAX6675传感器的SPI通信控制、温度数据采集与转换,支持0.5秒间隔的周期性采集。
- 关键逻辑:
- 时钟分频:将50MHz系统时钟分频为1MHz(clk_1us),用于传感器时序控制;
- 采集时序:通过T_counter计数器控制片选(CS)与时钟(SCK)信号,3路传感器分时采集(避免信号冲突),在SCK下降沿读取16位原始数据;
- 数据处理:提取原始数据中12位有效温度数据(bit14~bit3),通过“×25”运算(等效于“÷4×100”)将温度值放大100倍,便于数码管显示小数(如25.5°C转换为2550);
- 输出:3路温度数据(tempdata、tempdata2、temp_data3),均为20位宽(适配数码管模块输入)。
(3)数码管显示模块:seg_led.v
- 功能:将20位温度数据(放大100倍后)转换为6位数码管的动态显示信号,支持小数点位置控制与正负符号显示。
- 关键逻辑:
- 数据转换:将20位二进制数拆分为6个4位BCD码(对应十万位、万位、千位、百位、十位、个位);
- 动态扫描:通过1ms周期的计数器(cnt0)与状态切换(cnt),实现6位数码管轮流点亮(消影);
- 显示控制:支持小数点位置自定义(point端口)、显示使能(en端口)、正负符号(sign端口,高电平显示“-”),通过seg_led端口输出段选信号(含小数点),sel端口输出位选信号。
二、PC端上位机代码(xAG目录)
基于Qt框架开发,实现串口通信、温度数据接收、实时曲线绘制与数据存储功能,包含5个文件,核心逻辑集中在Widget类与myThread线程类。
1. 核心文件与功能
| 文件 | 功能 |
|---|---|
| main.cpp | 程序入口,创建QApplication与Widget窗口实例,启动应用消息循环 |
| widget.h/.cpp | 主窗口逻辑,负责串口配置、数据接收、数据存储与UI交互 |
| mythread.h/.cpp | 绘图线程,独立于主线程运行,负责温度曲线绘制与画布更新 |
2. 关键功能实现
(1)串口通信(widget.cpp)
- 串口配置:支持自动枚举可用串口,波特率可选(9600、4800、115200),数据位8位、停止位1位、无校验、无流控;
- 数据接收:通过
Read_Data()函数读取串口数据(十六进制格式),转换为温度值(原始值÷100,保留1位小数),并通过sendTemp信号转发至绘图线程与存储模块; - UI控制:通过单选按钮(radioButton)切换串口“打开/关闭”状态,关闭时释放串口资源。
(2)温度曲线绘制(mythread.cpp)
- 独立线程:继承QThread,通过
run()函数启动绘图循环,避免阻塞主UI线程; - 画布初始化:创建810×610像素的RGB32格式画布,绘制坐标轴(X轴为时间,单位秒,范围0~60s;Y轴为温度,单位°C,范围0~100°C),包含刻度、数值与箭头标识;
- 数据缓存:使用
array0[121]数组缓存121个温度数据(对应0~60s,每0.5s一个点),数据满后自动左移(丢弃最旧数据); - 曲线绘制:每500ms更新一次画布,用蓝色点(4像素宽)标记温度数据,红色线(2像素宽)连接相邻点,通过
updateImage信号将画布发送至主窗口显示。
(3)数据存储(widget.cpp)
- 存储路径:默认存储至“../xag.txt”文件,记录格式为“时间(yyyy.MM.dd hh:mm:ss ddd)+ 温度(Temp=XX.X)”;
- 文件控制:支持通过“清空”按钮(pushButton)删除文件历史数据(通过
flag标记控制文件清空),存储时自动追加新数据,不覆盖历史记录。
三、系统整体工作流程
- FPGA端:
- 系统上电后,sysrstn复位信号释放,max6675_dri模块开始分频生成1MHz时钟;
- 每0.5秒分时采集3路MAX6675传感器数据,转换为放大100倍的温度值;
- 数码管模块接收温度数据,动态扫描显示(如25.5°C显示为“25.5”)。 - PC端:
- 上位机启动后,自动枚举可用串口,用户选择串口与波特率并打开;
- 串口接收FPGA发送的十六进制温度数据,转换为实际温度值;
- 绘图线程实时绘制温度曲线,主窗口显示曲线并将数据写入文本文件;
- 用户可通过按钮清空历史数据,关闭窗口时自动停止绘图线程与串口通信。
四、核心特点与适配性
- 多通道采集:FPGA端支持3路MAX6675,可同时采集多个点位温度;
- 实时性:0.5秒采集间隔,500ms曲线更新,满足中低速温度监测场景;
- 兼容性:FPGA适配Cyclone IV E系列芯片,上位机支持Windows系统(Qt跨平台特性可扩展至Linux);
- 易用性:上位机自动枚举串口,支持数据可视化与历史记录,操作简洁。
基于fpga的温度采集系统工程,max6675驱动源码,可上传到电脑上位机软件绘制温度曲线! fpga代码、和QT控制软件!是工程代码!
