Таймер Arduino кажется сбой?

Для выставки с некоторыми интерактивными установками мне нужно создать систему, которая считывает данные с трех ультразвуковых датчиков PING и имеет диммер DMX, подключенный к одному выходу.

Поэтому я взял свою плату Arduino Mega, собрал вокруг нее некоторые аппаратные средства (инвертор сигналов для DMX) и протестировал диммер DMX, используя библиотеку DmXSimple. Работает нормально!

Следующий шаг: тестирование датчиков PING. Я использовал библиотеку NewPing, и подключил датчики. Работает нормально!

Теперь оба вместе, в одной программе: импортируем обе библиотеки, используя одинаковые коды. Это не работает!

Таймер столкновения? Ну... во всяком случае - я понятия не имею, как это решить. Что я должен делать? Если это проблема таймера (то есть обе библиотеки вызывают один и тот же таймер), я действительно не знаю, как изменить библиотеки, чтобы он работал.

1 ответ

На Arduino есть два таймера, и вы можете сделать обе работы в стороне. DmxSimple явно говорит, что использует таймер #2, тогда как для NewPing это не ясно. Но библиотека NewPing может работать без использования таймера. Вы можете заставить DmxSimple работать, используя его таймер (который является обязательным для взаимодействия с его шиной в реальном времени), тогда как вы можете обрабатывать эхолот в функции цикла:

void loop() {
    int dst = sonar.ping_cm();
    delay(50);
    DmxSimple.write(1, dst);
}

Там у вас не должно быть конфликтующих таймеров.

Глядя на исходный код NewPing, он использует Timer2, если вы используете timer_us() / timer_ms() функции, но нет таймера в противном случае. Но если вы запустите его на Arduino Leonardo (или Arduino Micro или любом другом микроконтроллере на базе ATmega32U4), он будет использовать Timer4, который не конфликтует с DmxSimple.

Если вы хотите исправить библиотеку NewPing для использования Timer3, вы можете заменить это в NewPing.cpp:

OCR2A = 249;
TIMSK2 |= (1 << OCIE2A);

с

OCR3A = 640;
TIMSK3 |= (1 << OCIE3A);

и в stop_timer:

TIMSK2 &= ~(1 << OCIE2A);

с

TIMSK3 &= ~(1 << OCIE3A);
Другие вопросы по тегам