Частотомер на LGT8F328P (Arduino)

На базе микроконтроллера LGT8F328P можно сделать частотомер, с достаточно большой точностью и стабильностью измерений. Показания частоты выводятся на 8-и разрядный семисегментный индикатор на базе микросхемы max7219.

Микросхема MAX7219 – это компактный драйвер индикатора, который позволяет управлять 7-сегментными индикаторами разрядностью до 8 цифр или 64 отдельными светодиодами. Драйвер управляется по последовательному интерфейсу SPI.

Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост

Микроконтроллер LGT8F328P содержит 4 таймера, два из которых 8-и разрядные и два 16-и разрядные. На основе двух 16-и битный таймеров будет осуществлено измерение частоты.

Схема частотомера очень простая:

Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост

На вход D5 подается сигнал уровня TTL, а на выходе D11 присутствует импульсный сигнала (меандр) для тестирования работы частотомера.

Частотомер работает следующим образом — на вход Т1 Timer_1 подается входной сигнал (TTL), Timer_1 сконфигурирован на работу с внешним тактовыми импульсами источником которого является измеряемый сигнал.

TCCR1A = 0;

TCCR1B = 0;

TCNT1=0;

TCCR1B = (1 << CS12) | (1 << CS11) | (1 << CS10);

TIMSK1 = (1 << TOIE1);

TCKCSR = (1 << F2XEN) | (1 << TC2XS1);

Биты CS12 CS11 CS10 регистра TCCR1B настроены на внешний режим тактирования:

Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост

Бит TOIE1 регистра TIMSK1 переводит таймер в режим — сброс при переполнении (прерывание).

Биты F2XEN TC2XS1 регистра TCKCSR запускаю высокоскоростной режим синхронизации.

Если на вход Т1 таймера поступают тактовые импульсы, счетчик TCNT1 начинает отсчет импульсов до максимального значения 65535 (при условии что входной сигнал имеет частоту выше 65535 Гц) далее он обнуляется и происходит прерывание. В обработчике прерывания указан следующий код:

ISR(TIMER1_OVF_vect) {tic++;}

Этот код просто подсчитывает кол-во прерываний.

Timer_3 имеет разрешение 16 бит, его задача состоит в точном отсчете времени измерения в 1 секунду.

TCCR3B = (1 << CS32) | (1 << WGM32);

TIMSK3 = (1 << OCIE3A);

OCR3A = CAL;

Бит CS32 регистра TCCR3B устанавливает предделитель на 256, бит WGM32 активирует режим СТС (сброс при совпадении счетного регистра TCNT1 с регистром сравнения OCR3A).

Регистр OCR3A содержит значение CAL отмеряющее 1 секунду.

При совпадении счетного регистра TCNT1 с регистром сравнения OCR3A происходит прерывание:

ISR(TIMER3_vect) {

if (TIFR3 & (1 << OCF3A)){

TIFR3 = 1 << OCF3A;

freq = tic*0xFFFF + TCNT1;

tic=0;

TCNT1=0;

w=1;

} }

В обработчике прерывания Timer_3 происходит подсчет частоты:

freq = tic*0xFFFF + TCNT1;

то есть кол-во прерываний Timer_1 умножается на 65535, так как одно прерывание содержит 65535 отсчетов счетного регистра TCNT1 и далее к полученному значению прибавляется остаток счета в регистре TCNT1.

После чего кол-во прерываний Timer_1 и показания счетного регистра обнуляются, а в переменной freq содержится значение измеренной частоты, которые выводится на восьми разрядный семисегментный индикатор.

При наличии очень точного импульсного генератора можно откалибровать частотомер при помощи значения счетного регистра:

#define CAL 62502; //62499 = 1 sec

При прошивке микроконтроллера рекомендую ознакомится со следующей статьей —  LGT8F328P-LQFP32 MiniEVB в Arduino IDE , версия платы не ниже 2.0.0

Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост

Так же при конфигурировании платы в Arduino IDE руководствуйтесь этим скриншотом:

Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост
Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост

Скетч - http://rcl-radio.ru/?p=130049

TECHNO BROTHER

1.7K поста12.5K подписчика

Добавить пост

Правила сообщества

1-Мы А-политическое сообщество. 2-Запрещено оскорбление: Администрации Пикабу, сообщества, участников сообщества а также родных, близких выше указанных.

3-Категорически запрещается разжигание межнациональной розни или действий, направленных на возбуждение национальной, расовой вражды, унижение национального достоинства, а также высказывания о превосходстве либо неполноценности пользователей по признаку их отношения к национальной принадлежности или политических взглядов. Мат - Нежелателен. Учитесь выражать мысли без матерщины