×

带PWM控制的伺服电机控制卡

消耗积分:0 | 格式:zip | 大小:0.05 MB | 2023-01-30

刘悌耀

分享资料个

电路板如下图:
pYYBAGPV72SAERd4AAD7eynbVaM213.png
poYBAGPV72eAYXHaAACn_SC9g3U229.png
pYYBAGPV72mAIrAzAACkT1cvBK4253.png
pYYBAGPV73WACrFTAACF6G38cPI559.png

组件

PCA9685PW,112 x 1
RC0603FR-0710KL
10k
× 9
SG73P1JTTD2203F
KOA Speer 电子公司
× 17
156125YS75000
伍尔特电子
x 1
IRLML6401
UMW(广东友台半导体)
x 1
593D106X9016A2TE3
威世斯普拉格
x 1

描述

带PWM控制的伺服电机控制卡

您能想象通过互联网控制任何设备吗?灯、灌溉水泵、门驱动器和许多其他东西。

该板结合了多项功能,可让您自动化和控制连接到互联网的设备。

该项目是与印刷电路板制造商 PCBWay 共同开发的。您可以访问该站点,下载所有电子板文件并免费获得 10 个 PCBWay 单元。

阅读全文并逐步了解接收电子板的步骤。

市场上有多种解决方案可用于通过互联网控制设备。但是,有一个很大的问题:你不能修改控制代码。这会阻止您创建自己的想法并根据您或客户的需要创建一些东西。

PCA8695 PWM 伺服控制器 PCBWay 板的电子原理图

伺服控制电路及编程

编程

连接到 Arduino

PWM/伺服驱动器使用 I2C,因此只需 4 根线即可连接到您的 Arduino:

“经典”Arduino 接线:

+5v -> VCC(这只是 BREAKOUT 的电源,不是伺服电源!)

接地 -> 接地

模拟 4 -> SDA

模拟 5 -> SCL

较旧的 Mega 接线:

+5v -> VCC(这只是 BREAKOUT 的电源,不是伺服电源!)

接地 -> 接地

数字 20 -> SDA

数字 21 -> SCL

R3 及之后的 Arduino 布线(Uno、Mega 和 Leonardo):

(这些板在最靠近 USB 连接器的接头上有专用的 SDA 和 SCL 引脚)

+5v -> VCC(这只是 BREAKOUT 的电源,不是伺服电源!)

接地 -> 接地

SDA -> SDA

SCL -> SCL

舵机电源

大多数伺服系统设计为在大约 5 或 6v 的电压下运行。请记住,许多伺服系统同时移动(特别是大而强大的伺服系统)将需要大量电流。即使是微型伺服系统在移动时也会消耗数百毫安。一些高扭矩伺服系统在负载下会消耗超过 1A 的电流。

好的电源选择是:

5v 2A开关电源

5v 10A开关电源

4xAA 电池座 - 6v 碱性电池。4.8v 镍氢充电电池。

来自爱好商店的 4.8 或 6v 可充电 RC 电池组。

将电容器添加到通孔电容器插槽

我们在 PCB 上有一个用于焊接电解电容器的点。根据您的使用情况,您可能需要也可能不需要电容器。如果您从电源驱动大量伺服电机,当伺服电机移动时电源电压下降很多,n * 100uF(其中 n 是伺服电机的数量)是一个很好的起点 - 例如 470uF 或更多用于 5 个伺服电机。由于它如此依赖于伺服电流消耗、每个电机的扭矩和电源,因此我们无法建议“一个神奇的电容器值”,这就是我们不在套件中包含电容器的原因。将电容器添加到通孔电容槽

连接舵机

大多数伺服系统都带有一个标准的 3 针母连接器,可直接插入伺服驱动器的接头中。务必将插头与地线(通常为黑色或棕色)与最下面一行和顶部的信号线(通常为黄色或白色)对齐。连接舵机

添加更多伺服系统

一块板上最多可以连接 16 个舵机。如果您需要控制 16 个以上的舵机,可以按照下一页所述链接其他板。

链接驱动程序

可以链接多个驱动器(最多 62 个)以控制更多的伺服系统。电路板两端都有接头,接线就像将 6 针并行电缆从一个电路板连接到另一个电路板一样简单。

向董事会致辞

