• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Частотомер и WEB

pvvx

Активный участник сообщества
А не замахнутся ли нам, скажем, на 100 мгц?
А без проблем. Все RTL871x работают на 200 MHz. Можно больше, но это уже не IoT для датчиков... Потребление будет уже не то.
Вы бы для начала сделали чтобы ESP8266 хоть +-10 us давал джиттер на внешние прерывания по i/o при работе WiFi. А то всё это бесполезно, с его пропусками прерываний к 1 сек :)
 

pvvx

Активный участник сообщества
К слову относительно ваших сравнений RTL и ESP , вы как-то обошли молчанием тот факт, что ESP имеет большую мощность передатчика и большую чувствительность приемника, чем RTL.
Измерения нескольких контор (и тех. характеристики чипов) показали всё наоборот. Это уже разбиралось на форуме :p
ESP - шумит за диапазон, плохой передатчик, и сам себе в нутре делает помехи, что сказывается на его чувствительности приема. Вам уже сказано - нет ни одного тех. параметра, где RTL-ы хуже. :p Может ещё скажите, что невозможность поддержки HT40 - для ESP это круче :):)
Так мне это не надо.
Я уже говорил Вам, что делаю измерительные приборы для контроля физико-химических параметров веществ.
Это немного более скучные задачи, чем мигание лампочкой и показ температуры в туалете всему свету.
Поэтому мне нет особой надобности использовать WIFI для показа фото кошечек и размещения в облаке показаний из туалета.
Ккак следствие этому - ESP вполне устраивает.
Не видно "сделанных" устройств.
Все ваши напряги решены за 5..15 минут путем сборки примеров с "кошечками"... :p
Вы уже десяток тем создали - "как что-то простейшее решить на ESP8266". На нормальном устройстве таких вопросов не возникает.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Я уже говорил Вам, что делаю измерительные приборы для контроля физико-химических параметров веществ.
Вот вам и сделали в RTL871xBx Capture Timer. Можно измерять и десятки MHz. https://esp8266.ru/forum/attachments/um0114-realtek-ameba-z-data-sheet-pdf.3697/
Серия "B" - это чипы ещё дешевле (маленький кристалл) и с USB. Они на замену ESP8266, а серия "A" - на замену ESP-32S. :p
 
Последнее редактирование:

pvvx

Активный участник сообщества
Пока же я добавил к ESP две микросхемы и получил схему частотомера до 90 мгц с разрядностью 46 бит.
Это не частотомер - это счетчик импульсов. :) Не путайте народ.
Добавьте микросхем хотя-бы до определения спектральных составляющих по Прони :)
Паяйте микросхемы - Солнце ещё высоко :) Любой малыш возьмет хотя-бы RTL2832 и получит частотомер получше вашего, собираемого годами :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
для определения спектральных компонент микросхем не надо. Метод прони для измерения частоты периодического сигнала не есть хороший вариант.
Вы не забыли, что работаем с микропроцессорами? Поэтому кроме железа есть еще и алгоритм. У меня делитель частоты +алгоритм= частотомер.
У вас есть предложения лучше Прони для четвертей периодов или ещё короче окном? Очень хорошо идет на DSP (он-же называется и микроконтроллером).
Делитель не есть частотомер. Особенно на ESP8266, не способном высчитать период из-за джиттера в виде запретов прерываний на периоды к 1 сек в китай-SDK :)
Если собрали китай-подобие детской игрушки с названием "частотомер" то так и пишите - это игрушка для прикола :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Про спектральный анализ оставим тему, так как я в этой теме съел табун соба( ну как Вы в WIFI и переделки SDK),
и делал реально системы для диагностики спец техники. Поэтому обсуждать эту тему на подобного уровня форуме нет смысла.
Да не заметно. Наверно опять периодических сигналов, не реальных, бумажных :).
Что же касается частотомера, то у меня реализован на ESP до 1.5 мгц, последние измерения 1.2 мгц.
Время измерения 0.3 сек.
Вот этот работающий сейчас частотомер я и расширил до 90 мгц, пока лишь на схеме.
Счетчики собирали на рассыпухе ещё в 1970 годах. В чем там прикол?
 

pvvx

Активный участник сообщества
А зачем?
Выпендриваться - это Ваше любимое занятие. Я лишь сказал о том, что сделал. А делаю то, что мне интересно или нужно, а не для прикола.
Но вижу, что беседа не получается. Поэтому прощаюсь.
Ну и правильно. А то ваше поделие похоже на это http://www.tretnik.com/images/frec_1000_8_3.jpg и никому ныне не придет в голову такое собирать. (www.tretnik.com__Частотомер - цифровая шкала КВ, УКВ с ЦАПЧ с осьмиразрядным индикатором 1 Гц - 1000 МГц)
 

