历史上的今天
返回首页

历史上的今天

今天是:2024年09月07日(星期六)

2020年09月07日 | PCA9685 PWM舵机驱动板16路模块 IIC接口

2020-09-07 来源:51hei

16路模块 PWM舵机驱动板 控制器 机器人 IIC接口 使用说明书

AdafruitPWMServoDriverLibrary单片机源程序如下:

/***************************************************

  This is a library for our Adafruit 16-channel PWM & Servo driver


  Pick one up today in the adafruit shop!


  These displays use I2C to communicate, 2 pins are required to  

  interface. For Arduino UNOs, thats SCL -> Analog 5, SDA -> Analog 4


  Adafruit invests time and resources providing this open source code,

  please support Adafruit and open-source hardware by purchasing

  products from Adafruit!


  Written by Limor Fried/Ladyada for Adafruit Industries.  

  BSD license, all text above must be included in any redistribution

****************************************************/


#include

#include

#if defined(__AVR__)

#define WIRE Wire

#elif defined(CORE_TEENSY) // Teensy boards

#define WIRE Wire

#else // Arduino Due

#define WIRE Wire1

#endif


// Set to true to print some debug messages, or false to disable them.

#define ENABLE_DEBUG_OUTPUT true


Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(uint8_t addr) {

  _i2caddr = addr;

}


void Adafruit_PWMServoDriver::begin(void) {

WIRE.begin();

reset();

}



void Adafruit_PWMServoDriver::reset(void) {

write8(PCA9685_MODE1, 0x0);

}


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);

}


void Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on, uint16_t off) {

  //Serial.print("Setting PWM "); Serial.print(num); Serial.print(": "); Serial.print(on); Serial.print("->"); Serial.println(off);


  WIRE.beginTransmission(_i2caddr);

  WIRE.write(LED0_ON_L+4*num);

  WIRE.write(on);

  WIRE.write(on>>8);

  WIRE.write(off);

  WIRE.write(off>>8);

  WIRE.endTransmission();

}


// Sets pin without having to deal with on/off tick placement and properly handles

// a zero value as completely off.  Optional invert parameter supports inverting

// the pulse for sinking to ground.  Val should be a value from 0 to 4095 inclusive.

void Adafruit_PWMServoDriver::setPin(uint8_t num, uint16_t val, bool invert)

{

  // Clamp value between 0 and 4095 inclusive.

  val = min(val, 4095);

  if (invert) {

    if (val == 0) {

      // Special value for signal fully on.

      setPWM(num, 4096, 0);

    }

    else if (val == 4095) {

      // Special value for signal fully off.

      setPWM(num, 0, 4096);

    }

    else {

      setPWM(num, 0, 4095-val);

    }

  }

  else {

    if (val == 4095) {

      // Special value for signal fully on.

      setPWM(num, 4096, 0);

    }

    else if (val == 0) {

      // Special value for signal fully off.

      setPWM(num, 0, 4096);

    }

    else {

      setPWM(num, 0, val);

    }

  }

}


uint8_t Adafruit_PWMServoDriver::read8(uint8_t addr) {

  WIRE.beginTransmission(_i2caddr);

  WIRE.write(addr);

  WIRE.endTransmission();


  WIRE.requestFrom((uint8_t)_i2caddr, (uint8_t)1);

  return WIRE.read();

}


void Adafruit_PWMServoDriver::write8(uint8_t addr, uint8_t d) {

  WIRE.beginTransmission(_i2caddr);

  WIRE.write(addr);

  WIRE.write(d);

  WIRE.endTransmission();

}


推荐阅读

史海拾趣

General Cable公司的发展小趣事
可能是由于电源噪声、外部干扰或电路元件老化等原因导致的。解决方法包括优化电源设计、增加滤波电路、更换老化元件等。
CET Technology公司的发展小趣事

在数字化转型的大背景下,CET Technology积极探索数字孪生技术在园区管理中的应用。公司提供的数字孪生与3D可视化服务,通过创建园区的虚拟实体,模拟、验证、预测和控制园区的运营状态,帮助园区实现智慧化管理、优化服务和提高生产效率。此外,CET的数字孪生服务还能监控园区内人员和车辆的通行情况,提升园区内部的交通效率,为园区的可持续发展提供了有力支持。

DSMI Electronics SA公司的发展小趣事