链中的每个板都必须分配一个唯一的地址。这是通过板右上边缘的地址跳线完成的。每个板的 I2C 基地址是 0x40。您使用地址跳线编程的二进制地址被添加到 I2C 基址。

要对地址偏移量进行编程,请使用一滴焊料桥接地址中每个二进制“1”的相应地址跳线。

板 0:地址 = 0x40 偏移量 = 二进制 00000(无需跳线)

Board 1: Address = 0x41 Offset = binary 00001 (bridge A0 as in the photo above)

电路板 2:地址 = 0x42 偏移量 = 二进制 00010(桥 A1)

电路板 3:地址 = 0x43 偏移量 = 二进制 00011(桥 A0 和 A1)

电路板 4:地址 = 0x44 偏移量 = 二进制 00100(桥 A2)

等等

在您的草图中,您需要为每个板声明一个单独的 pobject。在每个对象上调用 begin,并通过它所附加的对象控制每个伺服。例如:

#include

#include

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);

Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);

无效设置(){

序列号.begin(9600);

Serial.println("16通道PWM测试!");

pwm1.开始();

pwm1.setPWMFreq(1600); // 这是最大 PWM 频率

pwm2.开始();

pwm2.setPWMFreq(1600); // 这是最大 PWM 频率

}

使用 Adafruit 库

由于 PWM 伺服驱动器是通过 I2C 控制的,因此它非常容易与任何微控制器或微型计算机一起使用。在这个演示中,我们将展示如何将它与 Arduino IDE 一起使用,但 C++ 代码可以轻松移植

安装 Adafruit PCA9685 库

要开始读取传感器数据,您需要安装 Adafruit_PWMServo 库(我们的 github 存储库中的代码)。它可从 Arduino 库管理器获得,因此我们建议使用它。

从 IDE 打开库管理器...并输入 adafruit pwm 以找到库。点击安装

我们还有一个关于 Arduino 库安装的很棒的教程:

http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use

使用示例代码进行测试:

首先确保关闭 Arduino IDE 的所有副本。

接下来打开 Arduino IDE 并选择 File->Examples->Adafruit_PWMServoDriver->Servo。这将在 IDE 窗口中打开示例文件。

如果使用突破:

如上一页所示连接驱动板和舵机。不要忘记为 Vin(3-5V 逻辑电平)和 V+(5V 伺服电源)供电。检查绿色 LED 是否亮起!

如果使用盾牌:

将扩展板插入您的 Arduino。不要忘记,您还必须为 V+ 接线端子提供 5V 电压。红色和绿色 LED 都必须点亮。

如果使用 FeatherWing:

将 FeatherWing 插入您的 Feather。不要忘记,您还必须为 V+ 接线端子提供 5V 电压。检查绿色 LED 是否亮起!

连接伺服

单个伺服应插入 PWM #0 端口,第一个端口。您应该看到舵机在大约 180 度范围内来回扫过。

校准你的舵机

伺服脉冲时序因品牌和型号而异。由于是模拟控制电路,同品牌同型号样品之间往往存在一定差异。对于精确的位置控制,您需要校准代码中的最小和最大脉冲宽度以匹配伺服的已知位置。

找到最小值:

使用示例代码,编辑 SERVOMIN,直到扫描的低点达到最小行程范围。最好逐渐接近并在达到行程的物理极限之前停止。

找到最大值:

再次使用示例代码,编辑 SERVOMAX,直到扫描的高点达到最大行程范围。同样,最好逐渐接近并在达到行程的物理极限之前停止。

从度数转换为脉冲长度

Arduino“map()”函数是一种在旋转度数与校准的 SERVOMIN 和 SERVOMAX 脉冲长度之间进行转换的简单方法。假设一个典型的舵机旋转 180 度;将 SERVOMIN 校准到 0 度位置并将 SERVOMAX 校准到 180 度位置后,您可以使用以下代码行将 0 到 180 度之间的任何角度转换为相应的脉冲长度:

pulselength = map(度, 0, 180, SERVOMIN, SERVOMAX);

图书馆参考

setPWMFreq(频率)

描述

此功能可用于调整 PWM 频率,它决定了 IC 每秒产生多少完整“脉冲”。换句话说,考虑到脉冲的高段和低段,频率决定了每个脉冲从开始到结束的持续时间“有多长”。

频率在 PWM 中很重要,因为将频率设置得太高且占空比非常小会导致问题,因为信号的“上升时间”(从 0V 到 VCC 所需的时间)可能长于时间信号有效,PWM 输出将显得平滑,甚至可能达不到 VCC,这可能会导致许多问题。

