Скетч PCA9685 Тест 16 сервомашинок Arduino

/***************************************************
Это пример расширителя PCA9685 16-канального драйвера ШИМ и сервопривода Adafruit.
Тест ШИМ - управление 16 шим «волна»
PCA9685 одключения интерфейса I2C требуется 2 контакта.
****************************************************/

#include <Wire.h> //Подключение библиотеки
#include <Adafruit_PWMServoDriver.h> //Подключение библиотеки

// подключение по адресу 0x40

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

// можно подключить по другому адресу
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
// также можно подключить с другим адресом и интерфейсом I2C
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40, Wire);

void setup()

{
Serial.begin(9600);
Serial.println("16 channel PWM test!");

pwm.begin();

/*
* Внутренний генератор (clock) имеет частоту 25 МГц, но на самом деле это не так.
* Можно «откалибровать», настраивая число до тех пор, пока вы не получете ожидаемую частоту ШИМ!
* int.osc. для PCA9685 это диапазон от 23-27МГц  и используется для вычисления writeMicroseconds()
* Аналоговые сервоприводы работают с частотой ~ 50 Гц. Важно использовать осциллограф при настройке частоты int.osc для PCA9685.
* 1) Подключить осциллограф к одному из сигнальных контактов ШИМ и GND на микросхеме I2C PCA9685
* 2) Настройте setOscillatorFrequency() до тех пор, пока частота обновления ШИМ не станет 50 Гц (для большинства ESC).
* Значение здесь зависит от каждого отдельного чипа I2C PCA9685 и влияет на расчет частоты обновления ШИМ.
* Неправильная установка значения int.osc приведет к непредвиденным результатам ШИМ.
*/

pwm.setOscillatorFrequency(27000000);
pwm.setPWMFreq(1600); //Это макcимальная частота ШИМ

// если нужно увеличить скорость, то можно перейти в быстрый режим «fast 400khz I2C»
// некоторым устройства i2c в этом режиме работают нестабильно

Wire.setClock(400000);
}

void loop()

{
// Управление каждым ШИМ в виде волны 
for (uint16_t i=0; i<4096; i += 8)

{

for (uint8_t pwmnum=0; pwmnum < 16; pwmnum++)

{
pwm.setPWM(pwmnum, 0, (i + (4096/16)*pwmnum) % 4096 );
}

#ifdef ESP8266
yield(); // пауза, требуется для ESP8266
#endif
}

}

You have no rights to post comments