Уявляю напрацювання по вимірюванню тривалості імпульсу і періоду послідовності імпульсів. Взагалі, це досить затребувана тема. В першу чергу на підставі поданих напрацювань напрошується реалізувати частотомер, який в свою чергу, переростає в масу пристроїв, як то: металошукачі, вимірювачі індуктивностей, ємностей, ESR, тощо. Крім того зараз у продажу є різні перетворювачі (напруга / струм / тиск - частота), де представлені функції можуть знайти застосування. Генератор імпульсів я реалізую на ATtiny2313. Швиденько накидаю исходник:
Контролер тактується від кварцу 20 МГц (в принципі це не важливо). Використовую «неправильні» затримки стандартної бібліотеки (мається на увазі «неправильні» в плані оптимальності реалізації оних за допомогою таймерів), однак для цього прикладу це абсолютно не критично. Безпосередньо вимірювач реалізую на ATmega128 kit - вона у мене під рукою. Розглянемо процес вимірювання тривалості імпульсу.
На верхньому осциллограмме синім кольором показаний графік залежності значення рахункового регістра TCNT1 від часу рахунку (для зручності час я позначив періодами переповнення OverflowC). Значення TCNT1 инкрементируется від нуля до максимального значення 65535 (чорний пунктир), потім слід скидання в нуль і періодичний повтор n раз (див. Вершини «трикутників). На нижній осциллограмме показаний імпульс тривалістю Т, що приходить на вхід захоплення ICR1 лічильника T1 (PD4) з нашого знову випеченого генератора (хоча можна подати з будь-якого генератора). Спочатку налаштовуємо переривання по захопленню по наростаючому фронті. З цього фронту запам'ятовуємо значення лічильника TCNT1 = EdgeR. Потім розбудовуємо переривання по захопленню по спадаючому фронті. По ньому запам'ятовуємо значення TCNT1 = EdgeF. Між цими моментами часу можуть статися (якщо тривалість імпульсу більше періоду переповнення таймера 1) n переповнень таймера 1. Знаючи час переповнення таймера, а також тривалість такту рахунку tckl легко обчислюємо значення тривалості імпульсу за формулою:
Tpulse = EdgeF (tckl) - EdgeR (tckl) + 65536OverflowC (tckl);
або, спростивши вираз:
Tpulse = tckl (EdgeF - EdgeR + 65536OverflowC);
Період послідовності імпульсів вимірюється так само
тільки переривання по захопленню налаштоване постійно по наростаючому фронті.
Очевидно, що мінімальна тривалість імпульсу, яку зможе обробити дана реалізація функції буде менше часу виконання дій в обробнику переривання по захопленню. Симуляція в AVRStudio відміряла 49 тактів, тобто для 8 МГц - це 6,12 мкс, що і підтверджується практикою - мінімальне значення тривалості імпульсу, яке правильно обчислюється - 7 мкс (див. Фото).
Якщо зробити вимірювач на контролері з частотою 20 МГц (максимальна для AVR mega), то мінімальна обробляється тривалість буде вже 2,45 мкс, т.к такт - 50 нс * 49 = 2,45 мкс. Але це цифри для ЦІЄЇ реалізації - на асемблері буде, звичайно трохи краще. Якщо необхідно вимірювати менші тимчасові інтервали, потрібно скористатися зовнішніми керованими делителями. Але це вже інша історія.
В архіві исходник. Ясна річ, що исходник потрібно правити в залежності від поставлених завдань.
Знову одна і та ж, що кочує з одного сайту на інший, помилка. Вага змінної OverflowC дорівнює 65536!
Tpulse = tckl (| EdgeF - EdgeR | + 65536OverflowC) - більш суворе вираз
«... мінімальна тривалість імпульсу, яку зможе обробити дана реалізація функції буде менше. (Більше.) Часу виконання дій в обробнику переривання по захопленню. »Вибачте.
не працює вимірювач періоду. і взагалі ви врахували що EdgeF