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

 
 
> 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
xemul
сообщение May 5 2009, 11:58
Сообщение #3



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(John851 @ May 5 2009, 13:41) *
немного не понял в каком смысле употреблено слово "боретесь".

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

Если означенное действо происходит где-то в WAIT, вопрос снимается. Но из представленного кода ни разу не следует, что переполнение таймера каким-либо образом обрабатывается. Видна только неловкая и безусловная (в смысле - независящая от наличия или отсутствия переполнения таймера) суета вокруг r1-r3 в весьма странном месте.
Цитата
Хм, интересно почему? Ну вопервых что то ведь должно считать отрезок времени на который таймер включен на прием внешних импульсов. Использовать другой таймер??

Я уже предлагал воспользоваться поиском по форуму. Можно еще и аппноты атмелёвые почитать.
Цитата
Во вторых - допустим я освободил МК от процедуры WAIT и что же он должен выполнять в течении 1 сек (во время выполнения процедуры WAIT кроме как обработки прерываний у МК нет других задач) спать? впринцыпе мне без разницы какое потребление энергии будет у МК, тк питается от сети, поэтому мне безразлично спит он или нет, а вот уже структуру программы это усложнит.

В принципе, МК может еще заниматься индикацией, опросом клавы, общением с внешним миром...
Даже если эти действа Вы не предполагаете, такое построение программы просто неудачно. Любая (самописная) прога - это приобретение опыта и наработка удобных шаблонов. Ваша прога в этом плане - опыт отрицательный.
Цитата
да, вы правы там таймер с предделителем внешних импульсов, в AVR это ксожалению невозможно сделать из-за другой структуры счетчика. Поэтому я и использую составной регистр.

Не проблема. Железо АВР позволяет без проблем считать такую частоту. Вам нужно только корректно обрабатывать переполнения таймера или выбрать такой интервал счета, чтобы эти переполнения не приключались.
Формула проста как манная каша: NTMR = To * fx.
NTMR_max и fx_max известны. Отсюда To <= NTMR_max/fx_max (имхо, так выбирался интервал счета и коэффициент предделителя для ПИК'а).
Несложно догадаться, что для АВР без предделителя на 8 интервал счета должен быть уменьшен в 8 раз (а не увеличен в 2.5).
Из этой же формУлы следует, что, если не учитывать погрешность пробразователя L/C->fx, погрешность прибора определяется погрешностью задания To. Именно поэтому метания между 0.4 с и 1 с мне кажутся бессмысленными, и возникают сомнения в декларируемой Вами точности прибора.
Цитата
как я понял вы что-то хотите сказать насчет того зачем я увеличил промежуток времени с 0,4 сек до 1 сек?? если да, то повторятся не буду я уже в нескольких сообщениях описал почему я так сделал. И что в этом плохого? ну увеличил интервал и сделал прямой счет частоты без всяких умножений на 4 как это было бы с задержкой в 0,4 сек.

См. выше. Если осмыслить не удастся, "ну извиняй, боярин" - повторяться я тоже не буду.
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
- - 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 Текстовая версия Сейчас: 20th July 2025 - 19:13
Рейтинг@Mail.ru


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