第7章 低成本 Modbus 傳感器的實(shí)現(xiàn)
7.1 硬件資源介紹與接線(xiàn)
我們的 Modbus 傳感器開(kāi)發(fā)套件共有三個(gè), 三個(gè)板子的使用的主控方案是 STM32F030芯片,硬件接口資源如下圖所示:
開(kāi)關(guān)量模塊
溫濕度變送器模塊
環(huán)境檢測(cè)模塊
7.2 開(kāi)發(fā)環(huán)境搭建
在前面我們已經(jīng)安裝了 Keil MDK、STM32CubeMX、STM32CubeProgrammer、ST-Link 驅(qū) 動(dòng)、 CH340 驅(qū)動(dòng)。因此在這里我們只需給 Keil MDK 安裝 STM32F030 對(duì)應(yīng)的 PACK 即可對(duì)改 芯片進(jìn)行編碼開(kāi)發(fā)。
安裝 PACK 的方法有兩種:
- 第一種方法:雙擊運(yùn)行開(kāi)發(fā)板配套資料中的 Pack 安裝包,隨后彈出安裝界面,按照默 認(rèn)選項(xiàng)進(jìn)行安裝即可。:
- 第二種方法,在線(xiàn)安裝, 下面演示如何在線(xiàn)安裝。
打開(kāi)Keil之后, 點(diǎn)擊如下按鈕啟動(dòng)“Pack Installer”:
使用 “Pack Installer” 可 以 方 便 的 對(duì) Pack 安 裝 和 管 理 。 在 左 上 角 搜 索 框 輸 入 “STM32F030”,展開(kāi)搜索結(jié)果,可以看到STM32F030CC,點(diǎn)擊右邊的簡(jiǎn)介鏈接即可跳轉(zhuǎn) 到Pack下載頁(yè)面,如下圖所示。
如果跳轉(zhuǎn)網(wǎng)頁(yè)無(wú)法打開(kāi),可直接打開(kāi) Pack 下載總?cè)肟冢╳ww.keil.com/dd2/Pack/)。 進(jìn)入 Pack 下載總?cè)肟诤螅阉鳌癝TM32F030”,找到“STM030CCT”點(diǎn)擊, 如下圖所示(實(shí) 測(cè)部分網(wǎng)絡(luò)環(huán)境打開(kāi)該鏈接無(wú) Pack 列表,請(qǐng)嘗試換個(gè)網(wǎng)絡(luò)環(huán)境測(cè)試,仍舊不行則使用配 套資料 Pack)。
點(diǎn)擊會(huì)跳轉(zhuǎn)到 pack 包界面,點(diǎn)擊右上角的”STM32F0xxDFP“即可跳轉(zhuǎn)到 pack 包下載界面,點(diǎn)擊右上角”STM32F0xxDFP“處即可下載 pack 包,如下圖所示。
下載完成得到“Keil.STM32F0xx_DFP.2.1.1.pack”,直接雙擊該文件,隨后彈出安裝界 面,按照默認(rèn)選項(xiàng)進(jìn)行安裝即可。
7.3 創(chuàng)建與體驗(yàn)第 1 個(gè)工程
7.3.1 創(chuàng)建工程
啟動(dòng) STM32CubeMX 后,點(diǎn)擊如下圖標(biāo)開(kāi)始選擇 MCU:
如下圖輸入型號(hào)“STM32F030CCT”,雙擊找到的芯片, 開(kāi)始創(chuàng)建工程:
調(diào)高 CPU 頻率:
配置工程, 如下操作:
指定代碼生成方法, 如下:
7.3.2 配置調(diào)試器
新建的工程要配置調(diào)試器,參考《2.2.3 配置調(diào)試器》 。
然后就可以編譯程序、燒寫(xiě)運(yùn)行了。
7.3.3 配置 GPIO 操作 LED
打開(kāi)位于“5_硬件資料?1_開(kāi)發(fā)板原理圖STM32F030CCT6_SWITCH_V11.pdf”的原理圖 文件。
根據(jù)開(kāi)發(fā)板原理圖可以看到 F030的LED 引腳圖如下:
可以雙擊打開(kāi)工程中如下文件進(jìn)入STM32CubeMX進(jìn)行配置:
然后如下配置 PB11 、PB12 、PB13 為輸出引腳:
點(diǎn)擊右上角的 “GENERATE CODE”按鈕后打開(kāi)工程。
在main函數(shù)的循環(huán)里, 增加如下代碼:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* set LED output high */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET); //LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); //LED2
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET); //LED3
HAL_Delay(500);
/* set LED output low */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); //LED2
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET); //LED3
HAL_Delay(500);
}
最后編譯、燒寫(xiě)、運(yùn)行, 可以看到開(kāi)發(fā)板的 LED 閃爍。
7.4 UART 編程
7.4.1 使用 STM32CubeMX 進(jìn)行配置
本節(jié)源碼為“3_程序源碼?1_視頻配套的源碼7-5_STM32F030串口編程demo”。 RS4385接口原理圖如下:
需要在STM32CubeMX里配置UART1,并且配置PA8為輸出引腳。
1.UART1
先使能 UART1:
然后使能中斷:
在前面STM32H5的UART程序里使用了DMA,本節(jié)故意不使用DMA而使用純中斷來(lái) 實(shí)現(xiàn)UART,多學(xué)一種編程方法。
2.配置 RS485方向引腳
STM32H5主控板上使用的RS485轉(zhuǎn)換芯片是MAX13487EESA,它會(huì)自動(dòng)切換發(fā)送、 接收方向,無(wú)需程序進(jìn)行方向的控制。使用STM32F030制作的“廉價(jià)傳感器”里,使用 的RS485轉(zhuǎn)換芯片是SIT3088ETK,它需要使用一個(gè)GPIO來(lái)控制方向,如下圖所示:
上圖中,RS485_CTRL使用的引腳是PA8,所以還需要把它配置為輸出引腳,輸出低 電平(讓SIT3088ETK默認(rèn)為接收狀態(tài)) 。如下配置:
7.4.2 封裝 UART
本節(jié)源碼為“3_程序源碼?1_視頻配套的源碼7-5_STM32F030串口編程demo”。 現(xiàn)場(chǎng)編程。
7.4.3 上機(jī)實(shí)驗(yàn)
本節(jié)源碼為“3_程序源碼?1_視頻配套的源碼7-6_STM32F030 串口測(cè)試”,里面有 2 個(gè)程序:h5_demo、f030_demo。
要測(cè)試 STM32F030 的串口, 只需要把它的 485 接口連接到 PC 去就可以了,但是我們沒(méi) 有 PC 上使用的“USB 轉(zhuǎn) 485”模塊,所以使用 STM32H5 來(lái)實(shí)現(xiàn)一個(gè)“USB 轉(zhuǎn) 485 模塊”:
- 它從 USB 串口讀到數(shù)據(jù),再?gòu)?485 接口發(fā)送出去;
- 它從 485 接口讀到數(shù)據(jù),再?gòu)?USB 串口發(fā)送給 PC。
1. 硬件連接
2. STM32H5 程序改造
本節(jié)源碼為“3_程序源碼?1_視頻配套的源碼7-6_STM32F030串口測(cè)試h5_demo”。
3.STM32F030程序調(diào)試
本節(jié)源碼為“3_程序源碼?1_視頻配套的源碼7-6_STM32F030串口測(cè)試f030_demo”。
7.5 libmodbus 移植
本節(jié)源碼為“3_ 程序源碼?1_ 視頻配套的源碼7-7_STM32F030 上libmodbus 移植 f030_demo”。
7.5.1 移植 libmodbus
把“7-6_STM32F030串口測(cè)試h5_demodemoMiddlewaresThird_Partylibmodbus”整 個(gè)目錄復(fù)制到f030_demo中。
在Keil工程中添加代碼, 如下:
7.5.2 使用 modbus 控制設(shè)備
STM32F030作為從設(shè)備(sever),編寫(xiě)“CoreSrcfreertos.c”:
7.5.3 上機(jī)實(shí)驗(yàn)
7.6 傳感器設(shè)計(jì)
7.6.1 設(shè)計(jì)思路
上位機(jī)(PC 軟件)或中控(STM32H5)通過(guò) modbus 協(xié)議訪(fǎng)問(wèn) STM32F030 傳感器時(shí),讀 寫(xiě)的是 STM32F030 分配出來(lái)的 4 個(gè)類(lèi)型的緩沖區(qū)。這里需要解決 2 個(gè)問(wèn)題:
- 這 4 個(gè)類(lèi)型的緩沖區(qū)起始地址、大小分別是多少? 這根據(jù)傳感器的功能來(lái)設(shè)置。比如有 2 個(gè)按鍵,那么就可以分配 2 個(gè)“只讀的位寄存器”(DI)。
- 這些寄存器的值, 如何跟硬件對(duì)應(yīng)? 比如上位機(jī)讀 DI 寄存器時(shí), 誰(shuí)提供這些值?傳感 器的程序應(yīng)該讀取按鍵值,填充 DI 寄存器。
第 1 個(gè)步驟,被稱(chēng)為“點(diǎn)表設(shè)計(jì)”。
7.6.2 三款傳感器功能及所用引腳
這 3 款傳感器的原理圖在網(wǎng)盤(pán)如下目錄里:
它們控制外設(shè)所用的引腳,列表如下:
功能 | 使用的引腳 | 描述 | 寄存器類(lèi)別 | |
---|---|---|---|---|
ENV_MONITOR 環(huán)境監(jiān)測(cè)模塊 | BEEP1 | PB15 | 高電平發(fā)聲 | DO |
BEEP2 | PB14 | 高電平發(fā)聲 | DO | |
LED1 | PB11 | 低電平發(fā)光 | DO | |
LED2 | PB12 | 低電平發(fā)光 | DO | |
LED3 | PB13 | 低電平發(fā)光 | DO | |
OPTO_ADC | PA1 | 電壓值跟光強(qiáng)成反比 | AI | |
RES_ADC | PA2 | 電壓值跟可調(diào)電阻成反比 | AI | |
SWITCH開(kāi)關(guān)量模塊 | KEY1 | PA3 | 低電平表示被按下 | DI |
KEY2 | PA4 | 低電平表示被按下 | DI | |
KEY3 | PA5 | 低電平表示被按下 | DI | |
K1_CTRL | PB5 | 高電平使能繼電器 | DO | |
K2_CTRL | PB4 | 高電平使能繼電器 | DO | |
LED1 | PB11 | 低電平發(fā)光 | DO | |
LED2 | PB12 | 低電平發(fā)光 | DO | |
LED3 | PB13 | 低電平發(fā)光 | DO | |
TEMP_HUMI溫濕度模塊 | BEEP1 | PB15 | 高電平發(fā)聲 | DO |
BEEP2 | PB14 | 高電平發(fā)聲 | DO | |
LED1 | PB11 | 低電平發(fā)光 | DO | |
LED2 | PB12 | 低電平發(fā)光 | DO | |
LED3 | PB13 | 低電平發(fā)光 | DO | |
I2C1_SCL | PB6 | 可以讀到溫度、濕度 AI | AI | |
I2C2_SDA | PB7 | 可以讀到溫度、濕度 AI | AI |
7.6.3 點(diǎn)表設(shè)計(jì)
所謂點(diǎn)表, 就是一個(gè) modbus 設(shè)備,它的地址是什么? 它里面 4 類(lèi)寄存器的地址、功能 是什么。
在查看點(diǎn)表時(shí),經(jīng)常碰到“遙測(cè)、遙信、遙控、遙調(diào)”的概念。它們實(shí)質(zhì)上就是前面 講解 modbus 時(shí)引入的“AI、DI、DO、AO”。這些概念起源于電力系統(tǒng)。
電力領(lǐng)域中四遙系統(tǒng)是指遙測(cè)、遙信、遙控、遙調(diào)功能系統(tǒng), 四遙功能是電力監(jiān)控系 統(tǒng)最基本最重要的功能。具體來(lái)說(shuō):
- 遙測(cè)(遙測(cè)信息,AI):遠(yuǎn)程測(cè)量;遠(yuǎn)方測(cè)量顯示諸如電流、電壓、功率、壓力、溫度等 模擬量;
- 遙信(遙信信息,DI):遠(yuǎn)程信號(hào);遠(yuǎn)方監(jiān)視各類(lèi)電氣開(kāi)關(guān)和設(shè)備、機(jī)械設(shè)備的工作狀態(tài) 和運(yùn)轉(zhuǎn)情況狀態(tài)等;
- 遙控(遙控信息,DO):遠(yuǎn)程控制;接受并執(zhí)行遙控命令,遠(yuǎn)方控制或保護(hù)電氣設(shè)備及電 氣機(jī)械化的分合起停等工作狀態(tài);
- 遙調(diào)(遙調(diào)信息,AO):遠(yuǎn)程調(diào)節(jié);接受并執(zhí)行遙調(diào)命令,遠(yuǎn)方設(shè)定及調(diào)整所控設(shè)備的工 作參數(shù)、標(biāo)準(zhǔn)參數(shù);四遙遙測(cè)、遙信、遙控、遙調(diào)常常被簡(jiǎn)稱(chēng)為 AI、DI、DO、AO。
AI、DI、DO、AO 都是英文名稱(chēng)的首字母縮寫(xiě),A 的英文全稱(chēng) Analog (模擬量)、D 的英 文全稱(chēng) Digital (數(shù)字量) 、I 的英文全稱(chēng) Input (輸入)、O 的英文全稱(chēng) Output (輸出)。 因此, AI 表示的是模擬信號(hào)輸出, AO 是模擬信號(hào)輸入,DI 是數(shù)字信號(hào)輸入, DO 是數(shù)字信 號(hào)輸出。
隨著技術(shù)不斷地進(jìn)步,現(xiàn)在也有五遙的說(shuō)法, 即在四遙的基礎(chǔ)上加上遙視, 遙視指的 是指利用包括電子技術(shù)、計(jì)算機(jī)技術(shù)、自動(dòng)化技術(shù)等監(jiān)視并記錄設(shè)備運(yùn)行情況和環(huán)境安全 情況。因此伴隨著技術(shù)發(fā)展, 電力系統(tǒng)中從一遙(遙信 DI)階段、發(fā)展到二遙(遙信 AI、 遙測(cè) DI)、三遙(遙信 AI、遙測(cè) DI 和遙控 DO)、四遙(遙信 AI、遙測(cè) DI、遙控 DO 和遙 調(diào) AO);現(xiàn)在開(kāi)始四遙向五遙過(guò)渡。
原文鏈接:https://blog.csdn.net/LuohenYJ/article/details/106027626
在閱讀點(diǎn)表時(shí),還會(huì)碰到下表中的“PLC/組態(tài)地址”,或者表中的簡(jiǎn)稱(chēng)“0x、1x、4x、 3x”, 它們的本質(zhì)都是用來(lái)分辨“AI、AO、DI、DO”四類(lèi)寄存器:
寄存器種類(lèi) | PLC/組態(tài)地址 | Modbus 寄存器地址范圍 | 簡(jiǎn)稱(chēng) | 讀寫(xiě)狀態(tài) |
---|---|---|---|---|
線(xiàn)圈狀態(tài) | 00001~09999 | 0000H~FFFFH | 0x | 可讀可寫(xiě) |
離散輸入狀態(tài) | ~10001 19999 | 0000H~FFFFH | 1x | 只讀 |
保持寄存器 | 40001~49999 | 0000H~FFFFH | 4x | 可讀可寫(xiě) |
輸入寄存器 | ~30001 39999 | 0000H~FFFFH | 3x | 只讀 |
點(diǎn)表的設(shè)計(jì),是完全由開(kāi)發(fā)人員自行定義的。
1.開(kāi)關(guān)量模塊(SWITCH)
寄存器說(shuō)明:
設(shè)備地址 | 寄存器地址 | 寄存器類(lèi)別 | 用途 | 描述 |
---|---|---|---|---|
01H | 0000H | DI | 讀取按鍵 KEY1 | 1-被按下 |
0001H | DI | 讀取按鍵 KEY2 | 1-被按下 | |
0002H | DI | 讀取按鍵 KEY3 | 1-被按下 | |
0000H | DO | 控制繼電器 1 | 1-吸合 | |
0001H | DO | 控制繼電器 2 | 1-吸合 | |
0002H | DO | 控制 LED1 | 1-亮 | |
0003H | DO | 控制 LED2 | 1-亮 | |
0004H | DO | 控制 LED3 | 1-亮 |
2. 環(huán)境監(jiān)測(cè)模塊(ENV_MONITOR)
寄存器說(shuō)明:
設(shè)備地址 | 寄存器地址 | 寄存器類(lèi)別 | 用途 | 描述 |
---|---|---|---|---|
02H | 0000H | DO | 控制蜂鳴器 1 | 1-響 |
0001H | DO | 控制蜂鳴器 2 | 1-響 | |
0002H | DO | 控制 LED1 | 1-亮 | |
0003H | DO | 控制 LED2 | 1-亮 | |
0004H | DO | 控制 LED3 | 1-亮 | |
0000H | AI | 讀取光敏電壓 | 0xfff 對(duì)應(yīng) 3.3V12 位精度 | |
0001H | AI | 可調(diào)電阻器電壓 | 0xfff 對(duì)應(yīng) 3.3V12 位精度 |
- 溫濕度模塊(TEMP HUMI)
設(shè)備地址 | 寄存器地址 | 寄存器類(lèi)別 | 用途 | 描述 |
---|---|---|---|---|
03H | 0000H | DO | 控制蜂鳴器 1 | 1-響 |
0001H | DO | 控制蜂鳴器 2 | 1-響 | |
0002H | DO | 控制 LED1 | 1-亮 | |
0003H | DO | 控制 LED2 | 1-亮 | |
0004H | DO | 控制 LED3 | 1-亮 | |
0000H | AI | 讀取溫度 | 單位 0.1 攝氏度 16 位有符號(hào)整數(shù) | |
0001H | AI | 讀取濕度 | 單位 0.1%RH16 位有符合整數(shù) |
7.6.4 開(kāi)關(guān)量傳感器程序設(shè)計(jì)
繼電器原理圖如下:
繼電器對(duì)外的信號(hào)有 3 個(gè):
- COM:公共端,通常是中間的觸點(diǎn), 與常開(kāi)或常閉觸點(diǎn)相連
- NC(Normally Closed): 常閉接口,繼電器吸合前與 COM 連接, 吸合后懸空
- NO(Normally Open): 常開(kāi)接口, 繼電器吸合前懸空, 吸合后與 COM 連接
開(kāi)路即通路、斷路,閉合指的是開(kāi)關(guān)閉合,也就是說(shuō), 在沒(méi)有任何上電之類(lèi)的動(dòng)作時(shí), NC 和 COM 端相當(dāng)于已經(jīng)連通。
本節(jié)源碼為“ 3_ 程 序源 碼?1_ 視 頻配套 的 源 碼7-9_ 開(kāi) 關(guān) 量 傳 感 器 程序 設(shè) 計(jì) f030_demo”。
7.6.5 環(huán)境監(jiān)測(cè)傳感器程序設(shè)計(jì)
1. 硬件電路
光敏電路如下, 光照越強(qiáng),U6 阻值越低,OPTO_ADC 電壓值就越低:
可調(diào)電阻器如下,R33 阻值越大,RES_ADC 電壓值越?。?/p>
本節(jié)源碼為“3_ 程序源碼?1_ 視頻配套的源碼7-10_ 環(huán)境監(jiān)測(cè)傳感器程序設(shè)計(jì) f030_demo”。
2. 配置 GPIO 和 ADC
先在STM32CubmeMX里配置GPIO和ADC 引腳,使能“Discontinuous Conversion Mode ”:
3. 讀取 ADC 的關(guān)鍵代碼
// 1. 檢驗(yàn)
HAL_ADCEx_Calibration_Start(&hadc) ;
// 啟動(dòng)、讀2次數(shù)值
for (int i = 0; i < 2; i++)
{
HAL_ADC_Start(&hadc);
if (HAL_OK == HAL_ADC_PollForConversion(&hadc, 100))
{
mb_mapping- >tab_input_registers[i] = HAL_ADC_GetValue(&hadc);
}
}
7.6.6 溫濕度傳感器程序設(shè)計(jì)
本節(jié)源碼為“ 3_ 程序源碼?1_ 視頻配套 的源碼7-11_ 溫濕度傳感器程序設(shè)計(jì) f030_demo”。
1. 硬件電路與操作方法
原理圖如下:
AHT20 芯片資料在網(wǎng)盤(pán)如下目錄:
AHT20 操作方法如下:
詳解如下:
- 發(fā)送測(cè)量命令:傳感器的 VDD 上電后需等待 5ms, 發(fā)送寫(xiě)測(cè)量命令 0x70 0xAC 0x330x00, 等待 80ms 測(cè)量完成;
- 獲取溫濕度校準(zhǔn)數(shù)據(jù): 在等待 80ms 測(cè)量完成后, 發(fā)送 0x71 讀傳感器,可獲取狀態(tài)字 Status、溫濕度校準(zhǔn)數(shù)據(jù) SRH[19:0]、ST[19:0]以及校準(zhǔn)字 CRC;
- 根據(jù)公式計(jì)算溫濕度:
計(jì)算檢驗(yàn)碼的函數(shù)如下:
//**********************************************************//
//CRC校驗(yàn)類(lèi)型: CRC8
//多項(xiàng)式: X8+X5+X4+1
//Poly:0011 0001 0x31
unsigned char Calc_CRC8(unsigned char *message,unsigned char Num)
{
unsigned char i;
unsigned char byte;
unsigned char crc =0xFF;
for (byte = 0;byte< Num;byte++)
{
crc^=(message[byte]);
for(i=8;i >0;--i)
{
if(crc&0x80)
crc=(crc< 1)^0x31;
else
crc=(crc< 1);
}
}
return crc;
}//
**********************************************************//
2. 配置 I2C
3. 讀取溫濕度關(guān)鍵代碼
讀取一次溫濕度值, 耗時(shí)至少 80ms。不可能在接收到modbus 請(qǐng)求后再去讀溫濕度。而 是使用另一個(gè)任務(wù)不斷讀取溫濕度。
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) ;
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) ;
-
傳感器
+關(guān)注
關(guān)注
2561文章
52198瀏覽量
761708 -
芯片
+關(guān)注
關(guān)注
459文章
51927瀏覽量
433688 -
MODBUS
+關(guān)注
關(guān)注
28文章
1950瀏覽量
78651
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論