电源控制板软件设计

电源控制板软件设计

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.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操作流程:

  1. 使能PG与PF以及PI这三组GPIO口的时钟;
  2. 初始化相关IO为输出(PG0- PG5;PF11- PF13;PI5);
  3. 将PG0设置为低电平,使能驱动芯片74LVC244APW工作;
  4. 根据接收到的命令操作相关IO口去驱动电源输出或者离散量输出,若是接收到输出第一路电源命令则将PG1设置为低电平;

操作流程图如图3.1所示。

电源控制板软件设计_第2张图片

图3.1 IO操作流程

3.2 串口驱动

1路RS422串口用来与主机通信,主机通过这1路串口发送离散量输出指令、电源控制输出指令以及获取电流传感器数据指令。若是收到离散量输出指令,那么STM32解析到相关指令会调用IO驱动函数输出对应通道的离散量;若是收到电源控制指令,那么STM32解析到相关指令会调用IO驱动函数输出对应通道的电源输出;若是收到主机获取电流传感器数据指令,那么STM32解析到相关指令后会调用SPI驱动函数采集对应通道的电流传感器的数据,然后通过RS422串口将此数据回传给主机。

RS422驱动配置流程:

  1. 使能RS422串口的时钟,使能RS422的GPIO口的时钟;
  2. 初始化RS422串口的GPIO口为串口功能IO口;
  3. 配置USART1的串口中断组优先级;
  4. 配置USART1的串口波特率、配置全双工模式、配置校验位、配置停止位、配置数据位等属性;
  5. 使能USART1的接收中断;
  6. 使能USART1的串口功能;
  7. 在串口接收中断中将数据缓存到队列FIFO中;

RS422串口驱动配置流程图如图3.2所示。

电源控制板软件设计_第3张图片

图3.2 RS422驱动配置流程

422与主机之间的通信协议有三个,一个是离散量输出指令;一个是电源控制输出指令;还有一个是电流传感器回传指令。

  1. 离散量输出指令协议如表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去读空一次队列,完成数据的接收。在串口接收到这些指令的时候需要做数据解包操作。解包流程如下:

  1. 建立一个大缓存,大小能容纳10帧数据以上,用该缓存去接收串口数据,用于做前一帧数据与后一帧数据的拼接;
  2. 寻找同步头,若是找到了同步头则剔除掉同步头前面的无效数据;若是没有找到同步头则保留当前数据在缓存中;
  3. 找到同步头后判断大缓存中数据数量是否超过一帧数据的数据量,若是超过了一帧数据的数据量,则进行校验和的计算;若是没有超过一帧数据的数据量,则保留当前数据在缓存中;
  4. 若校验和正确,则找到一帧有效数据,根据协议执行上位机发送的对应指令;若校验和错误,则没有找到有效的数据,则删除找到的同步头;
  5. 进行数据解析,若交互类型为0x22则执行离散量的输出;若交互类型为0x33则执行电源输出;若交互类型为0x44则回传电流传感器的数据给主机;
  6. 处理完一帧数据后,将该帧数据从大缓存中删除,进行下一次数据的解析,解析到数据小于一帧数据的大小;
  7. 轮询进行3、4、5、6的操作,将当前所有的有效数据都解析出来,并进行相应的指令的执行;

数据解析流程图如图3.3所示。

电源控制板软件设计_第4张图片

图3.3 数据解析流程图

3.3 SPI驱动

5路SPI通信用来采集电流传感器的值,通过STM32内部的SPI接口去读取电流传感器TLI4970-D025T4的数值。

TLI4970-D025T4特性如下:

  1. TLI4970-D025T4电流传感器的测量范围是-25A—25A;
  2. 输出的数据是16bit数据(其中低13bit是电流数据);
  3. 计算电流的公式  ;
  4. TLI4970-D025T4与主控制器连接为一个3-pin的SPI接口(sclk、cs、miso);
  5. 数据帧主要有两种,当最高位为0时,表示传输的是当前测量的电流数据;当最高位为1时,表示传输的是当前电流传感器的状态值(一般发生错误的时候会传输状态数据);数据帧格式如图3.4与3.5所示。

电源控制板软件设计_第5张图片

图3.4 电流数据帧格式

电源控制板软件设计_第6张图片

图3.5 电流传感器状态值帧格式

  1. 其最高支持的SPI时钟频率为5MHz,其时序如图3.6所示,其时钟在空闲时为低电平,数据采样发生在时钟的第二个边沿;

电源控制板软件设计_第7张图片

图3.6 电流传感器SPI时序图

由STM32的SPI1、SPI2、SPI6、SPI4、SPI5这五路SPI控制器做主设备去去读取电流传感器的数据,SPI驱动的配置流程如下:

  1. 使能SPI的时钟并且使能SPI的GPIO口的时钟;
  2. 初始化SPI对应IO为SPI功能IO口;
  3. 将5路SPI的片选线全部拉高,保证初始化后没有片选;
  4. 初始化配置SPI的属性,时钟频率:90/64=1.4MHz;工作模式:时钟空闲时为低电平,在时钟的第二个边沿采样数据;数据传输模式:16bit,高位在前低位在后;传输方向:全双工模式的主设备模式;
  5. 使能5路SPI外设功能;每隔5ms更新一次数据buffer和状态buffer;
  6. 每隔5ms去判断一次电流传感器数据buffer中的数值是否大于最大的阈值数(15A),如果大于阈值,那么通过电源控制切断对应的那一路电源,并且更新回传电流传感器协议中的状态位信息;如果小于阈值,那么保留状态位信息。

SPI驱动配置流程如图3.7所示。

电源控制板软件设计_第8张图片

图3.7 SPI驱动配置流程

3.4 定时器驱动

板子运行需要有时间基准,解析接收串口指令需要进行周期性操作,需要时间基准,更新电流传感器的数据需要时间基准,本系统解析串口指令的周期定为20ms一次;更新电流传感器的数据的周期定为5ms一次;判断电流传感器数值是否大于阈值的操作周期定为5ms一次。保证整个流程能够周期性的运行。定时器驱动配置流程如下:

  1. 配置定时器驱动组优先级;
  2. 使能定时器驱动的时钟;
  3. 配置定时器分频系数:定时器时钟源clk = 2 * pclk1 TIMCLK = 180M / 2 = 90M 定时器频率 = TIMCLK / (TIM_Prescaler + 1) 1M = 90 / (90 - 1);
  4. 配置定时周期数;
  5. 使能定时器中断和定时器外设;
  6. 定时器中断中设置定时标识,每次触发中断将定时标识置1;

定时器驱动配置流程如图3.8所示:

       电源控制板软件设计_第9张图片

图3.8 定时器驱动配置流程

你可能感兴趣的:(stm32,stm32,spi,电流传感器)