为了进一步扩大市场份额,DSMI Electronics SA公司开始实施全球化战略。公司积极拓展海外市场,通过参加国际展会、建立海外销售网络等方式,将产品销往全球各地。同时,DSMI还注重本土化经营,根据不同市场的特点和需求,调整产品策略和营销方式。这些努力使DSMI在国际市场上取得了显著的成绩。

E-tec Interconnect Ltd公司的发展小趣事

E-tec Interconnect Ltd成立于XX世纪初,起初是一家专注于电子连接器设计与制造的小型公司。在创始团队的带领下,E-tec注重基础技术的积累,投入大量资源进行研发和创新。他们成功开发了一系列高精度、高可靠性的连接器产品,为公司的后续发展奠定了坚实的基础。

BAHCO公司的发展小趣事

随着全球化趋势的加速推进,BAHCO也在积极拓展全球市场。目前,公司已在多个国家和地区设立了分支机构或销售网络,实现了全球范围内的业务覆盖。未来,BAHCO将继续加大在研发、生产、销售等方面的投入力度,不断提升产品质量和服务水平。同时,公司还将积极探索新的商业模式和合作方式,以适应不断变化的市场环境并实现可持续发展。

这些故事虽然不直接涉及BAHCO在电子行业的发展,但它们展示了BAHCO在工具制造领域的辉煌历程和不断进取的精神。作为一家拥有百年历史的知名企业,BAHCO凭借其卓越的品质、创新精神和全球市场布局,成功地在工具制造业中占据了重要地位。未来,随着技术的不断进步和市场需求的不断变化,相信BAHCO将继续保持其领先地位并迎来更加美好的发展前景。

Electro-Term/Hollingsworth公司的发展小趣事

面对全球电子市场的不断变化,Electro-Term公司及时调整了市场布局和战略方向。公司深入分析了不同地区的市场需求和消费者偏好,制定了有针对性的市场推广策略。同时,公司还加强了与国际知名企业的合作,共同开发新技术和产品。这些努力使Electro-Term在全球市场上取得了显著的成绩。

问答坊 | AI 解惑

不错的解密软件(系统上的)

这个解密软件也许会给大家一点方便…

查看全部问答>

电流采样

我的论文题目是灯泡验光控制器设计,就是测量灯泡的电流来判断灯泡的好坏,电流大小10A左右 工作电压12V,想用电流传感器MAX472来采集电流信号,通过ADC0809显示出来,问题是不知道MAX472跟0809怎么相连,以及采集电流的电路怎么画, 请教。。最好 ...…

查看全部问答>

接口资料总结

PCI Express标准概述 [ 本帖最后由 天天向上 于 2009-7-6 11:15 编辑 ]…

查看全部问答>

字符液晶1602和点阵液晶12864 地址的疑惑(初学者提问)

字符液晶1602 确定显示位置的时候  80H 加上地址码 00H-27H  40H-67H。对于80H是如何得出来的? 点阵液晶12864  确定显示位置的时候  B8H 加上页码  40H 加上列码。   对于B8H 40H ...…

查看全部问答>

音频 PWM 编码问题

如题,在D 类音频功放芯片中要求输入信号是PWM 信号,怎么把音频信号进行PWM 编码呢? 编码规则大致怎样,大致来两张原理图 …

查看全部问答>

【课程推荐】+ TI C2000无锡研讨会-太阳能微逆变器解决方案

平时没事看看TI的视频,发现有活动,顺便参加一些,希望拿个奖品,先谢谢TI和eeworld 这次我推荐的课程是 TIC2000无锡研讨会-太阳能微逆变器解决方案 主讲是朱桦 新能源是一个比较大的方向,相信有很多人都是从事这一方面。众所周知的是太阳能变 ...…

查看全部问答>

关于openpilot的问题4

各位高手,小弟正在分析openpilot源代码,分析到了以下代码:OPLinkSettingsData oplinkSettings;    OPLinkSettingsGet(&oplinkSettings);bool is_coordinator = (oplinkSettings.Coordinator == OPLINKSETTINGS_COORDINATOR_TRUE);&nbs ...…

查看全部问答>

高频放大器布局布线、接地和旁路考虑

我非常喜欢读ADI提供的技术文档比如ADI的大部分数据手册中都会有技术术语或使用技巧的介绍对理解和应用某些产品和技术帮助很大特别是他提供的中文手册翻译的非常全面,通篇都是中文介绍 这次在ADA4817放大器的数据手册里看到了关于布局布线、接地 ...…

查看全部问答>

keeloq解码

求助keeloq解码,给威信红包,13352990911 …

查看全部问答>