pca9685 读取_结合 RTThread 了解 PCA9685 扩展 I/O 的应用(带 PWM 功能,I2C 通信)

本文深入解析PCA9685的硬件特点,如12位PWM分辨率和16路输出,并详细介绍了如何使用PCA9685进行舵机控制,包括50Hz PWM频率、时间和角度分辨率。同时,文章探讨了RT-Thread的PCA9685驱动组件,展示了如何通过I2C通信设置PWM频率和进行设备控制。
摘要由CSDN通过智能技术生成

背景介绍:
上一篇《看 Sugar 如何说 I2C 通信》中 Sugar 从硬件角度说了 I2C 总线,其实就是在为这一篇打个基础。
JetBot 小车使用的电机驱动模块上用了 PCA9685 扩展 I/O ,一边与主控通过 I2C 总线通信,另一边连接 TB6612 马达驱动芯片。
本篇 Sugar 就来有根有据地说一说 PCA9685 的使用,以及 RT-Thread PCA9685 驱动组件。

11f58f6a81be5aa5ccf083bccbd6f511.png

硬件特点

1、每路 12 位分辨率(4096 级)的 PWM;
2、最多 16 路 PWM 输出,所有路 PWM 频率统一,每路占空比可以独立控制;
3、I2C 通信方式;
4、支持 2.3V~5.5V 电压,逻辑电平 3.3V;
5、复位方式:上电复位、软件复位。

用于舵机控制的 PWM

一、明确控制信号

1、用于舵机控制的 PWM 频率是 50Hz(周期 20000us)
2、对于 12 位分辨率而言,时间控制精度(即:时间分辨率)就是

9a27b94e1e1fcda453a6e2df428b62bb.png

3、舵机的控制脉宽是0.5ms ~ 2.5ms,时间伸缩范围是 2000us
4、伸缩范围在 4.88us 时间分辨率下可以分成近 410 份。

0a9ed618c77a38f63f1aa4a21b3d2c38.png

5、时间伸缩范围 2000us 对应舵机转动范围 0~180 度,因此舵机的角度分辨率约为 0.439 度

34d6b515d168f4f8eac372e7398596ad.png

二、在 PCA9685 手册里查芯片用法

1、芯片长什么样

2d3dbdfae540e7e7dceaabc9302745a8.png

2、引脚功能

64b0adbb26a31b1a3f0861c3cf1964d7.png

3、I2C 地址

da6ce4bc66a75dae53e2e1186c8d8427.png

地址引脚由 A0 ~ A5 组成,因此最多可以有 64 个地址。由于芯片本身保留 All Call 7 位地址 0xE0 以及 Software Reset 7位地址 0x06,所以有 62 个地址可用。

在默认情况下(即:A0 ~ A5 全部接地),其 7 位地址为 0x40

4、目标寄存器

(1) MODE1 寄存器,地址0x00,可读、可写。

351ebc4634571d72d0e898e299b3f9e6.png

(2) MODE2 寄存器,地址0x01,可读、可写。

e17057444097894f5346187c345c0fbc.png

(3) 每路 PWM 有 4 个 8 位控制寄存器,地址见 datasheet,可读、可写。

a68dab57b27b21415c6507ded90c1ef2.png

4 个 8 位寄存器在手册上说成:2 路 12 位寄存器。2 个 12 位寄存器分别控制该路输出的高、低电平时间,最大数值是 4095

根据下面的 Example 1 不难了解到这 2 个 12 位寄存器的意思是:每个周期从第几个 count 开始置 1,则 LEDx_ON 寄存器写几(十六进制形式);每个周期从第几个 count 开始清 0,则 LEDx_OFF 寄存器写几。

7ca50db356c05306d521b792952ba3ec.png

下图的 4 个 example 表示了一般情况下 2 个 12 位寄存器设置情况与输出的关系。

4990aaf155cf06fa879038021dab06b3.png

下图的 4 个 example 表示了 ON 寄存器值 < OFF 寄存器值情况下的输出。

c85946a827c452ec4c3e5044f2835a74.png

下图的 4 个 example 表示了 ON 寄存器值 > OFF 寄存器值情况下的输出。

c96fd945f777ba7bf4faa7b84ac418a7.png

(4) PWM 频率设置寄存器 PRE_SCALE,地址0xFE,可读、可写。

8971debd22e79f412a19a9e95dd96a51.png

芯片内置 25MHz 的晶振,update_rate 是以 Hz 为单位的频率值。因此,对于 50Hz 的 PWM 来讲此寄存器应设置为 121。

RT-Thread 的 PCA9685 驱动组件

a37ea09c9c030e3ef9b1bb4fe6599bfc.png

硬件连接如上图,Sugar 使用了最常见的 PCA9658 舵机控制模块,接上逻辑分析仪看数据。

24e31ed88598fca32e1b0cfb46ea36fe.png

一、第 1 段

展开第一段通信内容,如下图:

200eb0645999093f467285ebbc13468b.png

上图黄色框中“向 40 号地址写两个 0 ”的意思是:向地址为 40 的设备地址为 0 的寄存器写入数据 0。

相应的,后面蓝色框就解读为:读取地址为 40 的设备地址为 0 的寄存器值,设备反回目标寄存器里的数据值为 0。

下面到代码里去找这段通信的相关内容,如下:

39020cc844592fd61e736b2c5419d2cf.png

024b85c33bd26300051484ffb77cb810.png

75323fb192516d1ebd0cf87665b635ef.png

二、第 2 段

根据 PCA9685 的 datasheet 所述,设置 PWM 输出频率的时候要先进入 SLEEP 模式。并且从 SLEEP 模式重启的流程是在 datasheet 里指定的。

在 RT-Thread 的 PCA9685 的组件包里,把设置频率相关的一干操作都封装到了一个函数 pca9685_set_pwm_freq() 里面。

a87b09e3da093d96167f822b08e5344a.png

三、第 3 段

ccb8db2da76374921adbcc30e469c09b.png

上面已经把研究方法说透了,这里就不再把逻辑分析仪的图放上来了。通过对代码的分析,Sugar 发现 RT-Thread 这个 PCA9685 的驱动组件包传承了 RT-Thread 本身小而美的特点,按照 PCA9685 的 datasheet 封装函数,这样使得对 PCA9685 的了解容易很多。

以 Arduino “以使用方便”为目的不同,PCA9685 组件包倾向于真正让人弄懂 PCA9685 的用法。在懂了之后,个人就有能力自己“以使用方便”为目的再次做一遍封装。很多玩过 Arduino 的人都觉得做起来真简单,离了 Arduino 的环境真不会。

Arduino 面对的是小白,以方便体验为主,而 RT-Thread 和其一众组件能够让人真正了解深层次的本源,搞懂这些能让人在成为高手的路上走得更轻松。当成为高手之后,再回头看 Arduino 才能体会到 Arduino 封装的真正智慧。

关注作者

欢迎扫码关注我的公众号MultiMCU EDU050fb1d4e2eb24103150e1bd2d67d136.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值