参数

freq:表示频率的数字,单位为 Hz,介于 40 和 1600 之间

例子

以下代码将 PWM 频率设置为 1000Hz:

脉宽调制.setPWMFreq(1000)

setPWM(通道,开,关)

描述

此函数设置特定通道上 PWM 脉冲高段的开始(开)和结束(关)。当信号打开和​​关闭时,您指定 0..4095 之间的“刻度”值。通道指示 16 个 PWM 输出中的哪一个应该更新为新值。

参数

channel:应使用新值 (0..15) 更新的通道

on:信号应从低电平转换为高电平时的刻度(在 0..4095 之间)

off:信号应该从高到低转换时的刻度(0..4095 之间)

例子

以下示例将导致通道 15 从低开始,进入脉冲约 25% 的高电平(勾选 4096 中的 1024),转换回低 75% 进入脉冲(勾选 3072),并在最后 25% 的时间内保持低电平脉搏:

pwm.setPWM(15, 1024, 3072)

用作 GPIO

还有一些特殊设置可以完全打开或完全关闭引脚

您可以将引脚设置为完全开启

pwm.setPWM(pin, 4096, 0);

您可以将引脚设置为完全关闭

pwm.setPWM(pin, 0, 4096);

例子

以下示例将导致通道 15 从低开始,进入脉冲约 25% 的高电平(勾选 4096 中的 1024),转换回低 75% 进入脉冲(勾选 3072),并在最后 25% 的时间内保持低电平脉搏:

pwm.setPWM(15, 1024, 3072)

用作 GPIO

还有一些特殊设置可以完全打开或完全关闭引脚

您可以将引脚设置为完全开启

pwm.setPWM(pin, 4096, 0);

您可以将引脚设置为完全关闭

pwm.setPWM(pin, 0, 4096);

poYBAGPV74OAduI5AAAiUW85La4501.png

pYYBAGPV74WAdo2xAABRelL167Y942.png

poYBAGPV74eAPb_lAABi1W9nx0A422.png

bef

代码

PCA9685

C/C++

  /***************************************************
  This is an example for our Adafruit 16-channel PWM & Servo driver
  Servo test - this will drive 8 servos, one after the other on the
  first 8 pins of the PCA9685
   
  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/products/815
   
  These drivers use I2C to communicate, 2 pins are required to
  interface.
   
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!
   
  Written by Limor Fried/Ladyada for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
  ****************************************************/
   
  #include
  #include
   
  // called this way, it uses the default address 0x40
  Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
  // you can also call it with a different address you want
  //Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
  // you can also call it with a different address and I2C interface
  //Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40, Wire);
   
  // Depending on your servo make, the pulse width min and max may vary, you
  // want these to be as small/large as possible without hitting the hard stop
  // for max range. You'll have to tweak them as necessary to match the servos you
  // have!
  #define SERVOMIN120 // This is the 'minimum' pulse length count (out of 4096)(use135)
  #define SERVOMAX630 // This is the 'maximum' pulse length count (out of 4096)(use615)
   
   
  // our servo # counter
  uint8_t servonum = 0;
   
  void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
   
  pwm.begin();
   
  pwm.setPWMFreq(60);// Analog servos run at ~60 Hz updates
  }
   
  void loop() {
   
  pwm.setPWM(0, 0, 135);
  delay(500);
  pwm.setPWM(1, 0, 135);
  delay(500);
  pwm.setPWM(2, 0, 135);
  delay(500);
  pwm.setPWM(3, 0, 135);
  delay(500);
   
  pwm.setPWM(0, 0, 615);
  delay(500);
  pwm.setPWM(1, 0, 615);
  delay(500);
  pwm.setPWM(2, 0, 615);
  delay(500);
  pwm.setPWM(3, 0, 615);
  delay(500);
   
  pwm.setPWM(0, 0, 135);
  pwm.setPWM(1, 0, 135);
  pwm.setPWM(2, 0, 135);
  pwm.setPWM(3, 0, 135);
  delay(1500);
   
  pwm.setPWM(0, 0, 615);
  pwm.setPWM(1, 0, 615);
  pwm.setPWM(2, 0, 615);
  pwm.setPWM(3, 0, 615);
  delay(1500);
   
  }

 

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !