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