完整的伺服系统所包含的模块比较多,因此无法逐一详细介绍,所以本章着重介绍
设计难度较高的 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 各字节的数据,再从低八位依次发送直至发送完成。