详情参考:https://blog.csdn.net/qq_18676517/article/details/104873374


1 基本介绍

1.1 该IC主要参数特征如下:

  • I2C接口,支持高达16路PWM输出,每路12位分辨率(4096级)
  • 内置25MHz晶振,可不连接外部晶振,也可以连接外部晶振,最大50MHz
  • 支持2.3V-5.5V电压,最大耐压值5.5V,逻辑电平3.3V
  • 具有上电复位,以及软件复位等功能
    :本教程侧重PCA9685的PWM输出,但PCA9685亦可用于WS2812等LED颜色控制等。

1.2 控制精度

假设舵机为50HZ的控制频率,脉宽为0.5ms~2.5ms,12位分辨率(4096级),相关精度计算如下:

2 硬件参数

2.1 封装及引脚排列

PCA9685有两种封装:TSSOP28, HVQFN28,其相应的引脚排列如下图所示:

引脚功能描述如下图所示:

2.2 器件地址

PCA9685的器件地址是由引脚A0,A1,A2,A3,A4,A5共同决定,并且该引脚不可悬空,由于有6个引脚共同决定器件地址,因此,可以有64个器件地址,由于该IC上电便保留LED All Call address (E0h,1110 000)以及Software Reset address(06h,0000 0110),实际仅有62个可用器件地址,因此,理论上,1个I2C接口可控制16*62=992路PWM,其引脚控制器件地址的示意图如下图所示:

默认情况下,若将A0-A5全部接地,则其器件地址为:0x40。

2.3 寄存器及其地址

默认情况下,上电复位后,寄存器地址的默认值均为0,寄存器地址及其用途见下图所示:

图中节选的部分寄存器地址中,主要关心以下寄存器:

  • 模式设置寄存器:MODE1,MODE2。
  • 脉宽(占空比)设置寄存器:LED0_ON_L,LED0_ON_H,LED0_OFF_L,LED0_OFF_H......LED15......每一路PWM通道占用4个寄存器。
  • 周期(频率)设置寄存器:PRE_SCALE。
    接下来介绍以上寄存器的使用及其注意事项。

2.4 模式设置寄存器

2.4.1 MODE1寄存器

首先介绍MODE1寄存器,如下图:

在使用该寄存器的时候要注意:

  • 如果未停止所有PWM输出就将其进入到睡眠模式,那么,所有输出通道在下一轮都将输出高电平。

  • 睡眠后重新启动PWM的操作为:

  • 注意,在设置PWM频率(写PRESCALE寄存器)的时候,要先设置为Sleep模式,请参考后面源码部分。

2.4.2 MODE2寄存器

该寄存器的各位功能如下图所示:

2.5 PWM通道寄存器及其占空比设置

PWM通道寄存器如下图:

由图可知,对于每一个通道,有4个寄存器,每个寄存器图解如下图所示:


在设置PWM占空比的时候,首先,配置舵机的示例如下图所示(ON < OFF的情况):

当特殊情况下,PWM周期大于定时器一次计数时,如下图所示(ON>OFF的情况):

2.6 PWM周期(频率)寄存器及其周期(频率)设置

接下来介绍配置PWM频率的寄存器:
一般情况下,在用内置晶振,为25MHZ,通过配置PRE_SCALE寄存器进行配置,配置的PRE_SCALE寄存器的值与PWM频率的关系如下图所示:

如果在舵机控制中,采用内置晶振,取osc_clock=25000000,update_rate=50(舵机控制频率50Hz)

2.7 推荐硬件设计

首先,OE引脚须接低电平以确保IC使能,如果连接LED灯,则推荐以下几种连接方式,如下图所示:

3 软件设计

树莓派平台Python版

要运行该程序,首先选装python,安装好Python后,还需要安装树莓派平台的smbus库:

sudo apt-get install python-smbus

树莓派平台采用Python驱动PCA9685的Python代码如下所示:

