電源控制板軟件設計
1 功能需求分析
電源控制板主要功能是控制電路輸出多路28V電源,在控制的同時能夠實時監測個電源輸出的電流大小,在電流過大時能夠及時切斷,並且反饋給主機。核心控制器是STM32F429單片機,該模塊與主機之間的通信採用RS422串口。根據電路分析可以知道其需要配置功能有:3路離散量輸出、5路電源控制輸出、1路RS422通信串口、1路RS232調試串口、5路電流傳感器實時監測採集、一路LED燈。
3路離散量輸出通過STM32的3個IO口驅動相應電路中光耦的通斷;
5路電源控制輸出通過STM32的5個IO口驅動相應電路中光耦的通斷;
1路LED燈通過STM32的1個IO口驅動;
1路RS422通道通過STM32的USART1實現;
5路電流傳感器使用STM32的5路SPI與電流傳感器進行數據採集;
整體框架如圖1.1所示。
圖1.1 電源控制板構成
2 管腳分配
1,IO口輸出引腳分配:
管腳功能 |
通道號 |
管腳號 |
高低電平含義 |
IO口驅動使能引腳 |
驅動使能引腳 |
PG0 |
低電平使能 |
離散量輸出 |
28V_0 |
PF11 |
低電平輸出/高電平斷開 |
28V_1 |
PF12 |
||
28V_2 |
PF13 |
||
電源控制輸出 |
Contrl_28V_1 |
PG1 |
低電平輸出/高電平斷開 |
Contrl_28V_2 |
PG2 |
||
Contrl_28V_3 |
PG3 |
||
Contrl_28V_4 |
PG4 |
||
Contrl_28V_5 |
PG5 |
||
LED燈控制引腳 |
LED_OUT |
PI5 |
低電平亮/高電平滅 |
2,串口IO引腳分配
管腳功能 |
通道號 |
管腳號 |
高低電平含義 |
RS422串口 |
串口的RX0 |
PA10 |
|
串口的TX0 |
PA9 |
|
|
RS232串口 |
串口的RX0 |
PA3 |
|
串口的TX0 |
PA2 |
|
3,SPI的IO引腳分配:
管腳功能 |
通道號 |
管腳號 |
高低電平含義 |
第一路SPI |
Spi1_sclk |
PA5 |
Spi複用 |
Spi1_miso |
PA6 |
|
|
Spi1_mosi |
PA7 |
|
|
Spi1_nss |
PA4 |
|
|
第二路SPI |
Spi2_sclk |
PI1 |
Spi複用 |
Spi2_miso |
PI2 |
|
|
Spi2_mosi |
PI3 |
|
|
Spi2_nss |
PI0 |
|
|
第三路SPI |
Spi6_sclk |
PG13 |
Spi複用 |
Spi6_miso |
PG12 |
|
|
Spi6_mosi |
PG14 |
|
|
Spi6_nss |
PG8 |
|
|
第四路SPI |
Spi4_sclk |
PE2 |
Spi複用 |
Spi4_miso |
PE5 |
|
|
Spi4_mosi |
PE6 |
|
|
Spi4_nss |
PE4 |
|
|
第五路SPI |
Spi5_sclk |
PH6 |
Spi複用 |
Spi5_miso |
PH7 |
|
|
Spi5_mosi |
PF9 |
|
|
Spi5_nss |
PH5 |
|
3 設計流程
流程中需要設計的模塊主要是三個部分:IO口驅動模塊,串口驅動模塊,SPI驅動模塊。離散量的輸出、電源控制輸出、LED燈都是由IO口驅動完成;與主機的通信接口由串口USART1完成;5路電流傳感器的數值通過5路SPI完成採集。
3.1 IO口驅動
3路離散量輸出和5路電源控制輸出由STM32的IO口連接驅動芯片74LVC244APW,然後去驅動開關電路,使得後端電路完成對應的輸出或斷開工作。LED燈直接由STM32的IO口輸出驅動。
GPIO操作流程:
- 使能PG與PF以及PI這三組GPIO口的時鐘;
- 初始化相關IO爲輸出(PG0- PG5;PF11- PF13;PI5);
- 將PG0設置爲低電平,使能驅動芯片74LVC244APW工作;
- 根據接收到的命令操作相關IO口去驅動電源輸出或者離散量輸出,若是接收到輸出第一路電源命令則將PG1設置爲低電平;
操作流程圖如圖3.1所示。
圖3.1 IO操作流程
3.2 串口驅動
1路RS422串口用來與主機通信,主機通過這1路串口發送離散量輸出指令、電源控制輸出指令以及獲取電流傳感器數據指令。若是收到離散量輸出指令,那麼STM32解析到相關指令會調用IO驅動函數輸出對應通道的離散量;若是收到電源控制指令,那麼STM32解析到相關指令會調用IO驅動函數輸出對應通道的電源輸出;若是收到主機獲取電流傳感器數據指令,那麼STM32解析到相關指令後會調用SPI驅動函數採集對應通道的電流傳感器的數據,然後通過RS422串口將此數據回傳給主機。
RS422驅動配置流程:
- 使能RS422串口的時鐘,使能RS422的GPIO口的時鐘;
- 初始化RS422串口的GPIO口爲串口功能IO口;
- 配置USART1的串口中斷組優先級;
- 配置USART1的串口波特率、配置全雙工模式、配置校驗位、配置停止位、配置數據位等屬性;
- 使能USART1的接收中斷;
- 使能USART1的串口功能;
- 在串口接收中斷中將數據緩存到隊列FIFO中;
RS422串口驅動配置流程圖如圖3.2所示。
圖3.2 RS422驅動配置流程
422與主機之間的通信協議有三個,一個是離散量輸出指令;一個是電源控制輸出指令;還有一個是電流傳感器回傳指令。
- 離散量輸出指令協議如表3.1所示:
字節號 |
類型 |
內容 |
備註 |
0、1 |
幀頭 |
6E6E |
|
2 |
字節數 |
0x10 |
整幀字節數 |
3 |
交互類型 |
0x22 |
|
4 |
通道1 |
unsigned char |
0x01表示高,0x00表示低 |
5 |
通道2 |
┇ |
┇ |
6 |
通道3 |
unsigned char |
|
7 |
備份 |
┇ |
┇ |
8 |
備份 |
unsigned char |
|
9 |
備份 |
┇ |
┇ |
10 |
備份 |
unsigned char |
|
11 |
備份 |
┇ |
┇ |
12 |
備份 |
unsigned char |
|
13 |
備份 |
┇ |
┇ |
14 |
備份 |
unsigned char |
|
15 |
校驗和 |
|
對校驗和前所有字節求和,取低8位 |
2,電源控制輸出指令協議如表3.2所示:
字節號 |
類型 |
內容 |
備註 |
0、1 |
幀頭 |
6E6E |
|
2 |
字節數 |
0x10 |
整幀字節數 |
3 |
交互類型 |
0x33 |
|
4 |
通道1 |
unsigned char |
0x01表示高,0x00表示低 |
5 |
通道2 |
┇ |
┇ |
6 |
通道3 |
unsigned char |
|
7 |
通道4 |
┇ |
┇ |
8 |
通道5 |
unsigned char |
|
9 |
備份 |
┇ |
┇ |
10 |
備份 |
unsigned char |
|
11 |
備份 |
┇ |
┇ |
12 |
備份 |
unsigned char |
|
13 |
備份 |
┇ |
┇ |
14 |
備份 |
unsigned char |
|
15 |
校驗和 |
|
對校驗和前所有字節求和,取低8位 |
3,回傳電流傳感器指令協議如表3.3所示:
字節號 |
類型 |
內容 |
備註 |
0、1 |
幀頭 |
6E6E |
|
2 |
字節數 |
0x10 |
整幀字節數 |
3 |
交互類型 |
0x44/0x45 |
0x44表示下發指令(數據爲0)0x45表示返回數據 |
4 |
狀態位 |
unsigned char |
0x01表示已切斷電源,0x00表示正常 |
5 |
數據1(L) |
unsigned char |
|
6 |
數據1(H) |
┇ |
┇ |
7 |
數據2(L) |
unsigned char |
|
8 |
數據2(H) |
┇ |
┇ |
9 |
數據3(L) |
unsigned char |
|
10 |
數據3(H) |
┇ |
┇ |
11 |
數據4(L) |
unsigned char |
|
12 |
數據4(H) |
┇ |
┇ |
13 |
數據5(L) |
unsigned char |
|
14 |
數據5(H) |
┇ |
┇ |
15 |
校驗和 |
|
對校驗和前所有字節求和,取低8位 |
由於STM32的串口沒有FIFO,沒一次中斷只能接收一個字節數據,因而需要人爲去創建一個FIFO去緩存接收到的數據,在本次設計中採用隊列的形式作爲串口的接收FIFO,若有中斷產生,則將數據寄存器中的數據入隊,在主流程中每隔5ms去讀空一次隊列,完成數據的接收。在串口接收到這些指令的時候需要做數據解包操作。解包流程如下:
- 建立一個大緩存,大小能容納10幀數據以上,用該緩存去接收串口數據,用於做前一幀數據與後一幀數據的拼接;
- 尋找同步頭,若是找到了同步頭則剔除掉同步頭前面的無效數據;若是沒有找到同步頭則保留當前數據在緩存中;
- 找到同步頭後判斷大緩存中數據數量是否超過一幀數據的數據量,若是超過了一幀數據的數據量,則進行校驗和的計算;若是沒有超過一幀數據的數據量,則保留當前數據在緩存中;
- 若校驗和正確,則找到一幀有效數據,根據協議執行上位機發送的對應指令;若校驗和錯誤,則沒有找到有效的數據,則刪除找到的同步頭;
- 進行數據解析,若交互類型爲0x22則執行離散量的輸出;若交互類型爲0x33則執行電源輸出;若交互類型爲0x44則回傳電流傳感器的數據給主機;
- 處理完一幀數據後,將該幀數據從大緩存中刪除,進行下一次數據的解析,解析到數據小於一幀數據的大小;
- 輪詢進行3、4、5、6的操作,將當前所有的有效數據都解析出來,並進行相應的指令的執行;
數據解析流程圖如圖3.3所示。
圖3.3 數據解析流程圖
3.3 SPI驅動
5路SPI通信用來採集電流傳感器的值,通過STM32內部的SPI接口去讀取電流傳感器TLI4970-D025T4的數值。
TLI4970-D025T4特性如下:
- TLI4970-D025T4電流傳感器的測量範圍是-25A—25A;
- 輸出的數據是16bit數據(其中低13bit是電流數據);
- 計算電流的公式 ;
- TLI4970-D025T4與主控制器連接爲一個3-pin的SPI接口(sclk、cs、miso);
- 數據幀主要有兩種,當最高位爲0時,表示傳輸的是當前測量的電流數據;當最高位爲1時,表示傳輸的是當前電流傳感器的狀態值(一般發生錯誤的時候會傳輸狀態數據);數據幀格式如圖3.4與3.5所示。
圖3.4 電流數據幀格式
圖3.5 電流傳感器狀態值幀格式
- 其最高支持的SPI時鐘頻率爲5MHz,其時序如圖3.6所示,其時鐘在空閒時爲低電平,數據採樣發生在時鐘的第二個邊沿;
圖3.6 電流傳感器SPI時序圖
由STM32的SPI1、SPI2、SPI6、SPI4、SPI5這五路SPI控制器做主設備去去讀取電流傳感器的數據,SPI驅動的配置流程如下:
- 使能SPI的時鐘並且使能SPI的GPIO口的時鐘;
- 初始化SPI對應IO爲SPI功能IO口;
- 將5路SPI的片選線全部拉高,保證初始化後沒有片選;
- 初始化配置SPI的屬性,時鐘頻率:90/64=1.4MHz;工作模式:時鐘空閒時爲低電平,在時鐘的第二個邊沿採樣數據;數據傳輸模式:16bit,高位在前低位在後;傳輸方向:全雙工模式的主設備模式;
- 使能5路SPI外設功能;每隔5ms更新一次數據buffer和狀態buffer;
- 每隔5ms去判斷一次電流傳感器數據buffer中的數值是否大於最大的閾值數(15A),如果大於閾值,那麼通過電源控制切斷對應的那一路電源,並且更新回傳電流傳感器協議中的狀態位信息;如果小於閾值,那麼保留狀態位信息。
SPI驅動配置流程如圖3.7所示。
圖3.7 SPI驅動配置流程
3.4 定時器驅動
板子運行需要有時間基準,解析接收串口指令需要進行週期性操作,需要時間基準,更新電流傳感器的數據需要時間基準,本系統解析串口指令的週期定爲20ms一次;更新電流傳感器的數據的週期定爲5ms一次;判斷電流傳感器數值是否大於閾值的操作週期定爲5ms一次。保證整個流程能夠週期性的運行。定時器驅動配置流程如下:
- 配置定時器驅動組優先級;
- 使能定時器驅動的時鐘;
- 配置定時器分頻係數:定時器時鐘源clk = 2 * pclk1 TIMCLK = 180M / 2 = 90M 定時器頻率 = TIMCLK / (TIM_Prescaler + 1) 1M = 90 / (90 - 1);
- 配置定時週期數;
- 使能定時器中斷和定時器外設;
- 定時器中斷中設置定時標識,每次觸發中斷將定時標識置1;
定時器驅動配置流程如圖3.8所示:
圖3.8 定時器驅動配置流程