电源控制板软件设计
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 定时器驱动配置流程