1. 程式人生 > >【PCA 9685學習筆記進階版】——16路PWM舵機驅動板+ Arduino

【PCA 9685學習筆記進階版】——16路PWM舵機驅動板+ Arduino


/*************************************************** 
  這是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); }