使用FPGA控制机械臂

今天研究如何使用 Python + 低成本 FPGA 开发高性能、精密的机械臂。

7f6ea8df0cbd55ef68c110beb5283dba.png

简介

由于 FPGA 具有并行特性,它在精密电机控制和机器人领域表现出色。本文是探索开发基于 ROS2 的解决方案,让机器人可以在白板上自主书写文字。

在这个项目中,将展示如何创建一个具有以下功能的机械臂应用程序:

  • 通过 FPGA 控制手臂上的 6 个轴关节

  • 通过远程机器上运行的 Jupyter Lab 实现对机械臂的控制

  • 通信链路为 RS232 - 可使用 LwIP 扩展到以太网

  • 在 Jupyter Lab 中跟踪轴定位信息

  • 能够将手臂的位置存储在文件中

  • 能够重放存储的文件,以根据应用程序的要求驱动手臂完成一系列动作

  • 能够控制选定的关节从一个位置移动到另一个位置

设计流程

本项目将采用的方法是在 FPGA 逻辑中创建 AMD MicroBlaze™ V 处理器,处理器将执行命令行解释器(CLI),接收关节的角度并更新特定关节的驱动逻辑。

使用这种方法,可以轻松更新 CLI 以支持使用 LwIP 和以太网命令,实现长距离远程连接。

手臂上的每个关节将被标记为 A ~ F,通过 UART 链路发送的协议是:

<joint> <angle> <cr><lf>

其中 Joint 为 A~F,angle 为 0 到 180,CR 为回车符,LF 为换行符。

在 FPGA 内部,使用一个简单的 RTL IP ,生成控制电机所需的 PWM 信号。这就要求在处理器上将角度转换为驱动信号。

伺服器以 50 Hz PWM 周期(20 ms)运行。在这 20 ms中,PWM 周期标称开启时间为 1.5 ms,将使伺服器位置处于 90 度点,通常称为中性位置。将开启时间减少到 1 ms将使伺服器移动到 0 度点,而将其增加到 2 ms将使伺服器移动到 180 度点。

因此,该伺服机构有 180 度的潜在运动,粒度为每度 1 ms/180 = 5.555 us。

接线

所选的机械臂使用 Arduino 接口板与 Digilent Arty A7 / S7 板连接。它可以通过接口板从外部供电,也可以通过接口板上的连接器提供的 5V 供电。

1c55be9e2d7ce85eab8de20bc406c3ae.jpeg

由于 5V 电流通过接口板连接器会限流,并且电机可能要求较高,因此本次使用外部DC电源为机械臂本身供电。

3c1aa87ef72f34648342ca45152e6696.jpeg d7d8c8aabaa55f66da31c05348d229be.jpeg

Vivado设计

Vivado设计比较简单,添加 AMD MicroBlaze V 处理器及其外设即可。

d4a447375c9006145c4086a5bc4e0386.png

AMD MicroBlaze V 添加后,单击运行自动化设计。

79da2b86dbf3fc0e375b318c47db5772.png

按照下图进行处理器设置:

  • 64 KB Local Memory

  • 启用调试模块

  • 启用外围 AXI 端口

  • 启用新的中断控制器和时钟向导

78e83b03918fdd2e1de737d332007e25.png

完成后如下:

d8a7d19c2e71dce061b8de2d225758a8.png

下一步是获取 Digilent Vivado 库,然后添加 PWMV2 IP 。

https://github.com/Digilent/vivado-library

342b286b06ae5290d27ad1be7c2023ef.png

该 IP 非常适合 PWM 生成,并且支持多种 PWM 输出。

cfad6dbea75cb4b444ac462ed84b2813.png

将该IP进行如下设置:

  • 六个PWM输出

2875869bf7ebd80d7a52e285a82dba1c.png

要添加的倒数第二个 IP 是 AXI UART。

### 海云捷讯机械 FPGA PWM 控制 #### 使用FPGA实现PWM信号生成 为了利用FPGA控制海云捷讯机械,可以通过配置FPGA中的逻辑资源生成脉宽调制(PWM)信号。PWM是一种有效的技术,可以用来精确地控制电机的速度和其他机电设备的动作。 在FPGA内部,PWM发生器通常由计数器和比较寄存器组成。当计数值小于设定值时输出高电平;等于或大于设定值则切换至低电平。通过调整这个阈值就可以改变占空比从而达到调节目的的效果[^1]。 下面是一个简单的VHDL代码片段用于创建基本的PWM控制器: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity pwm_generator is Port ( clk : in STD_LOGIC; -- 输入时钟信号 duty_cycle : in INTEGER range 0 to 99;-- 占空比输入(百分比形式) pwm_out : out STD_LOGIC); -- 输出PWM波形 end pwm_generator; architecture Behavioral of pwm_generator is signal counter : integer := 0; begin process(clk) begin if rising_edge(clk) then if(counter >= 99)then counter <= 0; else counter <= counter + 1; end if; if(duty_cycle > counter)then pwm_out <= '1'; else pwm_out <= '0'; end if; end if; end process; end Behavioral; ``` 此程序定义了一个名为`pwm_generator` 的实体, 它接收一个时钟信号 `clk`, 和表示期望占空比的整数参数 `duty_cycle`. 当前周期内的计数器值如果低于给定的占空比例,则设置输出为高(`'1'`),反之设为低 (`'0'`). 这样就实现了基于时间分割原理下的PWM输出. 对于特定于海云捷讯机械的应用场景来说,在实际部署之前还需要考虑如下因素: - **频率选择**: 不同类型的伺服马达可能对工作频段有不同的需求. - **分辨率优化**: 提升PWM精度有助于更细腻地操控装置运动轨迹. - **安全机制构建**: 设立保护措施防止因异常情况造成损害.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OpenFPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值