pvvx

Активный участник сообщества
RTL8710BN.
С генератора подано 15MHz.
Снимок16.gif
Бьет зараза с аппаратным счетчиком...:mad:

Есть ещё измерение длительности фронта с 40 MHz тактом на timer с аппаратной защелкой по фронту с возможностью слива данных по DMA замеров пачки импульсов...
Я лишь сказал о том, что сделал. А делаю то, что мне интересно или нужно, а не для прикола.
Вы всё так и паяете рассыпуху-костыли к ESP8266? :)
А в RTL8710BN можно и для прикола взять пример из SDK, поправить как удобнее и паять ничего не надо... :)
 
Последнее редактирование:

sir999

New member
Да, с ESP32 есть одна великая засада, которая растет по мере раскопок, это непрозрачность работы ядра. Когда работаешь на критических уровнях работы МК, типа регенерации импульсов по прерыванию, частотой в 4 МГц (и это почти максимум, что мог выжать, при работе ядра в 240 МГц!!!), то возникают некие "глюки" (а могут и не возникать...). И никак не подстраховаться кодом, ибо неуправляемо. При этом, вся работа на уровне команд из SDK. В таких случаях готов забить на китайское творение и сидеть на ПЛИС (на них нАсидеться можно вдоволь...).
Так что, pvvx, Вы тут абсолютно правы, непредсказуемость в критических состояниях работы (а эти "критические состояния" иногда больше подходят для МК 20-летней давности) - есть. Но если работа алгоритма адекватна и сам не косячишь - все работает очень стабильно.
Вообще МК - это ядро, и для роста в промышленный МК требуется качественная обвязка: - стабильное питание, защита от перенапряжения, наводок, гальваническая развязка по входам, гальваническая развязка по питаниям различных блоков, применение цифровых интерфейсов для RS-485, например, и т.д. Только применяя необходимые обвязки для определенных условий, устройство "вырастает" до своего назначения. И с обвязкой и не глючным алгоритмом программы, ESP32 работает стабильно и без глюков.
С другой стороны, если не требуется Wi-Fi, можно применить те же STM32 (и почему-то у pvvx на это ни слова - продажник RTL7810???...).
 

pvvx

Активный участник сообщества
С другой стороны, если не требуется Wi-Fi, можно применить те же STM32 (и почему-то у pvvx на это ни слова - продажник RTL7810???...).
1) Я ничего не продаю, кроме Arduino к RTL8710BN для Ардуино-полконников за 500 т.р. :) Желающим сопровождать выдается по запросу бесплатно.
2) Тут сайт о WiFi-SoC. Когда будет готов у ST WiFi-SoC, непременно сравню его с ESP8266.
Так что, pvvx, Вы тут абсолютно правы, непредсказуемость в критических состояниях работы (а эти "критические состояния" иногда больше подходят для МК 20-летней давности) - есть. Но если работа алгоритма адекватна и сам не косячишь - все работает очень стабильно.
Вообще МК - это ядро, и для роста в промышленный МК требуется качественная обвязка: - стабильное питание, защита от перенапряжения, наводок, гальваническая развязка по входам, гальваническая развязка по питаниям различных блоков, применение цифровых интерфейсов для RS-485, например, и т.д. Только применяя необходимые обвязки для определенных условий, устройство "вырастает" до своего назначения. И с обвязкой и не глючным алгоритмом программы, ESP32 работает стабильно и без глюков.
И это не противоречит:
Да, с ESP32 есть одна великая засада, которая растет по мере раскопок, это непрозрачность работы ядра. Когда работаешь на критических уровнях работы МК, типа регенерации импульсов по прерыванию, частотой в 4 МГц (и это почти максимум, что мог выжать, при работе ядра в 240 МГц!!!), то возникают некие "глюки" (а могут и не возникать...). И никак не подстраховаться кодом, ибо неуправляемо.
?
"ESP32 работает стабильно и без глюков" "ибо неуправляемо" :)

У вас есть пример частотомера на ESP32? Или это ваш пост об том, что там не смогли выделить одно ядро чисто пользователю?
 
Последнее редактирование:

sir999

New member
1) Я ничего не продаю, кроме Arduino к RTL8710BN для Ардуино-полконников за 500 т.р. :) Желающим сопровождать выдается по запросу бесплатно.
2) Тут сайт о WiFi-SoC. Когда будет готов у ST WiFi-SoC, непременно сравню его с ESP8266.
И это не противоречит: ?
"ESP32 работает стабильно и без глюков" "ибо неуправляемо" :)

