失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > PCA9685--16路 PWM模块舵机驱动板--STM32 IIC接口模块

PCA9685--16路 PWM模块舵机驱动板--STM32 IIC接口模块

时间:2019-03-07 08:25:22

相关推荐

PCA9685--16路 PWM模块舵机驱动板--STM32 IIC接口模块

目录

一、概述和硬件

1、概述

2、硬件

1、电压

2、i2c地址

3、使能脚

二、寄存器功能

MODE1寄存器

外面调用的接口

PCA9685是一款基于IIC总线通信的12位精度16通道PWM波输出的芯片,该芯片最初由NXP推出时主要面向LED开关调光,

16路12位PWM信号发生器,可用于控制舵机、led、电机等设备,i2c通信,节省主机资源。就是想控制好几台舵机,但太占用引脚资源就想到了这个神神器

一、概述和硬件

1、概述

网上上面比较便宜。

i2c通信,只需要2根i2c线就可以控制16路pwm,周期和占空比都可控。

可以多个模块级联。箭头部分可以更改设备id。

可以控制16路输出端的开、关、pwm以及占空比。

精度是12位:

工作频率 时间分辨率 通常舵机500~2500us可分成份数 通常舵机500~2500us,旋转角180°的角度分辨率

50Hz 4.88us 410份 0.439°

60Hz 4us 492份 0.366°

驱动方式可以选择开漏输出或推挽输出。

2、硬件

1、电压

数字电路电压范围可接受3.3和5v电平。此外还有一个v+引脚,这个引脚是给舵机供电用的,可以接稍微高一点的电压。

2、i2c地址

有6个地址控制脚,通过这些引脚可以控制设备的i2c地址。

7位的I2C地址为:0x40 + A5:A0,A5到A0如果不做任何处理的话是0,想要把哪一位置1就把那个引脚焊到一起。

另外用i2cdetect检测出还有一个0x70地址一直存在,这是一个通用地址,可以给所有从机下达指令。

3、使能脚

模块有一个OE反使能脚,这个引脚低电平使能,不接的话模块内部默认已经接地使能了,所以正常使用可以不接。

二、寄存器功能

MODE1寄存器

位 名称 功能

各个通道的ON和OFF寄存器

总共16个通道,每个通道都有 LEDX_ON_L、LEDX_ON_H、LEDX_OFF_L、LEDX_OFF_H 四个寄存器。

系统中有一个12位的计数ACK,ACK根据PRE_SCALE寄存器设置的周期进行增加,没增加一次就会和上述四个寄存器对比:

当发现 ACK == LEDX_ON_H[3:0]:LEDX_ON_L 时,X通道输出高电平;

当发现 ACK == LEDX_OFF_H[3:0]:LEDX_OFF_L 时,X通道输出低电平。

PRE_SCALE寄存器

这个寄存器是用来设置周期的,具体原理可以不用管,只要记住:

freq :要设置的周期

prescaleval :要写入的参数

freq *= 0.9; float prescaleval = 25000000;prescaleval /= 4096;prescaleval /= freq;prescaleval -= 1;

外面调用的接口

不用初始化,直接设置。

设置后没有输出的话,可能i2c写入失败,刚开始遇到过这种情况,后来重新换了i2c库之后就可以了。还是主要i2c要正确使用。

/*freq:要设置的周期*/

void setPWMFreq(float freq);

/*

num:设置第num个输出口输出量变化

on与off:配合产生占空比 0~on为低电平 ,到on为高电平,到off转为低电平

*/

void setPWM(u8 num, u16 on, u16 off);

上面的用的不方便就封装为简单的 直接输入需要设置的占空比周期50,off:15表示1.5ms控制舵机方便

void set_pwm(u8 num, u8 off);

void setPWMFreq(float freq) {freq *= 0.9; float prescaleval = 25000000;prescaleval /= 4096;prescaleval /= freq;prescaleval -= 1;uint8_t oldmode = read8(PCA9685_MODE1);uint8_t newmode = (oldmode&0x7F) | 0x10; //准备进入sleep,设置时钟前必须先进入sleep模式Delay_ms(5);write8(PCA9685_MODE1, newmode); Delay_ms(5);write8(PCA9685_PRESCALE, prescaleval); pDelay_ms(5);oldmode &= 0xef;//清除sleep位write8(PCA9685_MODE1, oldmode);Delay_ms(5);write8(PCA9685_MODE1, oldmode | 0xa1); // This sets the MODE1 register to turn on auto increment.}

void setPWM(uint8_t num, uint16_t on, uint16_t off) {write8(LED0_ON_L+4*num,on);write8(LED0_ON_H+4*num,on>>8);write8(LED0_OFF_L+4*num,off);write8(LED0_OFF_H+4*num,off>>8);}

void set_pwm(u8 num, u8 off){setPWM(num, 0, (int)(off*20.48));}

uint8_t read8(uint8_t reg_addr) {u8 data=0;I2C_BufferRead(PCA9685_SLAVE_ADDRESS,&data,reg_addr,1);return data;}void write8(uint8_t reg_addr, uint8_t reg_dat) {I2C_ByteWrite(PCA9685_SLAVE_ADDRESS,reg_dat,reg_addr); }

由于经常使用i2c接口就写了一个库方便移植,以后每次使用i2c就可以只用稍加修改封装下,主要还是使用一下两个接口I2C_BufferRead(PCA9685_SLAVE_ADDRESS,&data,reg_addr,1);与I2C_ByteWrite(PCA9685_SLAVE_ADDRESS,reg_dat,reg_addr);

如果觉得《PCA9685--16路 PWM模块舵机驱动板--STM32 IIC接口模块》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。