Back to Blog

基于STM32 ARM+FPGA伺服控制系统(二)软件及FPGA设计

#fpga开发#stm32#arm开发

完整的伺服系统所包含的模块比较多,因此无法逐一详细介绍,所以本章着重介绍设计难度较高的 FPGA 部分并简单介绍 ARM 端的工作流程。FPGA 部分主要有 FOC

算法、电流采样算法及编码器采样算法,是整个控制系统的基础,直接决定电机控制效果的好坏。因为 FPGA 工作的特殊性,需要考虑设计时序的合理性及合理统筹多种任务的执行顺序,导致了其设计难度大大提高。下面将对 FPGA 重要部分程序进行设计说明,主要分为 SVPWM 算法模块、编码器反馈模块和电流采样模块。

4.1SVPWM 算法程序设计

根据第二章第四小节可以知道,SVPWM 算法的工作流程如图 4-1 所示。首先对ܷ ߙ

和ܷ ߚ 解码判断当前扇区,接着计算当前扇区的基本矢量所需的作用时间,下一步得出

PWM 比较值时间点,最后进行脉宽调制且加上死区时间形成互补 PWM 波驱控制逆变器开关工作,使其生成所需的正弦电压。

4.1.1 软件模块设计

SVPWM 模块功能结构图如图 4-2 所示。模块的信号解释如下:

(1)sys_clk

:系统时钟,工作频率为 50MHz。

(2)sys_rst

:系统复位,低电平有效。

(3)svpwm_en

:模块使能信号。

(4)ualpha、ubeta :逆 Park 转换模块输出信号。

(5)其他

:六路互补 PWM 波。

 

该模块的工作原理及运算公式在第二章已经详细阐述,因此在这里不再过多赘述。

但需要注意的是由于逆变器的开关存在机械延迟,因此需要生成带死区时间的互补

PWM 波,这样可以避免因同时打开上下桥臂而导致短路致人受伤的情况。

生成带死区的互补 PWM 波原理是以计算得出的 PWM 波作为参考对象,然后根据实际情况设定合理的死区时间。假设逆变器输入信号为高电平有效,当参考对象从低电平跳变为高电平时,首先关闭下桥臂,再延时死区时间,最后打开上桥臂;当参考对象从高电平跳变为低电平时,先关闭上桥臂,再延时死区时间,最后打开下桥臂。

其效果如图 4-3 所示。以 U 相为例,图中 u_pwm 为计算得到的参考 PWM 波,u_pwm1

为上桥臂 PWM 波,而 u_pwm2 为下桥臂 PWM 波。

4.1.2 仿真测试

对 SVPWM 模块进行仿真验证,所得结果如图 4-4 所示。从图中可以看到,取任意值赋值给 u_alpha 和 u_beta,然后系统生成一个时钟周期 svpwm_en 信号,经过运算后得出u_pwm作为参考PWM波。根据u_pwm信号生成互补PWM波u_pwm1和u_pwm2,两者之间存在死区时间。由此从仿真结果可以看出模块能够正常生成互补 PWM 波。

4.2BISS-C 协议程序设计

4.2.1BISS-C 协议数据结构

BISS 协议来自 iC-Haus 公司,它适用于传感器的双向串行接口,而且带 CRC 校验功能确保传输数据正确。与其他同类通信协议相比,BISS 协议在兼容性和网络结构方面更具有优势,在高速性和时延与 SSI 相当,通信速率最高可达 10Mbps。同时,BISS

协议的数据长度可以根据实际情况做出修改,具有良好的扩展性。

BISS 协议有两种工作模式[43],本文中所设计的工作模式为传感器模式,FPGA 向编码器发送位置请求指令,编码器则返回相关信息。在传感器模式下,BISS-C 的数据格式如下图 4-5 所示。主机发送 MA 时钟信号给光栅尺,编码器通过 SLO 数据线串行返回数据信息。

BISS-C 数据帧共由八部分组成,分别是“Ack”响应阶段、“Start”位、一位的“0”位、若干位的位置数据、一位错误位、一位警告位、六位的 CRC 校验码和“Timeout”超时结束阶段。具体的通信请求循环如下所述[44]:

(1)在非位置请求时,时钟信号为高电平,主机读取编码器的 SLO 数据线为高电平时,则表示编码器已准备就绪。

2)当编码器准备就绪时,主机开始传输固定频率的 MA 时钟信号给光栅尺。

3)编码器在检测到主机发送的 MA 时钟的第二个上升沿时,会将 SLO 线设为低电平作为响应。

4)编码器通过拉低 SLO 信号线提示主机,当前编码器处于 Ack 应答状态,主机应及时切换到接收状态。

5)主机将同步于 MA 时钟信号接收编码器传回传数据,其数据帧格式为高位在前低位在后。

6)当接收完全部数据后,主机将 MA 时钟线拉高。当编码器准备好下一次位置请求时,编码器则将 SLO 线设为高电平来提示主机,否则保持低电平。

4.2.2 软件模块设计

BISS 模块功能结构图如图 4-6 所示,主要由 MA 模块、SLO 模块和 CRC 模块构成。

模块的信号解释如下:

