【PCA 9685學習筆記進階版】——16路PWM舵機驅動板+ Arduino
阿新 • • 發佈:2018-12-18
/***************************************************
這是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);
}