Добрый день,
Собрал LC-метр по схеме с сайта -
http://www.antennex.com/Sshack/aade/specs.htmПри проверке осциллографом с генератора выходят прямоугольные импульсы нужной частоты и амплитуды, внешние электромагнитные воздействия на форму и частоту импульсов никак не влияют. Для дополнительной защиты сделал экранирование контура.
В качестве МК выбрал ATmega16 на частоте 8 Мгц. Подключаю схему к 16 битному счетчику (также к пину подключено 10 кОм-ое сопротивление, которое "подтягивает" пин на землю), в течении 0,4 секунды таймер включен и считает импульсы,при переполнении счетчика происходит прибавление FFFFh к регистру организованному на 3х восьмибитных регистрах,по окончанию 0,4 секунды содержимое в регистрах TCNT1H и TCNT1L прибавляется к сумме 24х битного составного регистра, затем программа через COM-порт передает три байта данных (количество импульсов за 0,4 сек).
Проблема в том, что когда измеряется исходная частота в 750 КГц, так же при малых подсоединяемых емкостях (следовательно и малого уменьшения частоты) данные приходят верные и достаточно стабильные по значению, но когда подсоединяется относительно большая емкость в 100 нФ происходит сильное снижение частоты до 60 Кгц (проверено на осциллографе) и данные приходящие из счетчика становятся неверные их значение колеблется от 0 до 255, когда нормальным было бы значение в 20000.
Может быть проблема с частотой импульсов приходящих на пин таймера? то есть частоты ниже некоторой планки не могут быть правильно
подсчитаны таймером.
Cхема:
Стоит исключить предположение, что COM на МК настроен неверно или программа на компьютере настроена неправильно, т.к. все неоднократно проверялось путем пересылки нескольких байт, как с МК->ПК, так и наоборот.
Кусок исходного кода управления таймером:
Код
CMD_FREQ:
;очищаем регистр-накопитель
clr r1
clr r2
clr r3
;делаем замер частоты
ldi r17,(1<<CS10)|(1<<CS11)|(1<<CS12)
out TCCR1B,r17
clr r17
;ждем 0,4 секунды
rcall WAIT
;выключаем счет
out TCCR1B,r17
;считываем данные счетчика
in r21,TCNT1H
in r20,TCNT1L
;прибавляем к накопителю 'хвосты'
add r1,r20
adc r2,r21
adc r3,r17
;очистка
out TCNT1H,r17
out TCNT1L,r17
;отсылаем первый байт селектор
ldi r17,NORBYTE
out UDR,r17
rcall WAIT_USART
;отсылаем три информационных байта
out UDR,r3
rcall WAIT_USART
out UDR,r2
rcall WAIT_USART
out UDR,r1
rcall WAIT_USART
;обработчик прерывания переполнения TIMER1
AddVal:
;прибавляем значение переполнения
add r1,r23;в r23 и r24 заранее записано значение FFFFh
adc r2,r24
adc r3,r17; r17=0
reti
Программа для работы с МК по COM - Terminal v 1.9b
Сообщение отредактировал Didro - May 1 2009, 15:24