【PCA 9685学习笔记进阶版】——16路PWM舵机驱动板+ Arduino

这是自己修改程序的版本。之前的【PCA 9685学习笔记初级版】https://blog.csdn.net/qq_42807924/article/details/82229997


/*************************************************** 
  这是16通道PWM和伺服驱动器的一个例子,驱动16个伺服电机
  ****************************************************/

#include <Wire.h>                    //16路舵机控制板头文件
#include <Adafruit_PWMServoDriver.h> //16路舵机控制板头文件


Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();//以这种方式调用,它使用默认地址0x40。
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);//也可以用不同的地址调用它

void setServoPulse(uint8_t n, double pulse);   //以秒为单位设置脉冲长度函数
void pwm_text();     //16路舵机控制板测试函数,效果是来回转动,16路同时

/*根据你的伺服制作,脉冲宽度最小和最大可能变化,你想要这些尽可能小大而不碰到
硬停止,对于最大范围。你必须调整它们以匹配你的伺服系统!*/
#define SERVOMIN  150   //这是“最小”脉冲长度计数(在4096中)
#define SERVOMAX  600   //这是“最大”脉冲长度计数(在4096中)


void setup() {
   Serial.begin(9600);
   Serial.println("16 channel Servo test!");
   pwm.begin();
   pwm.setPWMFreq(60);  //设置频率60Hz  可用50Hz 40-1000//测试对电机的速度没有影响
}


/********************主函数********************/
void loop() {
   pwm_text();     //16路舵机控制板测试函数,效果是来回转动,16路同时
}
/********************************************/
void pwm_text(){     //16路舵机控制板测试函数,效果是来回转动,16路同时
 //每次驱动一个伺服驱动器
   for (uint16_t pulse = SERVOMIN; pulse < SERVOMAX; pulse++) 
   {
    for(uint8_t channel=0;channel<16;channel++)
      {
       pwm.setPWM(channel, 0, pulse);    //pulse翻译为脉冲  
      }     
    }
  delay(500);

   for (uint16_t pulse = SERVOMAX; pulse > SERVOMIN; pulse--) 
   {
    for(uint8_t channel=0;channel<16;channel++)
     {
      pwm.setPWM(channel, 0, pulse);    //pulse翻译为脉冲  
      }   
    } 
     delay(500);

}


//如果您想以秒为单位设置脉冲长度,则可以使用此函数。
//例如SET伺服脉冲(0,0.001)是一个1毫秒的脉冲宽度,但不精确!
void setServoPulse(uint8_t n, double pulse)   //以秒为单位设置脉冲长度函数
{
   double pulselength;//精度浮点数

   pulselength = 1000000;   // 1,000,000 us per second 每秒100万
   pulselength /= 60;   // 60 Hz
   Serial.print(pulselength); Serial.println(" us per period"); 
   pulselength /= 4096;  // 12 bits of resolution 12位分辨率
   Serial.print(pulselength); Serial.println(" us per bit"); 
   pulse *= 1000;
   pulse /= pulselength;
   Serial.println(pulse);
   pwm.setPWM(n, 0, pulse);
}

猜你喜欢

转载自blog.csdn.net/qq_42807924/article/details/82290147