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