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

ESP8266 и аппаратный таймер hw_timer

Melandr

Member
Что никто ничего не может подсказать, в чем может быть прикол, что сработка идет по двум фронтам, вместо одного
 

pvvx

Активный участник сообщества
1610939012949.png
Включите осла на показ фронтов в 1 нс (на полосу в 300 MHz).
 

pvvx

Активный участник сообщества
К примеру вход "Reset" у ESP8266 чувствителен к импульсу в менее 1 нс примерно на половину напряжения в низ от "1"...
@Melandr перестаньте мучаться с ESP8266 - выкиньте его в помойку и возьмите что-то более подходящее для диммера (или обзаведитесь комплексом измерительного оборудования по стоимости жилья для средней семьи для возможности разработки и создания костылей к ESP8266 для всех ситуаций).
 

pvvx

Активный участник сообщества
Иначе эта тамагоча ESP8266 заберет у вас годы жизни и всё равно ничего хорошего не выйдет.
 

pvvx

Активный участник сообщества
Я его немного изменил, добавил OTA, так как неудобно постоянно плату передергивать, для перепрошивки.
Вы наверно думаете что у OTA на ESP8266 нет проблем? :) В каждой функции у ESP8266 куча бед и проблем, особенно в Arduino.
 

Melandr

Member
pvvx, доброго утра!
То есть, если я правильно понял, на спаде и фронте импульсов с детектора перехода через 0 присутствуют флуктуации напряжения на уровне перехода с низкого в высокое состояние, которые ESP определяет как срабатывание прерывания? Правда я так понимаю, в обработчике прерывания можно отключить до следующего полупериода прерывания по входу и включить в обработчике таймер. Но все равно, тогда смогу отслеживать только
gpio_pin_intr_state_set(GPIO_IN, GPIO_PIN_INTR_NEGEDGE);
 

pvvx

Активный участник сообщества
На своем варианте кода я это проверял - ложных срабатываний нет. Но был подключен программируемый генератор (0..150MГц и все виды сигналов) и он не дает шума на переходах. Длительности входных импульсов (скважность и периоды) проверялись все возможные...
 

pvvx

Активный участник сообщества
В форуме и инет пионеры писали, что у ESP8266 не все варианты прерываний по пинам работают правильно, но не уточняли что и как - пионеры и Arduino. Я не проверял все варианты и не буду.
 

Melandr

Member
Включите осла на показ фронтов в 1 нс (на полосу в 300 MHz).
pvvx, доброй ночи!
А не подскажите, где в настройках осциллографа необходимо включить показ фронтов, чтобы увидеть картинку как у Вас.
Осциллограф такой - https://masteram.com.ua/ru/super-phosphor-oscilloscope-siglent-sds1202x-e/
 

pvvx

Активный участник сообщества
pvvx, доброй ночи!
А не подскажите, где в настройках осциллографа необходимо включить показ фронтов, чтобы увидеть картинку как у Вас.
Осциллограф такой - https://masteram.com.ua/ru/super-phosphor-oscilloscope-siglent-sds1202x-e/
Никогда таким не пользовался. Самый дешевым купленным был RIGOL, на котором и показаны замеры - для этого и для использования в качестве монитора к PowerProfiler и был куплен на али.
А десяток лет назад (или более - уже не помню) для простых замеров (не активными щупами) был взят осел с честными 2Gs/s, но он имеет некрасивые картинки и уже давно валяется без дела... А дальше ослы по нарастающей... Но хвастаться нехорошо, на сем и заканчиваю.
 

pvvx

Активный участник сообщества
А не подскажите, где в настройках осциллографа необходимо включить показ фронтов
В дешевых ослах нет функции измерения джиттера. Там можно только включить наложение - persistence time.
И если хотите купить тот, на который указали, то по началу узнайте - какие там энкодеры. В дешевку часто ставят такие, которые высыхают и через год или пару будет пользоваться невозможно без замены...
 

Melandr

Member
pvvx, доброй ночи!
Не подскажите еще пару моментов, по работе с GPIO.
Собрал небольшой модуль диммера для отладки, с немного другой схемой отслеживания перехода через 0. вот сама схема.
2021-02-07_231104.jpg
Модуль диммера подключаю к плате https://arduino.ua/prod1492-wi-fi-modyl-nodemcu-esp8266
Для чистоты эксперимента решил использовать выводы D1 - для ZCD, D2 - для симистора. Это соответственно выводы GPIO5 и GPIO4
Для подключения к другим выводам сделал следующие изменения в программе:

#define GPIO_PIN4_CFG (*(volatile uint32_t *)0x60000338)

static const int GPIO_OUT = 4; // GPIO4
static const int GPIO_IN = 5; // GPIO5

PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);

GPIO_PIN4_CFG &= ~BIT(2); // normal out (push-pull)