(1)biss_en

:模块使能信号,用于获取编码器位置信息。

(2)data_length

:编码器数据位宽设置。

(3)SLO

:BISS 协议数据线。

(4)MA

:BISS 协议时钟线。

(5)abs_data

:单圈绝对值,用于圆编码器多圈计数和电角度计算。

(6)abs_pos

:编码器实际总位置数据。

 

该模块具体工作原理为:首先 FPGA 根据实际光栅尺型号设置位置数据位宽

data_lentgh 数值,该模块满足位置数据位宽长度为 32bit 内的设计需求。通过主控模块发送使能信号 biss_en 到 MA 模块中,MA 时钟模块开始工作,向光栅尺发送固定频率的 MA 时钟信号请求获取当前位置值。FPGA 接收完光栅尺返回的数据后将所其输入到 CRC 校验模块中进行数据校验,最后将正确的位置数据输出至下一级模块。

根据 BISS 协议的时序图特点,本文将 SLO 模块接收数据的过程划分为六个状态,该状态机工作方式如图 4-7 所示。一开始功能模块为空闲状态并且进入等待状态;当光栅尺拉低 SLO 信号线时进入 Ack 应答状态;当 SLO 从低电平变换成高电平时,状态机进入 STATE_ZERO 状态;当监测到 SLO 数据线拉低时,模块进入工作状态开始接收数据,接收完设定位宽数据后进入“TIMEOUT”状态。

在实际工程中,数据电平存在毛刺或者亚稳态现象,假如根据 MA 时钟的上升沿读取当前 SLO 数据线的电平状态,所得到的信号并不可靠。通常情况下,在传输过程中数据中间位置的电平状态是比较稳定可靠的。因此本文采取的方法为:在中间部分对 SLO 数据线进行多次采样,并判断哪种电平的数量多,最后将数量多的电平信号值判赋值给寄存器。具体实施原理如图 4-8 所示,其中 sys_clk 为系统时钟,bps_cnt 为一个 MA 时钟周期对 SLO 数据线电平的采样数。实际中 MA 时钟频率相比于 FPGA 内部工作频率来说属于低速时钟,因此可以在一个 MA 时钟周期内进行多次采样。在每一个 MA 时钟周期中,当检测到 MA 时钟的上升沿时,

bps_cnt 寄存器开始从零计数采样,然后判断高电平的数量多还是低电平的数量多,最后将累加后电平数量多的一方的值赋值给寄存器。如此重复将所有数据接收完成。

当 SLO 模块接收完数据后向 MA 模块和 CRC 校验模块返回接收完成信号。MA 模块接收到完成信号后 FPGA 将 MA 时钟线拉高,CRC 模块接收到完成信号后将 SLO 模块传输的数据帧进行 CRC 校验运算。BISS-C 协议的 CRC 多项式为_G_(x)  x 6  x 1,即校验字段为 1000011。为了充分发挥 FPGA 并行处理的工作特点,进一步提升工作效率,本文采用了并行 CRC 校验算法,在一个时钟周期内得出 CRC 校验码,主要代码如图 4-9 所示:

其中 d[33:0]是需要校验的数据,crc_out[5:0]是 CRC 模块对需要校验的数据进行运算后得出的结果,而 c[5:0]的初始值为零,最后将计算结果与所接收的 CRC 校验码进行匹配。如果二者一致,则表示 SLO 模块正确接收数据,并将正确的位置数据更新至下一级模块中,否则更新上一次保留的正确数据,并准备发起下一次光栅位置请求。

4.2.3 仿真测试

最后编写测试文件对 BISS 模块在 ModelSim 软件进行仿真验证,在实际工程应用中稳定性占据着重要位置。因此在通信速率方面选用最高 5Mbps,所以测试文件中模拟编码器以 5Mbps 的通讯速率向 FPGA 传输数据。本文针对常用的 26bit 和 32bit 位置数据位宽编码器型号进行测试。

首先对 26bit 位宽型号设置了两组数据如表 4-1 所示,其中第一组和第二组数据仅仅在 CRC 检验码最后一位不同,而第二组数据则是完全正确的情况。通过这种人为设置的数据可以测试 BISS 模块接收的两组数据信息是否一致,同时也检测 CRC 校验模块能否正常工作。需要特别说明的是,BISS-C 协议的 CRC 校验值在编码器内部是先通过取反再输出给主机的,所以表格中的 CRC 校验值是已经做了取反处理。因此做匹配校对时,FPGA 应当将计算得出的 CRC 校验值取反再与接收到的值进行比较。其整体测试结果如图 4-10 所示。

图中左侧的时序图时第一组数据,而右侧的是第二组数据。图中 crc_check 为接收的 CRC 值、check_data 是需要校验的数据、done 是数据接收完成信号、crc_out 是校验计算得出的 CRC 值、crc_done 代表校验完成,即接收的数据正确无误。从图中可以看出,在 data_length 为 26bit 的数据模式下模块接收到 biss_en 使能信号后,FPGA 向编码器发送频率为 5MHz 的 MA 时钟信号。编码器检测到 MA 时钟信号后通过 SLO 数据线向主机返回数据,当 FPGA 接收完数据后向 CRC 模块传输接收到的 CRC 校验值和需求校验的数据,并且发出 done 信号来提示 CRC 模块工作。然后 CRC 模块对需要校验的数据进行处理,处理完之后跟接收到的 CRC 校验值进行比对,假如两者匹配成功则产生一个高电平脉冲的成功标记信号 crc_done,否则 crc_done 信号保持低电平。

