精华内容
下载资源
问答
  • pca9685-lib 关于库 Pca9685-lib is for supporing multiple Pca9685 boards together in chain with less complexcity of the programming max we can connect 64 Pca9685 together in chain which will give ...
  • PCA9685 I2C 16通道PWM /伺服驱动器模块 这是一个npm模块,可以与PCA9685 I2C 16通道PWM /伺服驱动器进行交互。 有关PCA9685的信息可以在找到,可以从购买。 用法 var i2cBus = require ( "i2c-bus" ) ; var Pca...
  • 当初急用但直接在网上翻遍了也没找到PCA9685版的OTTO机器人,库是从M5stack找的。直接上全部源代码和当初的参考文献吧。需要请自取。 正文 https://www.ottodiy.com/Otto 机器人的官网。下面的图是官网截图。 这个...
  • 安卓-东西-PCA9685 适用于PCA9685 PWM芯片和Servos的Android-Things库
  • Pca9685-Servo-LED-Lib 关于库 Pca9685-Servo-Led-Lib is for supporing multiple Pca9685 boards together in chain without complexcity of the programming max we can connect 64 Pca9685 together in chain ...
  • PCA9685资料

    2016-08-14 00:12:53
    PCA9685资料
  • PCA9685 RGB.zip

    2019-09-17 11:17:31
    代码中含有详细注释,版型为STm32f407VET6,硬件IIC控制PCA9685,16个通道 可单独改变占空比,实现RGB全色域调节,使用时 请注意自己PCA9685的芯片读写地址。如何确定地址,请看PCA9685的数据手册
  • PCA9685.zip

    2019-06-13 10:40:47
    PCA9685精确控制舵机角度stm32c8t6,通过改进之前的PCA9685的程序完全精确的控制角度
  • pca9685:此软件是对connectionPi http:wiringpi.com的devLib扩展,并使其能够通过I2C接口控制Adafruit PCA9685 16通道12位PWMServo驱动程序http:www.adafruit.comproducts815
  • pca9685.zip

    2019-07-14 21:24:47
    该工程的开发环境为stm32vet6,pca9685和sg90舵机。具体使用请参考Doc文件夹中的readme.txt。
  • PCA9685 STM32驱动

    2018-01-26 20:00:54
    PCA9685的驱动
  • Rust PCA9685 16通道12位I2C PWM / Servo / LED驱动器 这是基于特性的PCA9685 PWM / Servo / LED控制器的与平台无关的Rust驱动程序。 此驱动程序使您可以: 启用/禁用设备。 请参阅: enable() 。 设置一个或多...
  • pca9685 数据手册

    2018-09-04 21:55:38
    PCA9685 是一款 I2C 总线接口的 16 位 LED 控制器,该控制 器特别为红/绿/蓝/琥珀(RGBA)色的混合应用进行了优化 。
  • 401cubemx,PCA9685

    2019-10-05 09:50:54
    401cubemx,成功使用硬件i2c驱动16路舵机模块,PCA9685,下载就能用,自己亲测
  • 树莓派python驱动PCA9685

    千次阅读 2019-10-29 11:47:23
    树莓派python驱动PCA9685 1.开启iic 输入命令:sudo raspi-config 2.安装adafruit_python_pca9685 输入命令:sudo pip install adafruit-pca9685 3.示例代码: import Adafruit_PCA9685 pwm = Adafruit_PCA9685....

    树莓派python驱动PCA9685

    1.开启iic

    输入命令:sudo raspi-config
    在这里插入图片描述
    在这里插入图片描述

    2.安装adafruit_python_pca9685

    输入命令:sudo pip install adafruit-pca9685

    3.示例代码:

    import Adafruit_PCA9685
    pwm = Adafruit_PCA9685.PCA9685()   
    def set_servo_angle(channel, angle):                
        date=4096*((angle*11)+500)/20000              
        date=int(4096*((angle*11)+500)/(20000)+0.5)     
        pwm.set_pwm(channel, 0, date) 
    set_servo_angle(channel, angle) 
    
    展开全文
  • PCA9685_MG996R.rar

    2019-12-05 16:52:34
    stm32+PCA9685 库函数版本,控制舵机转动,全部工程代码都在,需要的可以拿走,包含PCA9685的驱动,模拟I2C,移植只需要改动两个I2C引脚,
  • PCA9685PWM调灯

    2019-04-23 20:34:17
    stm32f103c8t6;通过芯片PCA9685产生PWM控制LED的亮度;
  • PCA9685 多舵机控制器的编程

    千次阅读 2021-01-08 15:06:25
    本文介绍通过写入寄存器的方法实现对PCA9685 的控制。 PCA9685 模块 制作机器人,舵机就是让它动起来的关键器件。而又由于通常设计中为了不影响处理器供电或者主控功率不够,都会另外制作一块板子用作舵机驱动,也...

    本文介绍通过写入寄存器的方法实现对PCA9685 的控制。

     PCA9685 模块

    制作机器人,舵机就是让它动起来的关键器件。而又由于通常设计中为了不影响处理器供电或者主控功率不够,都会另外制作一块板子用作舵机驱动,也叫舵机控制板。
    PCA9685是一款用于产生16路PWM信号的LED控制芯片, 采用I2C总线与主控芯片进行通信。PCA9685具有可以产生16路PWM脉冲、控制独立精准、编程简单灵活等特点, 以其为基础实现的舵机控制能够有限减少硬件和软件设计的复杂度, 具有高可靠性
    PCA9685的用途

    PCA9685是一款基于I2C总线控制的16路LED背光调节控制芯片。每一路LED输出端均可自由调节PWM波的频率 (40~1000Hz) 和占空比 (0%~100%) 。这款芯片主要通过输出不同占空比的PWM脉冲信号来控制舵机转动的角度。
    PCA9685的特点

    PCA9685可编程调节16路PMW脉冲的占空比以及高电平到来的时刻, 分辨率为12位 (4096) 。

    地址问题

    PCA9685 是一个I2C 从设备,有个设备ID,或者叫从 地址。从地址是如下确定的:

    A5-A0 缺省是开放的, 地址是0x40

     

    I2C 时钟最高可以1M 

    频率

    16路PWM 的频率都是一样的, 由prescale 

     

    PWM 波长设定. 舵机控制所需的 PWM 周期为20 ms. 在用 PCA9685 作为多舵机控制器时,需要将 其 PWM 输出周期设定为20 ms,即PWM 波的频率设定为50 Hz,PCA9685 输出频率与振荡器有关,频率的 设置值
    在这里插入图片描述

    内部时钟频率为25M ,经计算,当需要输出50 Hz 的 PWM 频率时,设定值为121. 将该值下载到频率设定寄存器就可以改变芯片 工作频率. 需要注意的是,频率的更改只能在 PCA9685 芯片处于休眠状态下进行。

    presale 地址是0xFE,可以datasheet 里查找到。下面是 开源库中设定频率的函数代码:

    void Adafruit_PWMServoDriver::setPWMFreq(float freq) {
      //Serial.print("Attempting to set freq ");
      //Serial.println(freq);
      freq *= 0.9;  // Correct for overshoot in the frequency setting (see issue #11).
      float prescaleval = 25000000;
      prescaleval /= 4096;
      prescaleval /= freq;
      prescaleval -= 1;
      if (ENABLE_DEBUG_OUTPUT) {
        Serial.print("Estimated pre-scale: "); Serial.println(prescaleval);
      }
      uint8_t prescale = floor(prescaleval + 0.5);
      if (ENABLE_DEBUG_OUTPUT) {
        Serial.print("Final pre-scale: "); Serial.println(prescale);
      }
      
      uint8_t oldmode = read8(PCA9685_MODE1);
      uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep
      write8(PCA9685_MODE1, newmode); // go to sleep
      write8(PCA9685_PRESCALE, prescale); // set the prescaler
      write8(PCA9685_MODE1, oldmode);
      delay(5);
      write8(PCA9685_MODE1, oldmode | 0xa1);  //  This sets the MODE1 register to turn on auto increment.
                                              // This is why the beginTransmission below was not working.
      //  Serial.print("Mode now 0x"); Serial.println(read8(PCA9685_MODE1), HEX);
    }

    占空比或者脉冲宽度的设定

    下图是设定脉冲宽度的示意图。整个周期为4095, LED_ON 和 LED_OFF 2个的设定值确定脉宽,我的设定中LED_ON 设为0, LED_OFF就是脉宽了。 这里都用2位字节来表示。

    比如6,7 是LED0_ON,而8,9是 LEN0_OFF ,接下来都是4个字节控制一路pwm的占空比。

    地址定义表

    在datasheet 文件中可以看到地址定义信息表,这里剪一页到这里作为参考 

    实际例子

    我的实现是在zynq 7000上完成的,zynq 7000 的 iic 外设编程

    本文并没介绍I2C 的编程,各种情况都可以完成,强调的是写哪些寄存器,如何控制。

    下面是我控制的序列,(左边是寄存器地址,右边是写入值)

    //测试配置列表
    u8 configList[11][2]={
    		{0x00,0x10},
    		{0xfe,120},
    		{0x00,0x00},
    		{6,0x0},
    		{7,0x0},
    		{8,200},
    		{9,0},
    		{0x0A,0},
    		{0x0B,0},
    		{0x0c,150},
    		{0x0d,1}
    };

    那我解说一下是,控制休眠,设定频率,取消休眠,pwm0 的LED0_ON 为 (0x00_00) ,LED0_OFF 为(0x00_d8或者200)  pwm1 的LED1_ON 为 (0x00_00) ,LED1_OFF 为(0x01_96或者406) 

    0xd8 =200, 0x96=150 算得不一定对。

    Arduino Uno 系统可以参看 http://wiki.sunfounder.cc/index.php?title=PCA9685_16_Channel_12_Bit_PWM_Servo_Driver 都有程序库。

    展开全文
  • STM32F103控制PCA9685

    2020-08-23 21:09:07
    STM32通过IIC接口驱动PCA9685的16路舵机驱动模块,基于F1开发,可直接输入角度控制任意一个舵机的旋转角度,操作简单可直接用,每一个函数都有注释
  • 本文介绍了PCA9685主要特性和优势,方框图以及典型应用电路图和LCD背光应用电路图.NXP公司的PCA9685是16路12位PWM不是Fm+I2C总线LED控制器,每个LED输出有它独立的12位分辨率(4096步)固定频率PWM控制器,工作频率从40Hz...
  • PCA9685英文手册.pdf

    2017-04-26 21:02:55
    PCA9685英文手册.pdf
  • 有关舵机控制中PCA9685控制芯片的运用 文章采用I2C总线通信方式, 将PCA9685LED控制芯片应用在舵机控制中。PCA9685接收主控芯片的指令, 通过输出PWM脉冲信号的方式用以控制最多不超过16路舵机或其他输出通道, 最终...
  • 硬件:1> 树莓派2/3 B板2> PCA9685 16路驱动板: ... pca9685驱动: github 上搜索 pca968...

    硬件:

    1> 树莓派2/3  B板

    2> PCA9685 16路驱动板: http://duinopeak.com/wiki/index.php?title=PCA9685_16%E8%B7%AF%E8%88%B5%E6%9C%BA%E9%A9%B1%E5%8A%A8%E6%9D%BF

    3> 杜邦线, 针头线若干

    软件:

    1> pca9685驱动: github 上搜索 pca9685

    2> 打开树莓派的i2c接口

    单击桌面左上角menu --> preferences --> raspberry Pi configuration

    再选择interface面板, 将i2c勾选为enable

    3>确定i2c地址,

    安装i2c-tools: sudo apt-get install i2c-tools

    运行:  i2cdetect  -y 0 或者 i2cdetect -y  1 (B板) 运行效果如下

    pi@raspberrypi:~$ i2cdetect -y 1

    0 1 2 3 4 5 6 7 8 9 a b c d e f

    00: -- -- -- -- -- -- -- -- -- -- -- -- --

    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    70: 70 -- -- -- -- -- -- --

    pi@raspberrypi:~ $ i2cdetect -y 0

    Error: Could not open file `/dev/i2c-0' or `/dev/i2c/0': No such file or directory      找到两个地址 0x40  0x70

    控制tips:

    1> 控制方式是使用i2c向寄存器中写入值, 所以断电时不会影响上一次的配置结果.一旦上电,控制器会按照上一次的配置继续输出pwm波.

    2>使用OE端口解决上述问题: OE高电平时,输出禁止.OE低电平或者悬空时,输出有效

    3>OE电平并不影响配置PCA9685. 所以在上电的同时,应该对OE置高电平,配置完成之后,再置为低电平

    地址级联:

    (后续补充)

    展开全文
  • 16路PWM模块pca9685移植文件.rar
  • PCA9685驱动STM32F103

    2017-07-11 14:51:17
    PCA9685的驱动,STM32F103开发平台,测试通过,硬件实现;
  • STM32F407配置pca9685驱动

    千次阅读 多人点赞 2018-04-07 15:32:24
    STM32F407配置pca9685驱动 pca9685是16路12位PWM信号发生器,可用于控制舵机、led、电机等设备,i2c通信,节省主机资源。在淘宝上随处可见,Arduino用它非常方便,不过STM32要想使用它必须要写好驱动才行,本文...

    STM32F407配置pca9685驱动

    这里写图片描述
    pca9685是16路12位PWM信号发生器,可用于控制舵机、led、电机等设备,i2c通信,节省主机资源。在淘宝上随处可见,Arduino用它非常方便,不过STM32要想使用它必须要写好驱动才行,本文简述如何配置其驱动以及一些需要注意的地方。

    pca9685简介

    当然对于老手,看datasheet是最好的选择pca9685datasheet
    对于我这种新手,自然是看高手的文章比较容易上手了~

    我在网上看到的对pca9685总结的最好的一篇文章推荐给大家:生命不息折腾不止
    博主写得非常详细,本文某些片段也是参考博主的这篇文章,在此致谢。

    pca9685用的是IIC通信,如果有同学对IIC不熟悉,要先去了解一下~

    这里写图片描述

    pca9685驱动

    网上有不少写pca9685的文章,写驱动的也有,不过我试过的大多有错误,我详细地进行了修改,并且调试成功,走了不少弯路。

    pcf8574.h:

    头文件的话主要就是寄存器地址和IIC通信的函数声明,比较简单。

    内部地址(hex) 名称 功能
    Harry Potter Gryffindor 90
    Hermione Granger Gryffindor 100
    Draco Malfoy Slytherin 90
    00 MODE1 设置寄存器1
    01 MODE2 设置寄存器2
    02 SUBADR1 i2c-bus subaddress1
    03 SUBADR2 i2c-bus subaddress2
    04 SUBADR3 i2c-bus subaddress3
    05 ALLCALLADR
    06 LED0_ON_L
    07 LED0_ON_H
    08 LED0_OFF_L
    09 LED0_OFF_H
    0x06 + 4*X LEDX_ON_L
    0x06 + 4*X + 1 LEDX_ON_H
    0x06 + 4*X + 2 LEDX_OFF_L
    0x06 + 4*X + 3 LEDX_OFF_H
    … 上面共16路通道
    FA ALL_LED_ON_L
    FB ALL_LED_ON_H
    FC ALL_LED_OFF_L
    FD ALL_LED_OFF_H
    FE PRE_SCALE 控制周期的寄存器
    FF TestMode

    照着上面的表格写头文件就好了 - -

    #ifndef __PCF8574_H
    #define __PCF8574_H
    #include "sys.h"
    #include "myiic.h"
    
    #define PCA9685_adrr 0x80
    #define PCA9685_SUBADR1 0x2
    #define PCA9685_SUBADR2 0x3
    #define PCA9685_SUBADR3 0x4
    
    #define PCA9685_MODE1 0x0
    #define PCA9685_PRESCALE 0xFE
    
    
    #define LED0_ON_L 0x6
    #define LED0_ON_H 0x7
    #define LED0_OFF_L 0x8
    #define LED0_OFF_H 0x9
    
    #define ALLLED_ON_L 0xFA
    #define ALLLED_ON_H 0xFB
    #define ALLLED_OFF_L 0xFC
    #define ALLLED_OFF_H 0xFD
    
    void PCA9685_write(unsigned char reg,unsigned char data);
    u8 PCA9685_read(unsigned char reg);
    void setPWMFreq(u8 freq);
    void setPWM(u8 num, u16 on, u16 off);
    void down();
    void up();
    
    #endif
    

    pcf8574.c:

    PCA9685的读写操作没什么好说的,直接调用原子哥写好的IIC相关函数即可:

    void PCA9685_write(unsigned char reg,unsigned char data)
    {
        IIC_Start();
        IIC_Send_Byte(PCA9685_adrr);
        IIC_Wait_Ack();
        IIC_Send_Byte(reg);
        IIC_Wait_Ack();
        IIC_Send_Byte(data);
        IIC_Wait_Ack();
        IIC_Stop();
    }
    
    u8 PCA9685_read(unsigned char reg)
    {
        u8 res;
        IIC_Start();
        IIC_Send_Byte(PCA9685_adrr);
        IIC_Wait_Ack();
        IIC_Send_Byte(reg);
        IIC_Wait_Ack();    
            IIC_Start();                
        IIC_Send_Byte(PCA9685_adrr|0X01);
        IIC_Wait_Ack();
        res=IIC_Read_Byte(0);       
        IIC_Stop();             
        return res;  
    }

    设置PWM波的频率,看下面这个公式即可:
    setfreq
    其中osc_clock是时钟,根据上面的寄存器设置选择是内部25MHz时钟还是外部时钟。
    update_rate是频率,比如周期是20ms,那么频率就是50。
    注意:实际应用中发现有误差,需要加入校准,要把udpate_rate乘以0.915。
    包括从网上下载的arduino驱动中也加入了此校准。
    注意要使用浮点型变量作为中间量,否则会计算错误,另外不要忘记四舍五入。

    void setPWMFreq(u8 freq)
    {
       u8 prescale,oldmode,newmode;
       double prescaleval;
       prescaleval = 25000000.0/(4096*freq*0.915);
       prescale = (u8)floor(prescaleval+0.5)-1;
    
       oldmode = PCA9685_read(PCA9685_MODE1);
       newmode = (oldmode&0x7F) | 0x10; // sleep
       PCA9685_write(PCA9685_MODE1, newmode); // go to sleep
       PCA9685_write(PCA9685_PRESCALE, prescale); // set the prescaler
       PCA9685_write(PCA9685_MODE1, oldmode);
       delay_ms(5);
       PCA9685_write(PCA9685_MODE1, oldmode | 0xa1); 
    }

    setPWM函数,向相应的寄存器(LED0_ON_L、LED0_ON_H、LED0_OFF_L、LED0_OFF_H)写值即可。
    其中num为舵机PWM输出引脚0~15,on是PWM上升计数值0~4096,off是PWM下降计数值0~4096。

    他的PWM发生原理是这样的:

    一个PWM周期分成4096份,由0开始+1计数,计到on时跳变为高电平,继续计数到off时跳变为低电平,直到计满4096重新开始。所以当on不等于0时可作延时,当on等于0时,off/4096的值就是PWM的占空比。

    void setPWM(u8 num, u16 on, u16 off) 
    {
        PCA9685_write(LED0_ON_L+4*num,on);
        PCA9685_write(LED0_ON_H+4*num,on>>8);
        PCA9685_write(LED0_OFF_L+4*num,off);
        PCA9685_write(LED0_OFF_H+4*num,off>>8);
    }

    为了方便使用,我写了一个输入角度输出相应PWM值(off值)的函数。
    这个要针对舵机进行修改,我用的是乐幻索尔的LDX218双轴舵机:
    这里写图片描述
    周期20ms,所以在设置频率的时候要设为50;占空比0.5ms~2.5ms分别对应0°~180°,且成线性关系,所以计算公式为:

    PWM=4096×0.5+(2.50.5)×angle/18020PWM=4096×0.5+(2.5−0.5)×angle/18020
    u16 calculate_PWM(u8 angle){
        return (int)(204.8*(0.5+angle*1.0/90));
    }

    然后就是一些动作组了,这个就随便写一个8个舵机全部置零位和全部置90°:
    注意IIC通信间隔的问题,每调用一次setPWM()函数就要延迟1ms,否则会出现莫名其妙的BUG,这个很重要~

    void down(){
        u16 pwm = calculate_PWM(0);
        setPWM(0x0,0,pwm);
        delay_ms(1);
        setPWM(0x1,0,pwm);
        delay_ms(1);
        setPWM(0x2,0,pwm);
        delay_ms(1);
        setPWM(0x3,0,pwm);
        delay_ms(1);
        setPWM(0x4,0,pwm);
        delay_ms(1);
        setPWM(0x5,0,pwm);
        delay_ms(1);
        setPWM(0x6,0,pwm);
        delay_ms(1);
        setPWM(0x7,0,pwm);
    }
    
    void up(){
        u16 pwm = calculate_PWM(90);
        setPWM(0x0,0,pwm);
        delay_ms(1);
        setPWM(0x1,0,pwm);
        delay_ms(1);
        setPWM(0x2,0,pwm);
        delay_ms(1);
        setPWM(0x3,0,pwm);
        delay_ms(1);
        setPWM(0x4,0,pwm);
        delay_ms(1);
        setPWM(0x5,0,pwm);
        delay_ms(1);
        setPWM(0x6,0,pwm);
        delay_ms(1);
        setPWM(0x7,0,pwm);
    }
    
    

    应用与调试

    我是想做一个用蓝牙控制一个四足机器人的,机器人有8个舵机,完整的工程代码已经跑通,感兴趣的可以下载看看:
    蓝牙控制8个舵机(STM32F407+pca9685+HC06)

    展开全文
  • 原本PCA9685的英文数据手册看的头疼,这里直接就给STC89的PCA9685控制四个舵机的程序,拥有足够方便的库,并且可以用三个IO口一次性控制16个舵机,总之就是非常的好玩。
  • 基于STM32的六足机器人驱动程序,通过PCA9685驱动18路舵机进行控制; 目前只实现了通过PCA9685驱动多路舵机,多个舵机联合动作需要自己设计调试

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 543
精华内容 217
关键字:

pca9685