реклама на сайте
подробности

 
 
> LC-метр. Измерить малые частоты.
Didro
сообщение May 1 2009, 15:22
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 94
Регистрация: 9-04-07
Пользователь №: 26 893



Добрый день,
Собрал 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
John851
сообщение May 5 2009, 09:41
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



Цитата
Судя по reti, с таймером Вы боретесь в прерывании (каком?)

немного не понял в каком смысле употреблено слово "боретесь". Помоему суть ясна - если задержку делать в 1 сек, то счетчик даже 16и битный на частоте в 750кГц переполнится не один раз, поэтому как только он переполняется так сразу к составному 24х битному регистру добавляется FFFF (значение переполнения). Затем когда 1 сек пройдет счетчик отключается и то что он насчитал записывается в регистры и также прибавляется к составному регистру.

Цитата
Завешивать контроллер на 0.4 с или на 1 с в тупом WAIT, да еще и в прерывании, некошерно

Хм, интересно почему? Ну вопервых что то ведь должно считать отрезок времени на который таймер включен на прием внешних импульсов. Использовать другой таймер?? Во вторых - допустим я освободил МК от процедуры WAIT и что же он должен выполнять в течении 1 сек (во время выполнения процедуры WAIT кроме как обработки прерываний у МК нет других задач) спать? впринцыпе мне без разницы какое потребление энергии будет у МК, тк питается от сети, поэтому мне безразлично спит он или нет, а вот уже структуру программы это усложнит.

Цитата
что в нем таймер ПИК'а использовался с предделителем на 8.

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

Цитата
Вы пытаетесь измерить, т.е. подсчитать число периодов за образцовый интервал времени. К чему тогда фривольные упражнения с этим интервалом? Пытаетесь подогнать задачу под ответ?

как я понял вы что-то хотите сказать насчет того зачем я увеличил промежуток времени с 0,4 сек до 1 сек?? если да, то повторятся не буду я уже в нескольких сообщениях описал почему я так сделал. И что в этом плохого? ну увеличил интервал и сделал прямой счет частоты без всяких умножений на 4 как это было бы с задержкой в 0,4 сек.

Цитата
Насчет "Прибор получился достаточно точный..." тоже есть сомнения хотя бы из-за способа формирования интервала времени счета.

я не сомневаюсь, потому что я его уже сделал и еще раз повторюсь что достаточно точный для меня. Конечно он 0,1 пФ навряд ли вычисит но 1 пФ у меня вычислился точно.

Цитата
А задача измерения (такой) частоты весьма примитивна

понятно что эта задача примитивна и чем мое решение этой задачи неверно?? помоему нормальное решение, просто сложнее мне нет надобности делать. Конечно, если будет критично подвешивание МК процедурой WAIT, то я избавлюсь от нее и перенесу эту задачу на переферию, а усложнение кода мне никчему в данной задаче.



Всегда уходим от моего вопроса, на который я очень хочу узнать ответ. Это хорошо конечно, что мне говорят где в моем коде есть нерациональные моменты и какой точности прибор, но проблема в другом:

Цитата

Если включать таймер на 0,4 секунды (как это написано в техн. описании прибора), то наблюдается что то непонятное. Тестовая частота 760 Кгц на счетчике за этот период времени насчитывается без проблем, но стоит подключить конденсатор с нанофарадной емкостью (к примеру 100 нФ), так с МК начинают приходить очень странные данные - всегда заполнен только младший байт и значения в нем колеблются от 0 до 255. я и подумал, что проблема в частоте поступающих импульсов.
С увеличением задержки до 1 секунды проблема исчезает.
Вопрос: почему так происходит?? вроде же таймеру всеравно сколько времени считать и неважно какой частоты приходят импульсы. Возможно МК с деффектом или счетчик AVR всетаки имеет какие то ограничения.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Didro   LC-метр. Измерить малые частоты.   May 1 2009, 15:22
- - domowoj   А как же у людей работает, публикаций много вот н...   May 2 2009, 11:03
- - John851   вопрос не в том какже у людей работает, а где ошиб...   May 2 2009, 14:42
- - John851   сам себе же и отвечу... почему то при увеличении з...   May 2 2009, 16:07
|- - rx3apf   Цитата(John851 @ May 2 2009, 20:07) сам с...   May 2 2009, 21:41
|- - John851   Цитата(rx3apf @ May 3 2009, 00:41) ...   May 3 2009, 13:11
- - domowoj   Если не получается измерять частоту с достаточной ...   May 3 2009, 13:40
- - John851   да это тоже выход, но проблема в другом: Если вкл...   May 4 2009, 17:17
- - xemul   Судя по reti, с таймером Вы боретесь в прерывании ...   May 4 2009, 20:13
|- - xemul   Цитата(John851 @ May 5 2009, 13:41) немно...   May 5 2009, 11:58
- - John851   ЦитатаВ смысле "Вся наша жизнь - ...". Н...   May 5 2009, 15:45
- - xemul   Мил человек, уж, вестимо, не Вам учить меня велик...   May 5 2009, 17:32
- - John851   Знаки препинания надоело расставлять, а черными за...   May 5 2009, 18:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016