进一步查看 CRC 校验的细节如图 4-11 所示。图中接收到的 CRC 校验值 crc_check

为 001011,而对需要校验的数据经过 CRC 校验后,得到 crc_out 为 110100。上一节也说到,编码器的 CRC 校验值是先取反在发送到主机,而校验运算后得到的数据

crc_check 并未取反,因此取反后可知与所接收的 CRC 校验值一致。同时从图中也能看出 CRC 校验所需的时间为一个系统时钟周期,由此得出 CRC 校验模块能够正常工作。

从上述的两张仿真结果图可知 BISS 模块能够以 5Mbps 的通信速率正常发送 MA 时钟信号,并且完整接收编码器数据,最后以一个时钟周期完成 CRC 校验运算。因此所设计的 BISS 模块通过 26bit 模式功能仿真测试。

同理,设置了 32bit 位宽型号的仿真测试,设置的仿真数据如表 4-2 所示,功能仿真图和 CRC 校验细节图如图 4-12、4-13 所示。从图中可以看出所设计的 BISS 模块也通过了 32bit 模式功能仿真测试。

 

因此,可以得出本文设计的 BISS 模块可以通过更改 data_lentgh 寄存器,能够以

5Mbps 的通信来完整接收 32bit 以内数据位宽的编码器的数据。

4.3 多摩川协议程序设计

4.3.1 多摩川协议数据结构

多摩川协议来自日本的多摩川公司,该多摩川协议采用的是“一问一答”的通信方式,主机向编码器发送不同的请求指令来获取不同的数据信息[45]。它的通信方式与串口通信一致,并且发送一个字节数据时以固定的 2.5Mbps 传输速率从低位开始传输。

本文只着重介绍多摩川协议读取编码器信息的工作模式。

读取编码器信息模式的数据帧格式如图 4-14 所示。其工作原理为:主机通过发送不同的控制帧指令给编码器来获取相应的信息,然后编码器返回一组数据作为回应,该组数据由控制帧、状态帧、若干数据帧和 CRC 帧组成。其中根据编码器型号的不同,数据帧的数量会有所不同。

控制帧的数据格式如图 4-15 所示,该帧数据主题部分由同步码、控制指令和控制指令校验位三部分组成。其中同步码是固定不变的,而控制指令及其校验位则有具体的指令码,如表 4-3 所示。不同的指令码代表不同的功能,编码器返回的数据类型也不同。例如,用户想获取编码器的单圈值和多圈值,查表 4-4 可知编号为 ID 3 的指令码对应编码器返回单圈值和多圈值,因此主机可以向编码器发送编码为:01011000,当编码器接收该编码信息则返回当前编码器单圈值、多圈值和其余附加信息数据。

 

状态帧的数据格式如图 4-16 所示,由信息位、编码错误报警位和通信报警位组成。

不同的编码器型号所对应的信息位信息各有不同,具体含义可查看对应的编码器手册介绍。如果编码器编码错误或者编码器外部供电出现问题,则编码器错误报警位 ea0

为 1,表示当前编码信息错误,而 ea1 为 1 时则编码器多圈值数据错误。通信报警位

ca0 为 1 时,表示所接收的控制帧中的控制指令校验位发生错误,而 ca1 为 1 则表示所接收的控制帧结束位发生错误。

多摩川绝对式编码器最高能够实现 39bit 位宽的高分辨率位置编码数据,其中包括

23bit 的单圈值和 16bit 的多圈值。但是多摩川协议通信一次只发送 8bit 数据,所以发送完整的位置信息必须将其拆开,再按照一定的排列顺序发送。具体一个字节的数据帧格式和 CRC 帧格式如图 4-17 所示。

由于主机向编码器发送不同的指令码,编码器返回的数据类型也不同。根据编码器不同的分辨率和指令码,编码器返回的有效数据帧数量也不一样,如只需获取单圈值或多圈值则返回 3 个字节的有效数据帧,如果需要同时获取单圈值和多圈值则返回 8

个字节的有效数据帧。具体的功能码对应的数据帧如表 4-4 所示。

表中 ABS 代表单圈绝对码值,ABS0 是单圈位置数据的低八位,ABS1 是单圈位置数据的中八位位,ABS2 是单圈位置数据的高八位,假如编码器单圈码值位数少于 24bit

时,高位用 0 补齐。同理,ABM 代表多圈绝对码值,ABM0 是圈值数据的低八位,ABM1

是圈值数据的中八位位,ABM2 是圈值数据的高八位,假如编码器多圈码值位数少于

24bit 时,高位用 0 补齐。所以对于高精度的编码器,编码器会将多位的单圈值和多圈值各拆分为 3 各字节的数据,再从低八位依次发送直至发送完成。