使用PYNQ生成PWM波控制舵机/步进电机/机械臂
在开始这个工程之前,你需要PYNQ-Z2的板卡文件,约束文件,原理图作为参考,你可以在我上传的资源里下载。
当然,这个工程也适用于PYNQ-Z1,只需要改一下板卡文件和约束文件。
我使用的舵机如下:
1. PWM 信号
脉宽调制(PWM)是一种调制技术,它生成可变宽度的脉冲来表示模拟输入信号的幅度。
我们关注两个参数:
信号频率(或周期)和信号占空比:
-
周期是信号从低到高所需的时间
-
占空比是高电平时间占信号周期的比例。
2. 用于 PWM 的 IP 核:Axi Timer
Xilinx 提供的唯一能够生成 PWM 信号的 IP 核是 Axi Timer。Axi Timer 由 S_AXI 接口控制的,它输出两种类型的输出:
-
一个定时器输出,用于生成一个简单的时钟定时器
-
一个 PWM,用于生成一个 PWM 信号
因此,根据这一点,我们将创建一个设计,该设计生成一个与 PYNQ Z2 的特定引脚相连的 PWM 信号。
3. PWM 的 Vivado 设计
Vivado 流程是通用的:
-
首先,新建一个vivado工程,步骤如下:
-
创建一个Block Design,步骤如下:
-
AXI Timer的添加也类似,想要驱动几个舵机,就添加几个AXI Timer,由于我控制的是四自由度的机械臂,所以这里用 4 个 AXI Timer,然后让它们自动连线:
-
将 4 个 PWM 端口引出来,并且修改端口名字:
-
可以点击这里验证自己的设计是否正确:
-
在我们的设计中,我们定义了以下约束文件(对于4自由度的机械臂,我们需要4个PWM信号控制4个舵机,所以我们连接了 PMODB下面的 4 个引脚):
-
约束文件内容如下:
set_property -dict {PACKAGE_PIN W14 IOSTANDARD LVCMOS33} [get_ports {motor0}] set_property -dict {PACKAGE_PIN Y14 IOSTANDARD LVCMOS33} [get_ports {motor1}] set_property -dict {PACKAGE_PIN T11 IOSTANDARD LVCMOS33} [get_ports {motor2}] set_property -dict {PACKAGE_PIN T10 IOSTANDARD LVCMOS33} [get_ports {motor3}]
-
现在讲解怎么确定管脚的绑定,根据PYNQ-Z2原理图,我们可以看到,PMODB下面四个管脚对应的序号为JB1P,JB1N,JB2P,JB2N,在IO口(BANK)寻找对应的序号,我们发现,这四个序号对应的管脚编号分别为W14,Y14,T11,T10,将 Block Design 中引出的 PWM 端口绑定到这四个管脚上,这样我们约束文件也就确定好了。
-
Create HDL Wrapper(将设计的顶层模块包装成一个HDL文件)
-
最后,生成 bit 流,当看到右上角write_bitstream Complete说明比特流生成成功。
- 比特流生成成功后,你将会在
pwm_stepper_motor\pwm_stepper_motor.runs\impl_1
看到生成的design_1_wrapper.bit
文件,在pwm_stepper_motor\pwm_stepper_motor.srcs\sources_1\bd\design_1\hw_handoff
文件夹中看到生成的design_1.hwh
,这两个是pynq开发的必要文件,将它们改名为pwm_stepper_motor.bit
和pwm_stepper_motor.hwh
(注意!两个文件名要相同)。 - 打开 Jupyter Notebook ,创建一个
pwm_stepper_motor.ipynb
文件,将它和pwm_stepper_motor.bit
、pwm_stepper_motor.hwh
这两个文件放在同一个文件夹下。
4.生成 PWM 的 Pynq 代码
现在,我们有了比特流。我们如何使用它呢?
你必须阅读 Axi Timer 的文档
标签:val,temp,舵机,PYNQ,address,period,offset,bit,PWM From: https://www.cnblogs.com/Astron-fjh/p/18510809