Страница 1 из 1

Аппаратный анализатор импульсов на 328/168 с использованием его ICP

Добавлено: 22 июл 2026, 08:08
lfgjikjjyj
Для версии 7,5,2

ICP — инпут каптуре пин, ну или что-то типа «фотографии» входного сигнала.
Аппаратно захватывает сигнал за один тик процессора и фиксирует количество тиков до следующего захвата; далее по тикам получаем период за крошечный минимум накладных расходов на измерение.


2026-07-22_101442.png

Анализатор импульсов 328_168.ubl

Важно - нано желательно не использовать у них плохие кварцы стоят а вот уно промини там хорошие стоят.
Забирает таймер 1, забирает пин 8.
  • Можно включить подтягивающий резистор, чтобы пин не болтался.
  • Можно включить аппаратное шумоподавление.
  • Выбрать замер только импульса
  • Выбрать замер только паузы
  • Выбрать замер только периода
  • Задать время выборки количества данных.
  • Блокировка сторонних прерываний.
Шумоподавление — крошечное, всего 4 тика проца.
  • Производит 4 выборки сигнала на входе.
  • Сигнал проходит, только если все 4 выборки одинаковы.
  • Отфильтровывает короткие помехи (< 250 нс при 16 МГц).
  • Добавляет задержку 4 такта (250 нс).
  • Работает на аппаратном уровне, не задействуя ЦПУ.
Время выборки количества данных:
Время, за которое набирается выборка данных:
  • для 100 кГц (100 мс) соберёт 10 000 замеров;
  • для 10 кГц (100 мс) соберёт 1 000 замеров;
  • для 1 кГц (100 мс) соберёт 100 замеров;
  • для 1 Гц достаточно поставить 1 000 мс — он даст выборку в 1 замер.
Есть приоритет срабатывания прерываний по индексу: самый высокий приоритет у Pin2, потом Pin3 и ICP — где-то там потом.
Поэтому блокируем на случай, если произойдёт два прерывания в единицу времени, либо, наоборот, отдаём приоритет другим, если замер импульса не настолько важен, как событие по Pin2, допустим.

Замеры, сравнение:

Анализатор импульсов среднее: при своих настройках измерения только импульса и опросе 100 мс (а это 1000 выборок) при входном сигнале 10 кГц, у которого импульс, судя по осциллографу, скачет 50,0–50,1 мкс (больше знаков не выдаёт), в UART выводит стабильные:
08:47:03.452 -> 50.00
08:47:03.545 -> 50.00
08:47:03.642 -> 50.00
08:47:03.830 -> 50.00
08:47:03.922 -> 50.00
08:47:04.109 -> 50.00
Если подать 100 кГц (по осциллографу 5,00–5,01 мкс), а при 100 мс выборка будет 10 000, в UART выводим почти стабильные:
08:48:48.517 -> 5.00
08:48:48.657 -> 5.00
08:48:48.750 -> 5.01
08:48:48.843 -> 5.00
08:48:48.936 -> 5.00
08:48:49.123 -> 5.00
08:48:49.217 -> 5.00
Анализатор импульсов: (замер только импульса) при тех же 100 кГц:
08:56:10.416 -> 5.00
08:56:10.462 -> 5.06
08:56:10.462 -> 5.00
08:56:10.462 -> 4.94
08:56:10.462 -> 5.00
08:56:10.507 -> 4.94
08:56:10.507 -> 5.00
08:56:10.507 -> 4.94
08:56:10.507 -> 5.00
08:56:10.552 -> 5.06
Идёт ошибка квантования, равная +/- 1 тику дискретизации входного сигнала (и чем больше входная частота, тем крупнее будет этот тик по формуле).

Если подать 10 кГц:
09:01:07.294 -> 50.06
09:01:07.294 -> 50.00
09:01:07.294 -> 50.06
09:01:07.294 -> 50.00
09:01:07.294 -> 49.94
09:01:07.294 -> 50.00
09:01:07.387 -> 50.06
09:01:07.387 -> 50.00
09:01:07.387 -> 49.94
09:01:07.387 -> 50.00
то всё то же самое: ошибка на уровне 1 тика.

Если взять штатный блок скоростного счётчика на замер импульса, те же условия:
при 10 кГц:
09:07:23.318 -> 48
09:07:23.318 -> 52
09:07:23.318 -> 52
09:07:23.318 -> 52
09:07:23.318 -> 48
09:07:23.318 -> 44
09:07:23.318 -> 48
09:07:23.318 -> 52
09:07:23.318 -> 48
09:07:23.318 -> 48
09:07:23.318 -> 48
при 100 кГц:
09:08:56.156 -> 12
09:08:56.156 -> 12
09:08:56.156 -> 12
09:08:56.249 -> 4294901772
09:08:56.249 -> 8
09:08:56.249 -> 12
09:08:56.296 -> 12
09:08:56.296 -> 12
09:08:56.296 -> 12
09:08:56.344 -> 8
09:08:56.344 -> 8
09:08:56.392 -> 16776204
09:08:56.392 -> 12
09:08:56.392 -> 12
09:08:56.440 -> 12
появляются аномалии, да и точность не очень.

По поводу нагрузки на код: чем выше частота, тем она сильнее, и ближе к 100 кГц прерывания почти забивают весь временной фон лупа, притом у штатного это ещё хуже, потому что его прерывания заметно длиннее.
На очень малой частоте, по сути, без разницы: замеры, их ошибки уходят далеко за тысячные и более. Можно внешне прикрутить усреднение к штатному, но в нём нет смысла, ибо его шаг замера очень крупный — в микросекундах, а у аппаратника уходит в наносекунды от 250гц.

Применение:
Применить можно и для датчиков, у которых сигнал закодирован в ШИМ.
К примеру, CO2 MH-Z19: у него показания масштабированы в длине импульса при фиксированном периоде 1004 мс.
Работать будет прекрасно с такой низкой частотой да ещё сделать допроверку периода, но под него, допустим, оптимальнее код написать под пин 8, конкретизируя нужные моменты, убрав мультиобвязку.