- 2024-08-21
-
加入了学习《CH582 微信小程序控制LED》,观看 CH582 微信小程序控制LED
-
加入了学习《CH582 AHT 温湿度计》,观看 CH582 AHT10 温湿度计
- 2024-05-23
-
加入了学习《直播回放: TI 毫米波雷达在楼宇自动化的应用》,观看 TI 毫米波雷达在楼宇自动化的应用
- 2024-05-06
-
加入了学习《直播回放: ADI 惯性 MEMS 传感器的应用价值与选型》,观看 ADI 惯性 MEMS 传感器的应用价值与选型
- 2024-03-05
-
发表了主题帖:
【安信可BW16-Kit开发板】BLE应用—温度测量与显示
【安信可BW16-Kit开发板】BLE应用—温度测量与显示
在《【安信可BW16-Kit开发板】DHT11应用》和《【安信可BW16-Kit开发板】WifiWebClient应用》中分别介绍了利用安信可BW16-Kit开发板进行温度测试和wifi应用,本篇介绍一下安信可BW16-Kit开发板在ArduinoIDE下的BLE应用示例。有关BW16-Kit开发板基本性能和Arduino开发环境搭建不在赘述。
一、BLE应用开发示例
按下图连接好线路,注意BW16-Kit开发板DHT11信号线连接A26引脚。
ArduinoIDE环境下选择开发板为Ameba。
选择“Tools” -> “Board” -> “Arduino Ameba”
然后打开AmebaBLE下的DHT over BLEUart示例,“Files”->“Examples” ->“AmebaBLE”->“DHT_over_BLEUart”。
程序如下
/*
Example
*/
#include "BLEDevice.h"
#include "DHT.h"
#define UART_SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
#define STRING_BUF_SIZE 100
#define DHTPIN 8
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
BLEService UartService(UART_SERVICE_UUID);
BLECharacteristic Rx(CHARACTERISTIC_UUID_RX);
BLECharacteristic Tx(CHARACTERISTIC_UUID_TX);
BLEAdvertData advdata;
BLEAdvertData scndata;
bool notify = false;
void writeCB (BLECharacteristic* chr, uint8_t connID) {
Serial.print("Characteristic ");
Serial.print(chr->getUUID().str());
Serial.print(" write by connection ");
Serial.println(connID);
if (chr->getDataLen() > 0) {
Serial.print("Received string: ");
Serial.print(chr->readString());
Serial.println();
}
}
void notifCB(BLECharacteristic* chr, uint8_t connID, uint16_t cccd) {
if (cccd & GATT_CLIENT_CHAR_CONFIG_NOTIFY) {
Serial.print("Notifications enabled on Characteristic");
notify = true;
} else {
Serial.print("Notifications disabled on Characteristic");
notify = false;
}
Serial.print(chr->getUUID().str());
Serial.print(" for connection");
Serial.println(connID);
}
void setup() {
Serial.begin(115200);
advdata.addFlags();
advdata.addCompleteName("AMEBA_BLE_DEV");
scndata.addCompleteServices(BLEUUID(UART_SERVICE_UUID));
Rx.setWriteProperty(true);
Rx.setWritePermissions(GATT_PERM_WRITE);
Rx.setWriteCallback(writeCB);
Rx.setBufferLen(STRING_BUF_SIZE);
Tx.setReadProperty(true);
Tx.setReadPermissions(GATT_PERM_READ);
Tx.setNotifyProperty(true);
Tx.setCCCDCallback(notifCB);
Tx.setBufferLen(STRING_BUF_SIZE);
UartService.addCharacteristic(Rx);
UartService.addCharacteristic(Tx);
BLE.init();
BLE.configAdvert()->setAdvData(advdata);
BLE.configAdvert()->setScanRspData(scndata);
BLE.configServer(1);
BLE.addService(UartService);
BLE.beginPeripheral();
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
String msg = ("Humidity: " + String((int) h) + "%\t" + "Temperature: " + String((int) t) + "°C\n");
Tx.writeString(msg);
if (BLE.connected(0) && notify) {
Tx.notify(0);
}
delay(5000);
}
二、运行
1、打开手机蓝牙客户端,搜索到蓝牙名为AMEBA_BLE_DEV,并配对;
2、在列表中选择名为“AMEBA_BLE_DEV”,点击进入下面的界面后,选择“UNknown Service”选项;
运行结果如下:
- 2024-02-25
-
发表了主题帖:
【安信可BW16-Kit开发板】WifiWebClient应用
【安信可BW16-Kit开发板】WifiWebClient应用
随着物联网的兴起,在许多项目中,我们需要使用Arduino开发板来实现与互联网的无线连接。使用WiFi模块,我们可以轻松实现物联网应用,将传感器数据发送到云平台或者通过云平台控制设备。安信可BW16-Kit具有Ble、Wifi功能。本文将介绍一下在Arduino下使用BW16-Kit开发板连接WEB客户端方法。
一、安信可BW16-Kit介绍
安信可科技BW16是双频 Wi-Fi+蓝牙SoC模组,支持双频(2.4GHz或5GHz)WLAN 和低功耗蓝牙5.0 ,集成了ARM V8兼容Cortex-M4F)高性能MCU、ARM V8M(兼容 Cortex-M0)低功耗 MCU、WLAN(802.11 a/b/g/n)、MAC,蓝牙基带和RF基带,并提供可配置的GPIO口,用于不同外围设备的控制。安信可BW16 集成了内部存储器,支持简单的应用程序开发,可实现完整的Wi-Fi和BT5.0协议功能。
【特性】
支持 802.11a/b/g/n 1x1,2.4GHz or 5GHz
支持 HT20/HT40 模式
支持低功耗信标监听模式,低功耗接收模式,低功耗挂起模式
内置 AES / DES / SHA 硬件引擎
支持 TrustZone-M,支持安全启动
支持 SWD 调试端口访问保护和禁止模式
支持 BLE 和 BT5.0
蓝牙支持高功率模式(7dBm,与 Wi-Fi 共享同一 PA)
Wi-Fi 和 BT 共用同一天线
支持 STA/AP/STA+AP 工作模式
支持安卓、IOS 的 Simple Config(APP)WiFi一键配网
支持蓝牙辅助配网
支持串口本地升级和远程固件升级(FOTA)
二、环境搭建
BW16-Kit开发板的Arduino开发环境搭建介绍的文章很多,这里就不在赘述,可参考相关文章。【安信可BW16-Kit】+搭建环境 - RF/无线 - 电子工程世界-论坛 (eeworld.com.cn)
三、WifiWebClient应用开发示例
我们使用Ameba连上WiFi,作为客户端,从百度上获取资讯。
ArduinoIDE环境下选择开发板为Ameba,
选择“Tools” -> “Board” -> “Arduino Ameba”
然后打开 WiFi Web Client的范例, “File” -> “Examples” -> “WiFi” -> “WiFiWebClient”
将WiFi连线的相关讯息,如下图中黄色标注的地方进行对应的修改。
4、程序如下
#include <WiFi.h>
char ssid[] = "xxxx"; // your network SSID (name)
char pass[] = "xxxx"; // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key Index number (needed only for WEP)
int status = WL_IDLE_STATUS;
IPAddress server(153,3,238,102); // numeric IP for Google (no DNS)
//char server[] = "www.baidu.com"; // name address for Google (using DNS)
WiFiClient client;
void setup() {
Serial.begin(115200);
while (!Serial) {
;
}
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
while (true);
}
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000);
}
Serial.println("Connected to wifi");
printWifiStatus();
Serial.println("\nStarting connection to server...");
if (client.connect(server, 80)) {
Serial.println("connected to server");
client.println("GET /search?q=ameba HTTP/1.1");
client.println("Host: www.baidu.com");
client.println("Connection: close");
client.println();
}
delay(100);
}
void loop() {
while (client.available()) {
char c = client.read();
Serial.write(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting from server.");
client.stop();
while (true);
}
}
void printWifiStatus() {
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
5、程序使用到下面的API函数:
在连线WiFi时会使用到WiFi.begin();
连线成功后会读取WiFi的信息:显示WiFi的名称WiFi.SSID()
显示WiFi的讯号强度WiFi.RSSI()
显示Ameba的IP信息WiFi.localIP()
建立一个Client: WiFiClient()
客户端通过服务器的IP和端口连线client.connect()
向服务器对发送数据并开启新的一行 client.println()
判断是否有数据从服务器端发送过来client.available()
客户端读取数据client.read()
客户端断开与服务器的连线client.stop()
四、运行结果
显示运行结果如下:
- 2024-02-21
-
发表了主题帖:
【安信可BW16-Kit开发板】DHT11应用
【安信可BW16-Kit开发板】DHT11应用
按照安信可BW16-Kit开发板官方介绍,此款开发版支持Linux、Arduino IDE、Python开发环境。Linux、Arduino IDE开发环境搭建已经有很多文章介绍,这里就不在赘述。本文重点介绍Python开发环境搭建及程序烧录。
一、DHT11介绍
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,内部由一个 8 位单片机控制一个电阻式感湿元件和一个 NTC 测温元件。其温度测量范围为 0~50℃,误差在±2℃;湿度的测量范围为 20%~90%RH,误差在±5%RH。DHT11 电路很简单,只需要将 DATA 引脚连接单片机的一个 I/O 即可,不过该引脚需要上拉一个 5K 的电阻,DHT11 的供电电压为 3~5.5V。
1、DHT11引脚说明
pin
名称
注释
1
VDD
供电3~5V
2
DATA
串行数据,单总线
3
NC
空脚
4
GND
接地,电源负极
2、传感器性能参数
参数
条件
Min
Type
Max
单位
湿度
分辨率
1
1
1
%RH
8
Bit
重复性
±1
%RH
精度
25℃
±4
%RH
0~25℃
±5
%RH
互换性
可完全互换
量程范围
0℃
30
90
%RH
25℃
20
90
%RH
50℃
20
80
%RH
响应时间
1/e(63%)25℃,
1m/s空气
6
10
15
S
迟滞
±1
%RH
长期稳定性
典型值
±1
%RH/yr
温度
分辨率
1
1
1
℃
8
8
8
Bit
重复性
±1
℃
精度
±1
±2
℃
量程范围
0
50
℃
响应时间
1/e(63%)
6
30
S
3、接口说明
建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。DHT11的供电电压为3-5.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。
4、MCU连接示意图
5、串行接口(单线双向)
DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零。操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
二、运行范例
1、Arduino环境下程序如下
#include "DHT.h"
#define DHTPIN 8
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
Serial.println(F("DHTxx test!"));
dht.begin();
}
void loop() {
// Wait a few seconds between measurements.
delay(2000);
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
float hif = dht.computeHeatIndex(f, h);
float hic = dht.computeHeatIndex(t, h, false);
Serial.print(F("Temperature: "));
Serial.print(hic);
Serial.print(F(" ℃ "));
Serial.print(F("Humidity: "));
Serial.print(hif);
Serial.println(F(" ℉"));
}
2、运行结果
显示运行结果如下:
三、总结
从上面示例我们可以看出,在Arduino环境下可以很容易对安可信BW16-Kit进行二次开发。
- 2024-02-12
-
发表了主题帖:
【安信可BW16-Kit开发板】Python开发环境搭建
【安信可BW16-Kit开发板】Python开发环境搭建
按照安信可BW16-Kit开发板官方介绍,此款开发版支持Linux、Arduino IDE、Python开发环境。Linux、Arduino IDE开发环境搭建已经有很多文章介绍,这里就不在赘述。本文重点介绍Python开发环境搭建及程序烧录。
一、开发环境搭建
1、首先进入官网Ameba MicroPython – Realtek IoT/Wi-Fi MCU Solutions (amebaiot.com),找到BW16 Type C (Ameba RTL8720DN)位置,详细阅读入门指南。
2、进入指南Ameba MicroPython: Getting Started with BW16 Type C – Realtek IoT/Wi-Fi MCU Solutions (amebaiot.com),阅读指南中的《设置开发环境》内容,主要是安装python环境。
3、固件烧录
步骤1: 找到“Firmware_and_DownloadTool.zip”文件夹
从 https://github.com/ambiot/micropython 点击 Releases 选项。
您将能够找到如下图所示的资料夹。
点击下载,解压缩资料夹,找到名为“Images”文件夹下的“BW16”文件夹,有4个.bin文件。
步骤2: 打开串口终端
通过type C将BW16-Kit连接上PC,按下“RST”不要松开,再按住“Burn”按钮,然后依次松开“RST”和“Burn”按钮,此时开发板进入下载模式,串口中断显示内容如下:
步骤3: 上传固件
下载固件烧录软件BW16-flash_tool,运行ImageTool.exe工具软件,并按照图中所标步骤进行,第1步芯片选择8721,COM口依据实际选择,波特率选115200,点击OPEN按钮,显示CLOSE,选择需要上传的.BIN文件(步骤1下载解压的文件),点击DOWNLOAD按钮,上传成功后,您会看到屏幕上打印一行 – “All images are sent successfully”。大约需要3~5分钟。
步骤4: 运行
上传成功后,按下“RST”按钮,在串口终端显示如下内容,说明python环境搭建成功。
二、运行WiFi扫描范例
步骤1: 打开 python IDE,配置选项
第一次使用时要进行设置项,进行配置,点击“工具”à“设置”,如下图:
配置完毕后重启BW16。
步骤2:运行示例
在命令窗口中输入如下代码:
from wireless import WLAN
wifi = WLAN(mode = WLAN.STA)
wifi.scan()
点击运行按钮,显示运行结果如下:
三、总结
通过对python开发环境的搭建,我们可以使用python对安可信BW16-Kit进行二次开发,由于python的便捷性和低代码特点,使得开发更简单。
- 2024-01-28
-
发表了主题帖:
【安信可BW16-Kit开发板】开箱报告
【安信可BW16-Kit开发板】开箱报告
首先真诚感谢eeword、安信可给了我这次参与《安信可BW16-Kit开发板》评测的机会。打开快递,取出安信可BW16-Kit开发板,第一感觉是小巧,质量优。
一、硬件配置介绍
BW16-Kit 开发板是安信可针对BW16 模组而设计的一款核心开发板,该开发板引出全部I/O 至两侧的排针,板载RGB 七彩灯,开发者也可以根据自己的需求连接外设。
BW16 是基于RTL8720DN 开发的双频Wi-Fi+蓝牙SoC 模组。它支持双频(2.4GHz或5GHz)WLAN 和低功耗蓝牙5.0;并且集成了ARM V8(兼容Cortex-M4F)高性能MCU、ARM V8M(兼容Cortex-M0)低功耗MCU、WLAN(802.11 a/b/g/n)、MAC,蓝牙基带和RF 基带,最后还提供了一组可配置的GPIO 口,用于不同外围设备的控制。
BW16 同时集成了内部存储器,支持简单的应用程序开发,可实现完整的Wi-Fi 和BT5.0协议功能。
主要参数:
支持802.11a/b/g/n 1x1,2.4GHz or 5GHz
支持HT20/HT40 模式
支持低功耗信标监听模式,低功耗接收模式,低功耗挂起模式
内置AES/DES/SHA 硬件引擎
支持TrustZone-M,支持安全启动
支持SWD 调试端口访问保护和禁止模式
支持BLE 和BT5.0
蓝牙支持高功率模式(7dBm,与Wi-Fi 共享同一PA)
Wi-Fi 和BT 共用同一天线
支持STA/AP/STA+AP 工作模式
支持安卓、IOS 的Simple Config(APP)/AirKiss(微信) 一键配网
支持串口本地升级和远程固件升级(FOTA)
通信接口:1个SPI,2个UART,1路ADC,3路PWM,1个I2C,1个Type-C接口
二、开发板硬件
原理图
图1 BW16-Kit 开发板原理图
开发板实物及引脚
图2 BW16-Kit 开发板实物正面
图3 BW16-Kit 开发板实物背面
图4 BW16-Kit 开发板及模块引脚图
三、上电运行
使用type_C USB连线与PC连接,打开串口终端程序,按下RST键,便可得到如图5所示界面,表明BW16-Kit 开发板运行正常。此时打开手机,运行蓝牙AAP,便可搜索到名为:U-EWHCB66的蓝牙设备,见图6。
图5 BW16-Kit 开发板连接PC通信界面
图6 BW16-Kit 开发板与手机蓝牙APP连接界面
- 2024-01-12
-
回复了主题帖:
【入围名单】: 安信可BW16-Kit
收到 ,地址没有错,请发货
- 2023-12-16
-
加入了学习《华为IOT物联网教程》,观看 W25Q64串行flash实验-QSPI
- 2023-10-26
-
发表了主题帖:
基于max6675的分布式温度测量系统设计
本帖最后由 宜城龙山 于 2023-10-26 11:09 编辑
基于max6675的分布式温度测量系统设计
热电偶作为一种主要的测温元件,具有结构简单、制造容易、使用方便、测温范围宽、测温精度高等特点。但是将热电偶自身存在以下不足:①非线性:热电偶输出热电势与温度之间的关系为非线性关系,故在应用时须进行线性化处理。②冷补偿:热电偶输出的热电势为冷端保持为0℃时与测量端的电势差值,实际应用时冷端的温度会随着环境温度的变化而变化,因此需进行冷端补偿。③输出量值小:热电偶的输出为模拟小信号,通常在mv量级,不能直接与MCU连接,需经线性放大后经AD转换后输入到MCU进行处理。因此,在工业应用中通常做法是:先将热电偶的输出信号经运放对信号放大、A/D转换送入MCU,在使用分段查表线性化、温度补偿等软件处理后,能获得所需的结果,不仅软硬件设计复杂,而且系统误差较大,给一般使用者带来较大的难度。工程开发人员迫切需求一款集信号采集放大、冷端补偿、线性化及数字化输出功能的热电偶温度转换单芯片。
ADI公司推出的MAX6675即是一款集成了热电偶放大器、冷端补偿、A/D转换及SPI串口通信的热电偶温度转换芯片。
1、性能特点
MAX6675的主要特性如下:
通信接口:SPI串行口输出温度值
测温范围:0℃~+1024℃
分辨率:12位,0.25℃
冷端补偿:片内
输入方式:高阻抗差动
电源电压:单一+5V
工作温度范围:-20℃~+85℃
ESD:2000V
具有热电偶断线检测功能
该器件采用8引脚SO帖片封装。引脚排列如图1所示,引脚功能如表1所列。
图1 MAX6675 引脚图
表1 MAX6675 引脚功能
序号
名 称
功 能
1
GND
接地端
2
T-
K型热电偶负极
3
T+
K型热电偶正极
4
VCC
电源正
5
SCK
时钟信号输入端
6
片选信号,
为低时启动串行口
7
SO
串行数据输出端
8
N.C.
空引脚
2、工作原理
MAX6675的内部结构如图2所示。内部主要由信号调节放大器(A1、A2)、12位的模拟/数字转换器(ADC)、冷端补偿传感和校正(COLD_JUNCTION COMPENSATION DIODE)、数字控制器(DIGTAL CONTROLLER)、1个SPI兼容接口及相关的逻辑控制。
图2 MAX6675 内部结构图
2.1 温度变换
MAX6675的T+和T-输入端连接到低噪声放大器A1,以保证检测输入的高精度,同时可起到将热电偶连接导线与干扰源隔离的作用。热电偶输出的热电势经低噪声放大器A1放大,再经过A2电压跟随器缓冲后,被送至ADC的输入端。在将温度电压值转换为对应的温度值之前,需要对热电偶的冷端温度进行补偿,冷端温度即是MAX6675周围温度与0℃实际参考值之间的差值。对于K型热电偶,电压变化率为41μV/℃,输出电压可由下面的线性公式来近似热电偶的输出电压值:
Vout=41×(tR-tAMB)
上式中,Vout为热电偶输出电压(mV),tR是测量点温度;tAMB是周围温度。
2.2 冷端补偿
热电偶是通过检测热、冷两端温度的差值,其节点温度可在0℃~+1023.75℃范围变化。冷端即安装MAX6675的电路板周围温度,其温度变化范围在-20℃~+85℃内。当冷端温度波动时,需要通过补偿来消除检测误差。
MAX6675是通过内部的温度检测二极管将周围温度转换为温度补偿电压,并与电偶电压一起送到ADC中转换,以计算热电偶的热端温度。当热电偶的冷端与芯片温度相等时,MAX6675可获得最佳的测量精度。因此在实际测温应用时,应尽量避免在MAX6675附近放置发热器件或元件,因为这样会造成冷端误差。
2.3 噪声补偿
MAX6675的测量精度对电源耦合噪声较敏感。为降低电源噪声影响,可在MAX6675的电源引脚附近接入1只0.1μF陶瓷旁路电容。
2.4 SPI串行接口
MAX6675采用标准的SPI串行外设总线与MCU接口如图3所示,且MAX6675只能作为从设备。MAX6675 SO端输出温度数据的格式如图4所示,MAX6675 SPI接口时序如图5所示。依据MAX6675手册可知,MAX6675从SPI串行接口输出数据的过程如下:MCU使CS变低并提供时钟信号给SCK,由SO读取测量结果。CS变低将停止任何转换过程;CS变高将启动一个新的转换过程。一个完整串行接口读操作需16个时钟周期,在时钟的下降沿读16个输出位,第1位和第15位是一伪标志位,并总为0;第14位到第3位为以MSB到LSB顺序排列的转换温度值;第2位一般为低,当热电偶输入端开路时为高,因此,可依据该位检测热电偶输入端是否开路;第1位为低以提供MAX6675器件身份码,第0位为三态。
图3 MAX6675 与MCU连接示意图
位
空标志位
12位温度值
热电偶输入
设备身份
状态
位
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
MSB
LSB
图4 MAX6675 SO端输出数据的格式
图5 MAX6675 SPI接口时序
3、 测温应用
下面给出MAX6675应用于嵌入式系统的具体方法。我们在实际开发应用过程中,需要进行多点温度测量,考虑到系统测量误差的一致性,这里我们选择多路开关控制测量端热电偶的接入,变换电路采用单片MAX6675,主控MCU选择沁恒CH32V307VCT6,图6给出MAX6675与MCU构成的测温电路,及相应的温度值读取、转换程序。
MAX6675与CH32V307VCT6 MCU的接口电路如图6所示。
图6 MAX6675与CH32V307VCT6 MCU的接口电路图
本例使用CH32V307VCT6 MCU的SPI1总线接口与MAX6675进行通信,PA5为SPI1的串行时钟输出端(SCK),PA6为SPI1的串行数据输入端(MISO), PA4为MAX6675的片选信号(
),TCS0、TCS1、TCS2为多路开关的选择信号,000~111分别对应1~8号热电偶。由于涉及到一些商业问题,图中仅给出MAX6675的信号连接部分,请谅解。
下面给出相应的温度值读取程序及数据转换程序。SPI_MAX6675_Init()为SPI1端口初始化函数,MAX6675_ReadByte()为读SPI端口数据函数,Get_max6675temp()为温度读取转换函数。程序运行结果如图7。
图7 运行结果
4 总结
由以上实例,我们可以看出,MAX6675具有电路设计简单、使用方便、可扩展性好等特点,但我们也应该看到MAX6675也有自身的不足,单此转换时间较长,按照手册说明要求,转换时间大于0.2S。因此,对于一些高速场景不太适合。整体来说,MAX6675是一款高性价比的K型热电偶温度转换芯片。
MAX6675_SP.c
#include <MAX6675_SP.h>
#include "stdio.h"
#include "ch32v30x.h"
max6675_read Read_max6675_temp;
uint8_t MAX6675_ReadByte(uint8_t cc);
//MAX6675初始化
void SPI_MAX6675_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
/* 使能 SPI1 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);
/* ---------通信I/O初始化----------------
* PA5-SPI1-SCK :MAX6675_SCK
* PA6-SPI1-MISO:MAX6675_SO
* PA7-SPI1-MOSI:MAX6675_SI
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* ---------控制I/O初始化----------------*/
/* PA4-SPI1-NSS:MAX6675_CS */ // 片选
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推免输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_4); // 先把片选拉高,真正用的时候再拉低
/* SPI1 配置 */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
/* 使能 SPI1 */
SPI_Cmd(SPI1, ENABLE);
printf("max6675 Init Ok! \r\n");
}
//读数据
uint8_t MAX6675_ReadByte(uint8_t cc)
{
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, 0xff);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}
//读温度
/*
********************************************************************************
** [url=home.php?mod=space&uid=32621]@name[/url] : Get_max6675temp
** @函数功能 : 获取MAX6675读取的热电偶的值
** @函数说明 :K型热电偶读取函数
** @输入参数 :K型热电偶读取函数
** @输出参数 :成功返回TRUE 否者热电偶
********************************************************************************
*/
float Get_max6675temp()
{
uint8_t c=0x00,flag;
u16 i,t;
float temprature;
Read_max6675_temp.readtemp_timer = 0;
MAX6675_CSL();
c = MAX6675_ReadByte(c);
i = c;
i = i<<8;
c = MAX6675_ReadByte(c);
MAX6675_CSH();
i = i|c; //i是读出来的原始数据
flag = i&0x04; //flag保存了热电偶的连接状态
t = i>>3;
temprature =(float)1023.75*t/4096;
if(i!=0) //max6675有数据返回
{
if(flag==0) //热电偶已连接
{
printf("temperature: %4.2f \r\n",temprature);
}
}
else //max6675没有数据返回
{
printf("The thermocouple is not connected\r\n");
}
return temprature;
}
MAX6675_SP.h
#ifndef _MAX6675_H
#define _MAX6675_H
#include "stdio.h"
#define MAX6675_CS_PORT GPIOA
#define MAX6675_CS_PIN GPIO_Pin_4
#define MAX6675_CSL() GPIO_ResetBits(MAX6675_CS_PORT, MAX6675_CS_PIN)
#define MAX6675_CSH() GPIO_SetBits(MAX6675_CS_PORT, MAX6675_CS_PIN)
void SPI_MAX6675_Init(void);
float Get_max6675temp();
#endif
- 2023-10-11
-
回复了主题帖:
测评入围名单:中微电钻/扳手开发板(CMS32M6534E+CMS130S040P56B)
按照要求按时完成测试任务。信息准确无误。