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