У вас есть пример частотомера на ESP32? Или это ваш пост об том, что там не смогли выделить одно ядро чисто пользователю?
У меня есть пример многоканального генератора, но так как потребовалось согласование (ООС) по спектру резонансных частот, хотел дописать в алгоритм и частотомер с простенькой внешней обвязкой (в виде компаратора), с диапазоном рабочих частот частотомера и генераторов: 1-5 МГц.
И Был "приятно" удивлен, не найдя элементарного счетчика, не говоря уж о том, что 2-х ядерный процессор на рабочей частоте 240 МГц, оказывается, на 99% занят выполнением инструкций своего ядра, хотя по логике, грузите ось на одно ядро и выполняйте на нем внешние коммуникации, второе же оставьте абсолютно прозрачным, и пропишите четкие инструкции его конфигурирования, не через закрытые мегафункции SDK, (и к тому же SDK постоянно видоизменяется) и уж не тем более через библиотеки Ардуино, а напрямую через конфигурирование регистров ядра.
И если я выполняю 2 команды прямого управления регистром (при выключенном Wi-Fi), почему выходная частота импульсов не превышает нескольких мегагерц ?...
Это значит, что мой алгоритм выполняется в эмуляторе ядра контроллера ОС, под полным ее контролем.
Поэтому для частотомеров и генераторов лучше всего подойдут ПЛИС с обвязкой. Универсальности не получится.
И несмотря на тотальный контроль выполнения ОС в ESP32, модули идеально работают по не сложным алгоритмам, подключенные в одну сеть на один сервер в качестве слейвов, не только передавая данные по Modbus TCP, но и опрашивая другие устройства по Modbus RTU с выполнением несложного алгоритма.
 

pvvx

Активный участник сообщества
И если я выполняю 2 команды прямого управления регистром (при выключенном Wi-Fi), почему выходная частота импульсов не превышает нескольких мегагерц ?...
Тут у вас ошибка в понятии архитектуры - GPIO контроллер находится на медленной шине и тактируется сам низкой частотой. При обращении к регистрам GPIO выставляется сигнал ready/busy CPU. Если, по прерываниям, то надо сохранить и восстановить регистры CPU и FPU... Поэтому никаких близких к частоте ядра дерганий пинами не получите.
Это значит, что мой алгоритм выполняется в эмуляторе ядра контроллера ОС, под полным ее контролем.
Немного не так. RTOS занимает время, но, в основном на переключение задач. Есть тик системы, по которому происходит переключение задач. Он обычно на прерывании таймера. Чем чаше он, тем больше отнимает времени CPU на диспетчер задач RTOS. Как пример - RTL-ки нормально справляются c WiFi и TCP стеком при 10 МГц на CPU и 1 мс тике RTOS. Если понижать далее частоту CPU, то получим лаги. Из этого выходит, что при 160 МГц на CPU на системное обслуживание с основными функциями WiFi уходит до 7% производительности CPU.
Поэтому для частотомеров и генераторов лучше всего подойдут ПЛИС с обвязкой. Универсальности не получится.
Без проблем получается. Пример - у RTL8710BN есть DMA и PWM каналы с 16 бит счетчиками, которые тактируются 40 МГц и каждая длительность импульса загружается по DMA. DMA может обслуживать и кольцевой буфер. Так-же обратная функция - счет длительности внешнего импульса с чтением счетчика по фронту этого импульса по DMA. Ну и обычное чтение счетчика внешних импульсов по DMA за заданный временной период таймером...
 
Последнее редактирование:

sir999

New member
Тут у вас ошибка в понятии архитектуры - GPIO контроллер находится на медленной шине и тактируется сам низкой частотой. При обращении к регистрам GPIO выставляется сигнал ready/busy CPU. Если, по прерываниям, то надо сохранить и восстановить регистры CPU и FPU... Поэтому никаких близких к частоте ядра дерганий пинами не получите.
Немного не так. RTOS занимает время, но, в основном на переключение задач. Есть тик системы, по которому происходит переключение задач. Он обычно на прерывании таймера. Чем чаше он, тем больше отнимает времени CPU на диспетчер задач RTOS. Как пример - RTL-ки нормально справляются c WiFi и TCP стеком при 10 МГц на CPU и 1 мс тике RTOS. Если понижать далее частоту CPU, то получим лаги. Из этого выходит, что при 160 МГц на CPU на системное обслуживание с основными функциями WiFi уходит до 7% производительности CPU.

