第7章 低成本 Modbus 傳感器的實(shí)現(xiàn)
7.1 硬件資源介紹與接線
我們的 Modbus 傳感器開發(fā)套件共有三個(gè), 三個(gè)板子的使用的主控方案是 STM32F030芯片,硬件接口資源如下圖所示:
開關(guān)量模塊
溫濕度變送器模塊
環(huán)境檢測模塊
7.2 開發(fā)環(huán)境搭建
在前面我們已經(jīng)安裝了 Keil MDK、STM32CubeMX、STM32CubeProgrammer、ST-Link 驅(qū) 動(dòng)、 CH340 驅(qū)動(dòng)。因此在這里我們只需給 Keil MDK 安裝 STM32F030 對應(yīng)的 PACK 即可對改 芯片進(jìn)行編碼開發(fā)。
安裝 PACK 的方法有兩種:
- 第一種方法:雙擊運(yùn)行開發(fā)板配套資料中的 Pack 安裝包,隨后彈出安裝界面,按照默 認(rèn)選項(xiàng)進(jìn)行安裝即可。:
- 第二種方法,在線安裝, 下面演示如何在線安裝。
打開Keil之后, 點(diǎn)擊如下按鈕啟動(dòng)“Pack Installer”:
使用 “Pack Installer” 可 以 方 便 的 對 Pack 安 裝 和 管 理 。 在 左 上 角 搜 索 框 輸 入 “STM32F030”,展開搜索結(jié)果,可以看到STM32F030CC,點(diǎn)擊右邊的簡介鏈接即可跳轉(zhuǎn) 到Pack下載頁面,如下圖所示。
如果跳轉(zhuǎn)網(wǎng)頁無法打開,可直接打開 Pack 下載總?cè)肟冢╳ww.keil.com/dd2/Pack/)。 進(jìn)入 Pack 下載總?cè)肟诤?,搜索“STM32F030”,找到“STM030CCT”點(diǎn)擊, 如下圖所示(實(shí) 測部分網(wǎng)絡(luò)環(huán)境打開該鏈接無 Pack 列表,請嘗試換個(gè)網(wǎng)絡(luò)環(huán)境測試,仍舊不行則使用配 套資料 Pack)。
點(diǎn)擊會跳轉(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)開始選擇 MCU:
如下圖輸入型號“STM32F030CCT”,雙擊找到的芯片, 開始創(chuàng)建工程:
調(diào)高 CPU 頻率:
配置工程, 如下操作:
指定代碼生成方法, 如下:
7.3.2 配置調(diào)試器
新建的工程要配置調(diào)試器,參考《2.2.3 配置調(diào)試器》 。
然后就可以編譯程序、燒寫運(yùn)行了。
7.3.3 配置 GPIO 操作 LED
打開位于“5_硬件資料?1_開發(fā)板原理圖STM32F030CCT6_SWITCH_V11.pdf”的原理圖 文件。
根據(jù)開發(fā)板原理圖可以看到 F030的LED 引腳圖如下:
可以雙擊打開工程中如下文件進(jìn)入STM32CubeMX進(jìn)行配置:
然后如下配置 PB11 、PB12 、PB13 為輸出引腳:
點(diǎn)擊右上角的 “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);
}
最后編譯、燒寫、運(yùn)行, 可以看到開發(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而使用純中斷來 實(shí)現(xiàn)UART,多學(xué)一種編程方法。
2.配置 RS485方向引腳
STM32H5主控板上使用的RS485轉(zhuǎn)換芯片是MAX13487EESA,它會自動(dòng)切換發(fā)送、 接收方向,無需程序進(jìn)行方向的控制。使用STM32F030制作的“廉價(jià)傳感器”里,使用 的RS485轉(zhuǎn)換芯片是SIT3088ETK,它需要使用一個(gè)GPIO來控制方向,如下圖所示:
上圖中,RS485_CTRL使用的引腳是PA8,所以還需要把它配置為輸出引腳,輸出低 電平(讓SIT3088ETK默認(rèn)為接收狀態(tài)) 。如下配置:
7.4.2 封裝 UART
本節(jié)源碼為“3_程序源碼?1_視頻配套的源碼7-5_STM32F030串口編程demo”。 現(xiàn)場編程。
7.4.3 上機(jī)實(shí)驗(yàn)
本節(jié)源碼為“3_程序源碼?1_視頻配套的源碼7-6_STM32F030 串口測試”,里面有 2 個(gè)程序:h5_demo、f030_demo。
要測試 STM32F030 的串口, 只需要把它的 485 接口連接到 PC 去就可以了,但是我們沒 有 PC 上使用的“USB 轉(zhuǎn) 485”模塊,所以使用 STM32H5 來實(shí)現(xiàn)一個(gè)“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”整 個(gè)目錄復(fù)制到f030_demo中。
在Keil工程中添加代碼, 如下:
7.5.2 使用 modbus 控制設(shè)備
STM32F030作為從設(shè)備(sever),編寫“CoreSrcfreertos.c”:
7.5.3 上機(jī)實(shí)驗(yàn)
7.6 傳感器設(shè)計(jì)
7.6.1 設(shè)計(jì)思路
上位機(jī)(PC 軟件)或中控(STM32H5)通過 modbus 協(xié)議訪問 STM32F030 傳感器時(shí),讀 寫的是 STM32F030 分配出來的 4 個(gè)類型的緩沖區(qū)。這里需要解決 2 個(gè)問題:
- 這 4 個(gè)類型的緩沖區(qū)起始地址、大小分別是多少? 這根據(jù)傳感器的功能來設(shè)置。比如有 2 個(gè)按鍵,那么就可以分配 2 個(gè)“只讀的位寄存器”(DI)。
- 這些寄存器的值, 如何跟硬件對應(yīng)? 比如上位機(jī)讀 DI 寄存器時(shí), 誰提供這些值?傳感 器的程序應(yīng)該讀取按鍵值,填充 DI 寄存器。
第 1 個(gè)步驟,被稱為“點(diǎn)表設(shè)計(jì)”。
7.6.2 三款傳感器功能及所用引腳
這 3 款傳感器的原理圖在網(wǎng)盤如下目錄里:
它們控制外設(shè)所用的引腳,列表如下:
功能 | 使用的引腳 | 描述 | 寄存器類別 | |
---|---|---|---|---|
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 | 電壓值跟光強(qiáng)成反比 | AI | |
RES_ADC | PA2 | 電壓值跟可調(diào)電阻成反比 | AI | |
SWITCH開關(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 類寄存器的地址、功能 是什么。
在查看點(diǎn)表時(shí),經(jīng)常碰到“遙測、遙信、遙控、遙調(diào)”的概念。它們實(shí)質(zhì)上就是前面 講解 modbus 時(shí)引入的“AI、DI、DO、AO”。這些概念起源于電力系統(tǒng)。
電力領(lǐng)域中四遙系統(tǒng)是指遙測、遙信、遙控、遙調(diào)功能系統(tǒng), 四遙功能是電力監(jiān)控系 統(tǒng)最基本最重要的功能。具體來說:
- 遙測(遙測信息,AI):遠(yuǎn)程測量;遠(yuǎn)方測量顯示諸如電流、電壓、功率、壓力、溫度等 模擬量;
- 遙信(遙信信息,DI):遠(yuǎn)程信號;遠(yuǎn)方監(jiān)視各類電氣開關(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ù);四遙遙測、遙信、遙控、遙調(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ù)字信 號輸出。
隨著技術(shù)不斷地進(jìn)步,現(xiàn)在也有五遙的說法, 即在四遙的基礎(chǔ)上加上遙視, 遙視指的 是指利用包括電子技術(shù)、計(jì)算機(jī)技術(shù)、自動(dòng)化技術(shù)等監(jiān)視并記錄設(shè)備運(yùn)行情況和環(huán)境安全 情況。因此伴隨著技術(shù)發(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
在閱讀點(diǎn)表時(shí),還會碰到下表中的“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 | 只讀 |
點(diǎn)表的設(shè)計(jì),是完全由開發(fā)人員自行定義的。
1.開關(guān)量模塊(SWITCH)
寄存器說明:
設(shè)備地址 | 寄存器地址 | 寄存器類別 | 用途 | 描述 |
---|---|---|---|---|
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)
寄存器說明:
設(shè)備地址 | 寄存器地址 | 寄存器類別 | 用途 | 描述 |
---|---|---|---|---|
02H | 0000H | DO | 控制蜂鳴器 1 | 1-響 |
0001H | DO | 控制蜂鳴器 2 | 1-響 | |
0002H | DO | 控制 LED1 | 1-亮 | |
0003H | DO | 控制 LED2 | 1-亮 | |
0004H | DO | 控制 LED3 | 1-亮 | |
0000H | AI | 讀取光敏電壓 | 0xfff 對應(yīng) 3.3V12 位精度 | |
0001H | AI | 可調(diào)電阻器電壓 | 0xfff 對應(yīng) 3.3V12 位精度 |
- 溫濕度模塊(TEMP HUMI)
設(shè)備地址 | 寄存器地址 | 寄存器類別 | 用途 | 描述 |
---|---|---|---|---|
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 開關(guān)量傳感器程序設(shè)計(jì)
繼電器原理圖如下:
繼電器對外的信號有 3 個(gè):
- COM:公共端,通常是中間的觸點(diǎn), 與常開或常閉觸點(diǎn)相連
- NC(Normally Closed): 常閉接口,繼電器吸合前與 COM 連接, 吸合后懸空
- NO(Normally Open): 常開接口, 繼電器吸合前懸空, 吸合后與 COM 連接
開路即通路、斷路,閉合指的是開關(guān)閉合,也就是說, 在沒有任何上電之類的動(dòng)作時(shí), NC 和 COM 端相當(dāng)于已經(jīng)連通。
本節(jié)源碼為“ 3_ 程 序源 碼?1_ 視 頻配套 的 源 碼7-9_ 開 關(guān) 量 傳 感 器 程序 設(shè) 計(jì) f030_demo”。
7.6.5 環(huán)境監(jiān)測傳感器程序設(shè)計(jì)
1. 硬件電路
光敏電路如下, 光照越強(qiáng),U6 阻值越低,OPTO_ADC 電壓值就越低:
可調(diào)電阻器如下,R33 阻值越大,RES_ADC 電壓值越小:
本節(jié)源碼為“3_ 程序源碼?1_ 視頻配套的源碼7-10_ 環(huán)境監(jiān)測傳感器程序設(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)盤如下目錄:
AHT20 操作方法如下:
詳解如下:
- 發(fā)送測量命令:傳感器的 VDD 上電后需等待 5ms, 發(fā)送寫測量命令 0x70 0xAC 0x330x00, 等待 80ms 測量完成;
- 獲取溫濕度校準(zhǔn)數(shù)據(jù): 在等待 80ms 測量完成后, 發(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)類型: 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 請求后再去讀溫濕度。而 是使用另一個(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)注
2550文章
51035瀏覽量
753063 -
芯片
+關(guān)注
關(guān)注
455文章
50714瀏覽量
423136 -
MODBUS
+關(guān)注
關(guān)注
28文章
1799瀏覽量
76949
發(fā)布評論請先 登錄
相關(guān)推薦
評論