#!/usr/bin/pythonimport time
import math
import smbus# ============================================================================
# Raspi PCA9685 16-Channel PWM Servo Driver
# ============================================================================class PCA9685:# Registers/etc.__SUBADR1            = 0x02__SUBADR2            = 0x03__SUBADR3            = 0x04__MODE1              = 0x00__PRESCALE           = 0xFE__LED0_ON_L          = 0x06__LED0_ON_H          = 0x07__LED0_OFF_L         = 0x08__LED0_OFF_H         = 0x09__ALLLED_ON_L        = 0xFA__ALLLED_ON_H        = 0xFB__ALLLED_OFF_L       = 0xFC__ALLLED_OFF_H       = 0xFDdef __init__(self, address=0x40, debug=False):self.bus = smbus.SMBus(1)self.address = addressself.debug = debugif (self.debug):print("Reseting PCA9685")self.write(self.__MODE1, 0x00)def write(self, reg, value):"Writes an 8-bit value to the specified register/address"self.bus.write_byte_data(self.address, reg, value)if (self.debug):print("I2C: Write 0x%02X to register 0x%02X" % (value, reg))def read(self, reg):"Read an unsigned byte from the I2C device"result = self.bus.read_byte_data(self.address, reg)if (self.debug):print("I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" % (self.address, result & 0xFF, reg))return resultdef setPWMFreq(self, freq):"Sets the PWM frequency"prescaleval = 25000000.0    # 25MHzprescaleval /= 4096.0       # 12-bitprescaleval /= float(freq)prescaleval -= 1.0if (self.debug):print("Setting PWM frequency to %d Hz" % freq)print("Estimated pre-scale: %d" % prescaleval)prescale = math.floor(prescaleval + 0.5)if (self.debug):print("Final pre-scale: %d" % prescale)oldmode = self.read(self.__MODE1);newmode = (oldmode & 0x7F) | 0x10        # sleepself.write(self.__MODE1, newmode)        # go to sleepself.write(self.__PRESCALE, int(math.floor(prescale)))self.write(self.__MODE1, oldmode)time.sleep(0.005)self.write(self.__MODE1, oldmode | 0x80)def setPWM(self, channel, on, off):"Sets a single PWM channel"self.write(self.__LED0_ON_L+4*channel, on & 0xFF)self.write(self.__LED0_ON_H+4*channel, on >> 8)self.write(self.__LED0_OFF_L+4*channel, off & 0xFF)self.write(self.__LED0_OFF_H+4*channel, off >> 8)if (self.debug):print("channel: %d  LED_ON: %d LED_OFF: %d" % (channel,on,off))def setServoPulse(self, channel, pulse):"Sets the Servo Pulse,The PWM frequency must be 50HZ"pulse = pulse*4096/20000        #PWM frequency is 50HZ,the period is 20000usself.setPWM(channel, 0, pulse)if __name__=='__main__':pwm = PCA9685(0x40, debug=True)pwm.setPWMFreq(50)while True:# setServoPulse(2,2500)for i in range(500,2500,10):  pwm.setServoPulse(0,i)   time.sleep(0.02)     for i in range(2500,500,-10):pwm.setServoPulse(0,i) time.sleep(0.02)

保存文件命名为: pca9685.py,命令行进入该文件所在的路径,运行该Python脚本:

sudo python pca9685.py

执行该命令后,便可控制舵机从0度转到180度,再从180度转到0度。

