拥有12位分辨率(4096步)固定频率的单独PWM控制器
可编程频率从典型的40hz到1000hz,占空比为
从0%到100%可调,以允许LED设置到特定的亮度值。
所有输出设置为相同的PWM频率。
每个LED输出可以关闭或打开(无PWM控制),或设置在其单独的PWM控制器
价值。LED输出驱动器被编程为开漏,电流为25毫安
吸收能力在5v或图腾柱与25毫安的吸收,10毫安的源能力在5v。的
PCA9685工作电源电压范围为2.3 V至5.5 V,输入和
输出容忍5.5 V。可直接连接LED输出(最多可达
25 mA, 5.5 V)或控制与外部驱动器和离散的最小量
组件用于更大电流或更高电压的led。
PCA9685是新的快速模式Plus (Fm+)系列。Fm+设备提供更高
频率(高达1mhz)和更密集的总线操作(高达4000pf)
驱动代码为:
#!/usr/bin/python
import time
import math
import smbus
# ============================================================================
# Raspi PCA9685 16-Channel PWM Servo Driver
# ============================================================================
class PCA9685:
# Registers/etc.
__SUBADR1 = 0x02
__SUBADR2 = 0x03
__SUBADR3 = 0x04
__MODE1 = 0x00
__MODE2 = 0x01
__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 = 0xFD
def \_\_init\_\_(self, address=0x40, debug=False):
self.bus = smbus.SMBus(1)
self.address = address
self.debug = debug
if (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 result
def setPWMFreq(self, freq):
"Sets the PWM frequency"
prescaleval = 25000000.0 # 25MHz
prescaleval /= 4096.0 # 12-bit
prescaleval /= float(freq)
prescaleval -= 1.0
if (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 # sleep
self.write(self.__MODE1, newmode) # go to sleep
self.write(self.__PRESCALE, int(math.floor(prescale)))
self.write(self.__MODE1, oldmode)
time.sleep(0.005)
self.write(self.__MODE1, oldmode | 0x80)
self.write(self.__MODE2, 0x04)
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 20000us
self.setPWM(channel, 0, int(pulse))
def setRotationAngle(self, channel, Angle):
if(Angle >= 0 and Angle <= 180):
temp = Angle \* (2000 / 180) + 501
self.setServoPulse(channel, temp)
else:
print("Angle out of range")
def start\_PCA9685(self):
self.write(self.__MODE2, 0x04)
#Just restore the stopped state that should be set for exit\_PCA9685
def exit\_PCA9685(self):
self.write(self.__MODE2, 0x00)#Please use initialization or \_\_MODE2 =0x04
JetsonNano
舵机云台代码为:
#!/usr/bin/python
import time
import RPi.GPIO as GPIO
from PCA9685 import PCA9685
# try:
#print "This is an PCA9685 routine"
pwm = PCA9685()
pwm.setPWMFreq(50)
#pwm.setServoPulse(1,500)
pwm.setRotationAngle(1, 0)
while True:
# setServoPulse(2,2500)
for i in range(10,170,1):
pwm.setRotationAngle(1, i)
if(i<80):
pwm.setRotationAngle(0, i)
time.sleep(0.1)
for i in range(170,10,-1):
pwm.setRotationAngle(1, i)
if(i<80):
pwm.setRotationAngle(0, i)
time.sleep(0.1)
# except:
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/067409200347cf3cc3fb5aebef5ec192.png)
![img](https://img-blog.csdnimg.cn/img_convert/0ff4a00921e5e4947025e6c43349ed04.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/c04cda21c3826b40c77027a9157fa2f8.png)
![img](https://img-blog.csdnimg.cn/img_convert/2af1abf6909812c190d59d407ffc3c14.png)
![img](https://img-blog.csdnimg.cn/img_convert/8f8a6831fa3ae7334a6a88118fab7ea8.png)
![img](https://img-blog.csdnimg.cn/img_convert/1778919ca2642197c57dff85b6ed01ed.png)
![](https://img-blog.csdnimg.cn/img_convert/50d0be3f4fee2e121cafc9b320fe397f.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!