Без проблем получается. Пример - у RTL8710BN есть DMA и PWM каналы с 16 бит счетчиками, которые тактируются 40 МГц и каждая длительность импульса загружается по DMA. DMA может обслуживать и кольцевой буфер. Так-же обратная функция - счет длительности внешнего импульса с чтением счетчика по фронту этого импульса по DMA. Ну и обычное чтение счетчика внешних импульсов по DMA за заданный временной период таймером...
Все. Разобрался.
PWM в ESP32 выдает импульсы до 40 Мгц (тактируется 80 МГц), PCNT (Частотомер) считает импульсы до 80 МГц.
 

Алексей.

Active member
И Был "приятно" удивлен, не найдя элементарного счетчика, не говоря уж о том, что 2-х ядерный процессор на рабочей частоте 240 МГц, оказывается, на 99% занят выполнением инструкций своего ядра, хотя по логике, грузите ось на одно ядро и выполняйте на нем внешние коммуникации, второе же оставьте абсолютно прозрачным, и пропишите четкие инструкции его конфигурирования, не через закрытые мегафункции SDK
Если Вы выполняете задачи на первом ядре, а нулевое не используете, то процессор по прежнему занят на 99%? Очень странно... У меня есп32 работает на spi слейвом, очень критично время выполнения транзакции, пока не оставил нулевое ядро для некритических ко времени тасков, получал не контролируемое поведение.
 

pvvx

Активный участник сообщества
PWM в ESP32 выдает импульсы до 40 Мгц (тактируется 80 МГц), PCNT (Частотомер) считает импульсы до 80 МГц.
Странно, но не нашел в ESP-IDF DMA для PCNT... Аналогично и с PWM. Баз этого ими только яркость светодиода менять...
Ни для каких таймеров DMA у ESP32 нет :(:
Снимок2.gif
 
Последнее редактирование:

pvvx

Активный участник сообщества
Если Вы выполняете задачи на первом ядре, а нулевое не используете, то процессор по прежнему занят на 99%? Очень странно... У меня есп32 работает на spi слейвом, очень критично время выполнения транзакции, пока не оставил нулевое ядро для некритических ко времени тасков, получал не контролируемое поведение.
Лаги и неопределенности в скорости работы у ESP32 возникают от малой "кэш" на XIP к Flash и низкой частоте работы шины SPI к Flash. При работе двух ядер ни о каких 240 МГц там разговор идти не может. Тем более там очень жирный код и всё в "кэш" XIP не лезет, а ROM прописана "Байсиком" вместо API. 40 MHz QSPI - это всего 16 Мбайт в сек в теоретическом максимуме... Проц имеет не 8 битные команды, т.е. в реалии скорость исполнения частей кода падает ниже производительности любого другого проца на десятку МГц. Частоту CLK у CPU ESP32 и понизили по умолчанию в ESP-IDF... Ещё лаги с FPU - наверно лучше его не использовать, чтобы не давал неопределенные задержки и отключить в компиляторе...
При 240 МГц на ядро ESP32 греет хорошо... :)
 
Последнее редактирование:

sir999

New member
Странно, но не нашел в ESP-IDF DMA для PCNT... Аналогично и с PWM. Баз этого ими только яркость светодиода менять...
Ни для каких таймеров DMA у ESP32 нет :(:
Посмотреть вложение 5941
Счетчик Импульсов:
Pulse Counter — ESP-IDF Programming Guide v3.0-dev-1839-gc97b875 documentation
PWM:
LED Control — ESP-IDF Programming Guide v3.0-dev-1839-gc97b875 documentation
ШИМ, для генерации 40 МГц используется только в двоичном режиме (вкл-выкл) с 50% скважностью.
По таймерам для ШИМ - там же.
 

sir999

New member
Лаги и неопределенности в скорости работы у ESP32 возникают от малой "кэш" на XIP к Flash и низкой частоте работы шины SPI к Flash. При работе двух ядер ни о каких 240 МГц там разговор идти не может. Тем более там очень жирный код и всё в "кэш" XIP не лезет, а ROM прописана "Байсиком" вместо API. 40 MHz QSPI - это всего 16 Мбайт в сек в теоретическом максимуме... Проц имеет не 8 битные команды, т.е. в реалии скорость исполнения частей кода падает ниже производительности любого другого проца на десятку МГц. Частоту CLK у CPU ESP32 и понизили по умолчанию в ESP-IDF... Ещё лаги с FPU - наверно лучше его не использовать, чтобы не давал неопределенные задержки и отключить в компиляторе...
При 240 МГц на ядро ESP32 греет хорошо... :)
Частота ядра устанавливается при прошивке алгоритмом. По умолчанию она 240 Мгц. Flash работает на 80 Мгц. Лагов с FPU нет, если вычисления с плавающей точкой не задействуют Flash, используя при первом вычислении обмен с ним. Во всяком случае, эти функции можно расположить в IRAM через инициализацию IRAM_ATTR.
 