Jetson Xavier NX (16) -- Jetson IIC: PCA9685相关推荐

  1. 【模型部署】Jetson Xavier NX(eMMC)部署YOLOv5-5.0

    文章目录 前言 NVIDIA Jetson Jetson Xavier NX 版本区别(SD | eMMC) 规格参数 Jetpack4.6.1环境搭建 烧录系统(OS) SSD启动 SSD分区 设置 ...

  2. Jetson Xavier NX (11) -- NX介绍与系统烧录

    目录 1.  Jetson Xavier NX介绍 1.1 NX 性能 1.2 硬件总览 1.3 相关资料 2. 系统烧录 2.1 下载官方镜像 2.2  格式化SD卡 2.3 烧录系统 3 测试 1 ...

  3. Nvidia Jetson Orin NX(一)

    前言 网上现在有一些orin nx的教程都是用sdkmanager刷系统的,但是不知道为什么我的orin nx用sdkmanager一直是failed.只好去nvidia developer找一些解决 ...

  4. Jetson Xavier NX刷机安装Ubuntu20.04,配置CUDA,cuDNN,Pytorch等环境教程(英伟达官方源安装,理论适用其它Jetson设备)

    一.准备工作 硬件:Jetson Xavier NX开发板(笔者购入为带128g内存条的EMMC版).跳线帽(杜邦线).microUSB转USB数据线.电源线 软件:Ubuntu host主机(可运行 ...

  5. Jetson Xavier NX部署Yolov5(GPU版)

    根据我自身的成功部署经验进行了总结,首先希望可以帮助到有需要的朋友们. 一.前期准备: 1.硬件准备: Jetson Xavier NX开发板(带128g内存条的EMMC版).跳线帽(杜邦线).mic ...

  6. 在Jetson Xavier NX安装中文输入法(googlepinyin中文输入法)

    文章目录: 1 Jetson Xavier NX安装输入法说明 2 Jetson Xavier NX 1 Jetson Xavier NX安装输入法说明 Jetson Xavier NX是arm架构, ...

  7. 仅信用卡大小,性能比TX2强15倍,英伟达边缘AI计算新品Jetson Xavier NX

    点击我爱计算机视觉标星,更快获取CVML新技术 晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 英伟达最近发布了Jetson Xavier NX,这是一个用于在无人机.汽车和机器人等边缘 ...

  8. Jetson Xavier NX远程桌面VNC使用

    0 准备 Jetson Xavier NX(Ubuntu18.04) 笔记本电脑(Ubuntu18.04) 1 说明 Jetson Xavier NX为服务端,需要进行一些配置. 笔记本电脑为客户端, ...

  9. Jetson Xavier NX 套件

    嘿,朋友们,咋们的NVIDIA又发布了新产品咯,那就是我们的Xavier NX套件横空出世啦, NVIDIA Jetson Xavier NX 是外形小巧的模组系统 (SOM),可为边缘系统提供超级计 ...

最新文章

  1. photoshop CS不能打字,出现死机等现象的解决办法!!
  2. Spring-ApplicationContext解读
  3. Memcached的使用
  4. python源码精要(10)-python源代码阅读概要(1)
  5. hiho一下 第七周 Hihocoder #1043 : 完全背包
  6. 字节流转化为文件流_字节流转成字符串之后,在通过字符串转成字节流后的文件为什么会不一样?...
  7. 初识设计模式(装饰者模式)
  8. Sublime Text设置快捷键让html文件在浏览器打开
  9. 怎么知道Win10的电脑是否满足Win11的硬件要求
  10. SpringMVC流程架构图
  11. Elasticsearch整理笔记(五)
  12. CVPR2019 | AlphaPose升级!上交大开源密集人群姿态估计代码
  13. java游戏有牧师_JAVA内部类是怎么玩儿的
  14. 图像处理一:形态学膨胀和腐蚀
  15. Linux宝库幕后推手齐聚OpenInfra Days China
  16. Opencv中convertTo函数
  17. 软件工程期末考试试题及答案(详细、经典)
  18. [小说]魔王冢(22)启程
  19. 一款免费好用的英文润色软件(1Checker没错,这是免费的)
  20. 搜索引擎优化、常用SEO优化方法总结

热门文章

  1. 7-3 BFS应用 LC的绝地求生 (25 分)
  2. Dell Inspirion 5547电脑 Hackintosh 黑苹果efi引导文件
  3. 【antd pro】关于 drawer 使用的一些思考
  4. VSCode的C/C++扩展功能
  5. 修改级联组件el-cascader默认文字样式
  6. 怎么掌握Java开发技能 常用微服务框架有哪些
  7. 前端页面请求转发(forward)与重定向(redirect)
  8. 一加ACE和OPPO K10 Pro参数 一加ACE和OPPO K10 Pro对比
  9. Ubuntu C++ OpenCV 在图像上显示中文
  10. 亲子游戏:逻辑不一样[图]