• Система автоматизации с открытым исходным кодом на базе 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 мс.
 
Сверху Снизу