欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

       找回密碼
       立即注冊

      QQ登錄

      只需一步,快速開始

      搜索
      查看: 3790|回復(fù): 0
      打印 上一主題 下一主題
      收起左側(cè)

      Arduino程序 16路模塊PWM舵機驅(qū)動板控制器 機器人 IIC接口

      [復(fù)制鏈接]
      跳轉(zhuǎn)到指定樓層
      樓主
      ID:332698 發(fā)表于 2020-10-31 15:54 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

      1. #include <Adafruit_PWMServoDriver.h>
      2. #include <Wire.h>
      3. #if defined(__AVR__)
      4. #define WIRE Wire
      5. #elif defined(CORE_TEENSY) // Teensy boards
      6. #define WIRE Wire
      7. #else // Arduino Due
      8. #define WIRE Wire1
      9. #endif

      10. // Set to true to print some debug messages, or false to disable them.
      11. #define ENABLE_DEBUG_OUTPUT true

      12. Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(uint8_t addr) {
      13.   _i2caddr = addr;
      14. }

      15. void Adafruit_PWMServoDriver::begin(void) {
      16. WIRE.begin();
      17. reset();
      18. }


      19. void Adafruit_PWMServoDriver::reset(void) {
      20. write8(PCA9685_MODE1, 0x0);
      21. }

      22. void Adafruit_PWMServoDriver::setPWMFreq(float freq) {
      23.   //Serial.print("Attempting to set freq ");
      24.   //Serial.println(freq);
      25.   freq *= 0.9;  // Correct for overshoot in the frequency setting (see issue #11).
      26.   float prescaleval = 25000000;
      27.   prescaleval /= 4096;
      28.   prescaleval /= freq;
      29.   prescaleval -= 1;
      30.   if (ENABLE_DEBUG_OUTPUT) {
      31.     Serial.print("Estimated pre-scale: "); Serial.println(prescaleval);
      32.   }
      33.   uint8_t prescale = floor(prescaleval + 0.5);
      34.   if (ENABLE_DEBUG_OUTPUT) {
      35.     Serial.print("Final pre-scale: "); Serial.println(prescale);
      36.   }
      37.   
      38.   uint8_t oldmode = read8(PCA9685_MODE1);
      39.   uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep
      40.   write8(PCA9685_MODE1, newmode); // go to sleep
      41.   write8(PCA9685_PRESCALE, prescale); // set the prescaler
      42.   write8(PCA9685_MODE1, oldmode);
      43.   delay(5);
      44.   write8(PCA9685_MODE1, oldmode | 0xa1);  //  This sets the MODE1 register to turn on auto increment.
      45.                                           // This is why the beginTransmission below was not working.
      46.   //  Serial.print("Mode now 0x"); Serial.println(read8(PCA9685_MODE1), HEX);
      47. }

      48. void Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on, uint16_t off) {
      49.   //Serial.print("Setting PWM "); Serial.print(num); Serial.print(": "); Serial.print(on); Serial.print("->"); Serial.println(off);

      50.   WIRE.beginTransmission(_i2caddr);
      51.   WIRE.write(LED0_ON_L+4*num);
      52.   WIRE.write(on);
      53.   WIRE.write(on>>8);
      54.   WIRE.write(off);
      55.   WIRE.write(off>>8);
      56.   WIRE.endTransmission();
      57. }

      58. // Sets pin without having to deal with on/off tick placement and properly handles
      59. // a zero value as completely off.  Optional invert parameter supports inverting
      60. // the pulse for sinking to ground.  Val should be a value from 0 to 4095 inclusive.
      61. void Adafruit_PWMServoDriver::setPin(uint8_t num, uint16_t val, bool invert)
      62. {
      63.   // Clamp value between 0 and 4095 inclusive.
      64.   val = min(val, 4095);
      65.   if (invert) {
      66.     if (val == 0) {
      67.       // Special value for signal fully on.
      68.       setPWM(num, 4096, 0);
      69.     }
      70.     else if (val == 4095) {
      71.       // Special value for signal fully off.
      72.       setPWM(num, 0, 4096);
      73.     }
      74.     else {
      75.       setPWM(num, 0, 4095-val);
      76.     }
      77.   }
      78.   else {
      79.     if (val == 4095) {
      80.       // Special value for signal fully on.
      81.       setPWM(num, 4096, 0);
      82.     }
      83.     else if (val == 0) {
      84.       // Special value for signal fully off.
      85.       setPWM(num, 0, 4096);
      86.     }
      87.     else {
      88.       setPWM(num, 0, val);
      89.     }
      90.   }
      91. }

      92. uint8_t Adafruit_PWMServoDriver::read8(uint8_t addr) {
      93.   WIRE.beginTransmission(_i2caddr);
      94.   WIRE.write(addr);
      95.   WIRE.endTransmission();

      96.   WIRE.requestFrom((uint8_t)_i2caddr, (uint8_t)1);
      97.   return WIRE.read();
      98. }

      99. void Adafruit_PWMServoDriver::write8(uint8_t addr, uint8_t d) {
      100.   WIRE.beginTransmission(_i2caddr);
      101.   WIRE.write(addr);
      102.   WIRE.write(d);
      103.   WIRE.endTransmission();
      104. }
      復(fù)制代碼


      16路模塊 PWM舵機驅(qū)動板 控制器 機器人 IIC接口 .zip

      1.82 MB, 下載次數(shù): 19, 下載積分: 黑幣 -5

      分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
      收藏收藏3 分享淘帖 頂 踩
      回復(fù)

      使用道具 舉報

      您需要登錄后才可以回帖 登錄 | 立即注冊

      本版積分規(guī)則

      小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

      Powered by 單片機教程網(wǎng)

      快速回復(fù) 返回頂部 返回列表