• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как получить точную задержку

На ESP32: простейший кусок программы
for(int i=0;i<1;i++)
{ digitalWrite(13, HIGH);
delayMicroseconds(1000);
digitalWrite(13, LOW);
//delayMicroseconds(500); } 13-ый пин через 100ом+диод передается на SCOPE-осциллограф через USB звуковую плату. Результат прицеплен. Длительность высокого периода порядка 1.5мсек. Небольшое падение - влияние звуковой платы, не пропускающей постоянную компоненту.
Как получить пик с точным временем продолжительности?
 

Вложения

pvvx

Активный участник сообщества
Как получить пик с точным временем продолжительности?
Только если корректировать код, просматривая ассемблер.
Во первых запретить все прерывания, далее использовать счетчик тиков CPU, никаких digitalWrite(), а только прямое обращение через регистры чипа.

Других вариантов нет. Прерывания у данного типа CPU с имеющимися внутренностями даст большой джиттер. В итоге никакие реализации "таймеров" в Arduino не годятся.

Альтернативный метод - генерация импульса с помощью периферии - PWM, SPI, UART, I2S и т.д. Но и они у ESP32 имеют джиттер...
 
Решение я нашел. Ранее при запуске двуядерной программы для правильной работы оказалось необходимым вставить минимальную задержку в одну из задач. Так и сейчас, после добавления вслед за To Low delayMicroseconds(1); все длительности оказались правильными.
Кстати, SCOPE осциллограф при наличии хорошей звуковой платы является лучшим и того, что я свою очень долгую практику видел. Одно то, что команда save дает вам не только картинку экрана, но и файл с записью сигнала.
 

pvvx

Активный участник сообщества
Надо было описать, что вам необходима точность +- десятки мс и безразлична аналогичная нестабильность. Тогда подходит множество методов…

Отладочный вывод в UART порт из библиотек Arduino происходит установленной скорости 115200. При длине сообщения в 50 символов – это уже ожидание и прерывание исполнения вашей программы к 5 мс.
 
Сверху Снизу