pvvx

Активный участник сообщества
Arduno ESP8266:
Код:
Start Test at 44 (millis)...
Average data 61.60 (61), worked time: 2916 ms
Start Test at 3060 (millis)...
Average data 61.60 (61), worked time: 2916 ms
...
Arduno ESP32:
Код:
Start Test at 47 (millis)...
Average data 122.02 (121), worked time: 16912 ms
Start Test at 17059 (millis)...
Average data 122.02 (121), worked time: 16909 ms
Start Test at 34068 (millis)......
И врет время. Пишет 16 сек, а проходит более 20... Т.е. даже все потроха FPU сбивает... В зависимости от сборки и включения питания модуля показывает и 0 ms. При этом счет millis() идет только на delay(50+50) в приложенном коде. :) Выходит нечто такое:
Код:
Start Test at 47 (millis)...
Average data 122.02 (121), worked time: 0 ms
Start Test at 147 (millis)...
Average data 122.02 (121), worked time: 0 ms
Start Test at 247 (millis)......
И на WDT нарывается, когда как-то ещё работает:
Код:
Average data 122.02 (121), worked time: 16909 ms
Start Test at 2285819 (millis)...
Task watchdog got triggered. The following tasks did not reset the watchdog in time:
 - IDLE (CPU 0)
Tasks currently running:
CPU 0: ipc0
CPU 1: IDLE
Arduno RTL серии "A" ~ 2300 ms (нет FPU, нет XIP)
Arduno RTL серии "B" ~ 300 ms (есть FPU, есть XIP)

Код:
#if defined(ARDUINO_AMEBA)
#include "flash_api.h"
#define flash_read_dword(faddr, pdata)    flash_read_word(&flashobj, faddr, pdata);
#else
#include "Esp.h"
#define flash_read_dword(faddr, pdata)    ESP.flashRead(faddr, pdata, 4);
#endif

void setup() { Serial.begin(115200); }

#define count (1024*1024)
uint32_t summ = 0;
float f = 0.0;
void test(void) {
  uint32_t faddr = 0;
  uint32_t dw;
  while (faddr < count) {
    flash_read_dword(faddr, &dw);
    faddr += 4;
    for (int i = 0; i < 4; i++) {
      uint8_t b = (uint8_t)dw;
      f += (float)b;
      summ += (uint32_t)b;
      dw >>= 8;
    }
  }
  f /= (float) count;
  summ /= count;
}

void loop() {
  Serial.print("Start Test at ");
  Serial.print(millis());
  Serial.println(" (millis)...");
  delay(50);
  volatile uint32_t mm0 = millis();
  test();
  mm0 = millis() - mm0;
  Serial.print("Average data ");
  Serial.print(f);
  Serial.print(" (");
  Serial.print(summ);
  Serial.print("), worked time: ");
  Serial.print(mm0);
  Serial.println(" ms");
  delay(50);
}
Навеяно гонять double и float массивами этим -> https://esp8266.ru/forum/threads/rtl8710bn-potreblenie-cpu.3190/page-6#post-49118 :)
Конкретно tpm_server/main.c at master · MBleiders/tpm_server · GitHub
На RTL скомпилил это путем мелких замен названий процедур и получил скорость в десятки кsps... А с ESP32 - не выходит... :(
 
Последнее редактирование:

pvvx

Активный участник сообщества
Частота ядра устанавливается при прошивке алгоритмом. По умолчанию она 240 Мгц. Flash работает на 80 Мгц. Лагов с FPU нет, если вычисления с плавающей точкой не задействуют Flash, используя при первом вычислении обмен с ним. Во всяком случае, эти функции можно расположить в IRAM через инициализацию IRAM_ATTR.
При 240 МГц модули ESP32 не стартуют от USB - провал по питанию из-за 500 мА при инициализации WiFi и инициализация выходит не успешная (или виснет, или потом беды с WiFi, или ... ).
Памяти и так в чипе мало (безобразно мало для двух ядер и общей частоты CPUs к пол ГГц). Т.е. память забыли вообще поставить в ESP32. Поставили только "кэш", а внешнюю не предусмотрели - бюджета ноги чипу не хватило :)
 
Последнее редактирование:
Сверху Снизу