如何使用PSOC™6板和MicroPython控制两种不同类型的伺服电机
扫描二维码
随时随地手机看文章
你有没有想过到底是什么在移动RC飞机的副翼或3d打印的机械手?你在YouTube上看到的许多很酷的移动项目都是由廉价的业余伺服电机秘密驱动的。
在这个protip中,我们将使用PSOC™6 Wi-Fi BT原型工具包和几行MicroPython制作两个常见的伺服器旋转和扫描。
顺便说一下:
PSOC™6 Wi-Fi BT原型工具包是一款开发板,具有PSOC™6(可编程片上系统)微控制器,这是一种功能强大且灵活的芯片,可用于广泛的应用。以下是我们用这种芯片完成的一些项目:鳄鱼肱二头肌训练器、慕尼黑啤酒节智能啤酒斯坦或自平衡机器人。
引出线
第一步是将您的板连接到伺服电机和PC。rc -伺服电机一般有三种输出:
•最暗的电线连接到GND。
•中间的一个连接到VCC(检查您的数据表所需的电压)。
•最轻的连接到任何支持PWM通信的引脚(我们将在稍后讨论)。在这种情况下,我们选择了pin 9.7,但是你可以使用任何一个你喜欢的,你只需要相应地改变代码。
要连接到PC,请将micro-USB插入左上方的连接器(KitProg3 USB连接器)。
设置MicroPython
如果这是您第一次在PSOC™6原型工具包上使用MicroPython,您需要首先将软件闪存到微控制器上。我们已经准备了一个protip和一篇文章来解释如何在PSOC™6上使用MicroPython。
伺服电机与PWM通信
什么是PWM, PWM通信是如何工作的?
PWM代表“脉冲宽度调制”,是微控制器与伺服电机和其他组件通信的一种方式。每个电机都有一个频率作为设定参数(检查相应电机的数据表),微控制器向电机发送一个脉冲,因此每周期T = 1/f一次。
输入是由信号在T期间被设置为高(脉冲宽度)的时间长短来接收的,通常在电机特定范围内。调制(改变)脉冲宽度将改变你的电机输出。
不同的伺服器有不同的方式来解释这些数据,今天我们将看两个使用SG90(位置伺服)和MG995(连续伺服)的例子。
与PSOC™6的一般通信
连接板和使用thony IDE
我们将使用ony IDE来运行代码。要连接到微控制器并使用MicroPython,请创建一个新文件,并按Tools > Options > Interpreter。在那里,将解释器设置为MicroPython(通用),端口设置为KitProg3 USB-UART @您的COM端口(在本例中为COM4)。
设置引脚和PWM
首先,您需要从机器库中导入PWM库。然后,通过声明引脚(本例中为引脚9.7)、设置PWM频率并初始化脉冲宽度,将引脚设置为PWM引脚。starting_pw将在后面根据我们使用的电机来定义。
提示:设置脉冲宽度
有许多不同的方法来设置脉冲宽度,例如:使用PWM库中定义的两个函数。如上所示,第一个使用duty_ns()函数以纳秒为单位设置脉冲宽度。第二个是通过使用duty_u16()函数发送一个无符号16位整数来设置它。这表示占空比(电流脉冲宽度与周期的比率),其值范围从周期的0%(0位)到周期T的100%(2^16 = 65,536位)。
查看更多关于PWM控制与PSOC™6 Wi-Fi BT原型工具包在这里!
例1:位置马达
一般
定位电机以脉冲宽度作为输入,并将其映射到一定角度,如下图所示:
参数
我们的电机有这些参数:
•Angle_max = 180°
•Angle_min = 0°
•频率= 50hz;周期= 20ms
•Pw_min = 0.5 ms:我们的最小脉冲宽度为0.5 ms或500000 ns,这将使我们的电机设置为最小角度。
•Pw_max = 2.5 ms:我们的最大脉冲宽度为2.5 ms或2500000 ns,这将设置我们的电机到我们的最大角度。
代码
我们的目标是创建一个名为set_motor_to_angle()的函数,该函数将所需的角度作为输入,将其转换为脉冲宽度,并将其发送给电机。为了做到这一点,我们将定义一个辅助函数angle_to_ns()来完成所有的脉冲宽度计算。
例2:连续电机
一般
连续电机将脉冲宽度映射到电机的速度,如下图所示:
参数
这里使用的电机有以下参数:
•Pw_min = 1ms:顺时针方向全速旋转(正转速)。
•Pw_max = 2ms:表示逆时针全速旋转(负速度)。
•gradient = -777846 ns/Hz:表示脉冲宽度/转速的比值。我们将在函数中使用它来映射旋转速度到脉冲宽度。你可以从数据表中得到这个数字,也可以自己计算出来。
•pw_stationary = (pw_max-pw_min)/2 + pw_min = 1.5 ms:这是电机速度为0 Hz时的脉冲宽度值(当它静止时)。我们需要这个(或图上的任何其他点),因为一个线性函数需要一个梯度和一个点来完全定义。
计算梯度
我们的第一个假设是我们的速度脉宽比近似线性,这大大简化了我们的计算。为了重建图形,我们需要测量一些数据点并使用它们计算梯度。实际的函数将以a*x + b的格式使用梯度(a)和图上的一个点(b)。
提示:测量转速
这可以通过将电机设置为一定的脉冲宽度并用手机相机拍摄来完成。把它放在某个东西旁边,帮助跟踪它的运动,让它旋转10-20次,以尽量减少错误,提高精度。然后一帧一帧地回放镜头,看看所有这些回合花了多长时间,并计算:(回合数)/(时间)来获得每秒的旋转。
代码
我们的目标是创建一个名为set_motor_to_speed()的函数,它将我们期望的速度作为输入,将其转换为脉冲宽度,并将其发送给电机。为了做到这一点,我们将定义一个辅助函数speed_to_ns()来完成所有的脉冲宽度计算。
本文编译自hackster.io





