Скетч PCA9685 Тест 16 сервомашинок Arduino
- Информация о материале
- Обновлено: 06.05.2023, 22:19
- Опубликовано: 06.05.2023, 20:08
- Автор: DeniS
/***************************************************
Это пример расширителя 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
}
}