Вопрос вот в чем. В коде который Вы мне дали ранее для выбора режима открытый коллектор или нормальный использовался такой код:
GPIO_PIN2_CFG &= ~BIT(GPIO_OUT); // normal out (push-pull)
Мне непонятно, почему для сброса бита 2 используется такая конструкция ~BIT(GPIO_OUT);
А если мне нужно использовать не 2-й пин, а 4-й? То для изменения режима выхода все равно нужно использовать бит 2?
И еще вопрос, вот осциллограмма управляющего импульса и переходов через 0
SDS00006.png
Почему-то амплитуда управляющего импульса 1,5 В, а не 3В. Светодиод оптрона подключен напрямую к пину GPIO4. В ранее использовавшейся схему на пине 2 была подтяжка 10к к питанию. Здесь ее тоже нужно было использовать?
 

pvvx

Активный участник сообщества
Почему-то амплитуда управляющего импульса 1,5 В, а не 3В. Светодиод оптрона подключен напрямую к пину GPIO4.
Вопрос вот в чем. В коде который Вы мне дали ранее для выбора режима открытый коллектор или нормальный использовался такой код:
GPIO_PIN2_CFG &= ~BIT(GPIO_OUT); // normal out (push-pull)
Мне непонятно, почему для сброса бита 2 используется такая конструкция ~BIT(GPIO_OUT);
Скачать ESP8266 GPIO Register 05.11.2014 в формате XLS
 

Melandr

Member
Семен Семенович, забыл поставить токоограничивающий резистор.
pvvx
хотел еще спросить, а поможет установка керамического конденсатора после резисторов R2 и R3 параллельно входу по переменке диодного моста, чтобы уменьшить помехи на входе? И какие требования к этому конденсатору по напряжению?
 

Melandr

Member
pvvx, доброй ночи!
Не подскажите еще один момент. В программе необходимо использовать два внешних прерывания по входу. При добавлении второго прерывания, у меня ломается первое. Не подскажите, что делаю не так?
Добавляется датчик индуктивности через опторазвязку, нужно считать период вращения.
Следующий код добавил
Код:
static const int GPIO_IN_SENS = 3; // GPIO3

void ICACHE_RAM_ATTR SENSORs_intr_handler(void *arg) {
  (void)arg;
  uint32_t tmp = GPIO_STATUS;
  GPIO_STATUS_W1TC = tmp;
  if (tmp & BIT(GPIO_IN_SENS)) {
    period = millis() - lastPeriodTime;
    lastPeriodTime = millis();
  }
  gpio_pin_intr_state_set(GPIO_IN_SENS, GPIO_PIN_INTR_POSEDGE);
  countPeriod++;
}

в секции setup()
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);
  gpio_output_set(0, 0, 0, BIT(GPIO_IN_SENS));
  gpio_pin_intr_state_set(GPIO_IN_SENS, GPIO_PIN_INTR_POSEDGE);
  ets_isr_attach(ETS_GPIO_INUM, SENSORs_intr_handler, NULL);
 

pvvx

Активный участник сообщества
Что никто не подскажет, что делаю неправильно?
Вам давно ответил - никто не разбирается в Arduino, т.к. концепция Arduino кроме копирования готовых 'скетчей' не предполагает ничего более.
Изучать напиленные любителями библиотеки тоже никому не требуется, а остальной код в Arduino проприетарный - закрыт бинарными либами.
А кто будет решать задачу за вас - создавать готовый 'скетч'? Обратитесь в раздел заказа платных услуг.
 

pvvx

Активный участник сообщества
Код, который вы пытаетесь адаптировать, не совместим с Arduino.

Все функции в Arduino должны делать всё за пользователя и они не могут работать быстро и иметь малый код. Делать всё за пользователя – это значит проверять все входные и выходные параметры, проверять и устанавливать все имеющиеся драйвера в состояние необходимое для работы этой функции и …. По этому даже простое изменение уровня на выводе пина в Arduino использует код в тысячу операторов СИ, массу таблиц в памяти и исполняется за сотни тысяч тактов процессора. Этого достаточно для мигания светодиодом, а на большее Arduino не заточена и не предполагает.
 

pvvx

Активный участник сообщества
Никаких прямых обращений к внутреннему оборудованию быть не должно - на каждую часть оборудования должен быть создан объект/класс C++ с разными абстракциями путем наследования от других типовых объектов/классов.
 

pvvx

Активный участник сообщества
Что никто не подскажет, что делаю неправильно?
В вашем случае неправильно - это использовать Arduino для решения этой простой задачи, т.к. оно не возможно в рамках Arduino для ESP8266. Решение вашей задачи возможно только путем низкоуровневого кодирования при использование SDK без конструкций C++. Т.е. C++ обращается к Heap и прочим ресурсам с неконтролируемым временем запрета прерываний, что убивает возможность решения вашей задачи с требуемой производительностью и джиттером на ESP8266.
Возьмите другой SoC, который имеет необходимые аппаратные возможности - тогда и Arduino как-то покатит....
 
Сверху Снизу