|
|
  |
LC-метр. Измерить малые частоты. |
|
|
|
May 1 2009, 15:22
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 2 2009, 14:42
|
Участник

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

|
вопрос не в том какже у людей работает, а где ошибка в моем програмном коде или может еще где то
|
|
|
|
|
May 2 2009, 16:07
|
Участник

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

|
сам себе же и отвечу... почему то при увеличении задержки с 0,4 сек до 1 сек данные стали приходить верные. Интересно почему?
|
|
|
|
|
May 2 2009, 21:41
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(John851 @ May 2 2009, 20:07)  сам себе же и отвечу... почему то при увеличении задержки с 0,4 сек до 1 сек данные стали приходить верные. Интересно почему? "- Где у меня ошибка ? - в ДНК !" © Ну, что-то где-то в коде, естественно - таймеру-то все равно, что считать... Однако хочу обратить внимание - эта схема генератора весьма чувствительна к добротности (и к линейности, кстати - это важно !) дросселя, при использовании низкодобротных дросселей (типа всякой компаундированной мелочи) размах переменного напряжения на контуре падает, компаратор начинает звенеть на фронтах. В особо тяжелых случаях эффект где-то с сотни nF и начинает проявляться. ТШ на входе чуть улучшает картину, так что при простом переносе на AVR может быть ухудшение. Ну и конкретно эта программная реализация имеет массу недостатков - например, не учитывает собственную емкость катушек, что уже при десятках mHy. На www.cqham.ru уже который год обсуждается более "продвинутый" вариант - рекомендую ознакомиться. Есть свои тонкости...
|
|
|
|
|
May 3 2009, 13:11
|
Участник

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

|
Цитата(rx3apf @ May 3 2009, 00:41)  "- Где у меня ошибка ? - в ДНК !" попрошу повежливее, я еще только учусь и задаю вопросы здесь чтоб получить корректный ответ, а не надсмешки "профессоров" типа вас. Цитата(rx3apf @ May 3 2009, 00:41)  Однако хочу обратить внимание - эта схема генератора весьма чувствительна к добротности (и к линейности, кстати - это важно !) дросселя Мне известо что это очень важно, поэтому еще раз напишу, что уже написал выше - от генератора исходят ровные прямоугольные импульсы без шумов даже при очень большом растяжении по времени, т.к. использую достаточно добротную катушку (намотана на станке, определенным типом намотки, провод - ПЛШО многожильный). Так же я дополнительно сделал экранирование элементов схемы как сверху, так и снизу платы. На выходе стоит буфер из двух последовательно соединенных 4х входных элементов И-НЕ. Так что к генератору претензий нет (пожалуйста читайте все сообщения темы, чтоб мне по несколько раз одно и то же не печатать). Цитата(rx3apf @ May 3 2009, 00:41)  так что при простом переносе на AVR может быть ухудшение. Ну и конкретно эта программная реализация имеет массу недостатков - например, не учитывает собственную емкость катушек Вы неправы. Прибор получился достаточно точный даже без учета паразитной емкости и индуктивности. Да, я использую переносы и состаной трехбайтный регистр, но другого выхода просто нет. Если взглянуть на схемотехнику счетчика AVR и PIC можно найти много различий. Для этого случая актуально различие, состоящее в том, что в AVR на имульсы приходящие на пин таймера нельзя поставить делитель частоты (только на импульсы от внутреннего генератора), а пиковском МК есть возможность поставить делитель на импульсы с пина. Этим я думаю все объясняется. Самое главное - мой вопрос остался без ответа. Почему при малой задержке на измерение кол-ва импульсов невозможно работать с относительно низкими частотами (типа 60 КГц). А при задержке в 1 сек все насчитывается просто отлично на любой частоте.
|
|
|
|
|
May 4 2009, 17:17
|
Участник

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

|
да это тоже выход, но проблема в другом:
Если включать таймер на 0,4 секунды (как это написано в техн. описании прибора), то наблюдается что то непонятное. Тестовая частота 760 Кгц на счетчике за этот период времени насчитывается без проблем, но стоит подключить конденсатор с нанофарадной емкостью (к примеру 100 нФ), так с МК начинают приходить очень странные данные - всегда заполнен только младший байт и значения в нем колеблются от 0 до 255. я и подумал, что проблема в частоте поступающих импульсов. С увеличением задержки до 1 секунды проблема исчезает. Вопрос: почему так происходит?? вроде же таймеру всеравно сколько времени считать и неважно какой частоты приходят импульсы. Возможно МК с деффектом или счетчик AVR всетаки имеет какие то ограничения.
Буду рад если кто нить даст ответ конкретно по этому вопросу.
|
|
|
|
|
May 4 2009, 20:13
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Судя по reti, с таймером Вы боретесь в прерывании (каком?). Завешивать контроллер на 0.4 с или на 1 с в тупом WAIT, да еще и в прерывании, некошерно. К WAIT_USART это тоже относится. Элементарный расчет: 0.4 с * 750 кГц = 300000, что несколько превышает возможности TMR1. Без переполнения в 16-битовый счетчик за 0.4 с влезет частота ~< 164 кГц. Оригинальный проект не видел, но по контексту могу предположить, что в нем таймер ПИК'а использовался с предделителем на 8. Еще одно мое недоумение: если правильно понял задумку измерёметра, на выходе LC-метра (по схеме) - частота, которую Вы пытаетесь измерить, т.е. подсчитать число периодов за образцовый интервал времени. К чему тогда фривольные упражнения с этим интервалом? Пытаетесь подогнать задачу под ответ? Насчет "Прибор получился достаточно точный..." тоже есть сомнения хотя бы из-за способа формирования интервала времени счета. А задача измерения (такой) частоты весьма примитивна и неоднократно обсуждалась (в основном, применительно к АВР и в разделе "Для начинающих"). Поиск по форуму Вам в помощь.
|
|
|
|
|
May 5 2009, 09:41
|
Участник

Группа: Участник
Сообщений: 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 всетаки имеет какие то ограничения.
|
|
|
|
|
May 5 2009, 11:58
|
    
Группа: Свой
Сообщений: 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 это ксожалению невозможно сделать из-за другой структуры счетчика. Поэтому я и использую составной регистр. Не проблема. Железо АВР позволяет без проблем считать такую частоту. Вам нужно только корректно обрабатывать переполнения таймера или выбрать такой интервал счета, чтобы эти переполнения не приключались. Формула проста как манная каша: N TMR = T o * f x. N TMR_max и f x_max известны. Отсюда T o <= N TMR_max/f x_max (имхо, так выбирался интервал счета и коэффициент предделителя для ПИК'а). Несложно догадаться, что для АВР без предделителя на 8 интервал счета должен быть уменьшен в 8 раз (а не увеличен в 2.5). Из этой же формУлы следует, что, если не учитывать погрешность пробразователя L/C->f x, погрешность прибора определяется погрешностью задания T o. Именно поэтому метания между 0.4 с и 1 с мне кажутся бессмысленными, и возникают сомнения в декларируемой Вами точности прибора. Цитата как я понял вы что-то хотите сказать насчет того зачем я увеличил промежуток времени с 0,4 сек до 1 сек?? если да, то повторятся не буду я уже в нескольких сообщениях описал почему я так сделал. И что в этом плохого? ну увеличил интервал и сделал прямой счет частоты без всяких умножений на 4 как это было бы с задержкой в 0,4 сек. См. выше. Если осмыслить не удастся, "ну извиняй, боярин" - повторяться я тоже не буду.
|
|
|
|
|
May 5 2009, 15:45
|
Участник

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

|
Цитата В смысле "Вся наша жизнь - ...". Не нравится "боретесь"? Подставьте "дружить", "работать", "мучаться" или любой более симпатичный Вам глагол в форме второго лица множественного числа. См. выше. Если осмыслить не удастся, "ну извиняй, боярин" - повторяться я тоже не буду. Вот зачем выпендриваться? Я русский человек и все прекрасно понимаю, но вы употребляете такие сочетания которые не встретишь в нормальном русском языке. К примеру выражение "Вы боретесь в прерывании" мне вообще не понятно, другое дело "работаете с таймером". Во вторых что вы понимаете под выражением "фривольные упражнения с интервалом времени"? Звучит глупо, спросите любого кто прочитает этот набор слов. Это не русский язык, а ваш собственный и я его не понимаю. Говорите на нормальном русском чтоб я понимал суть ваших предложений. НЕНАДО МНЕ СОВЕТОВАТЬ КАК ПОДСЧИТАТЬ ЧАТОТУ ИЛИ НАХОДИТЬ НЕРАЦИОНАЛЬНОСТИ В КОДЕ, ПОТОМУ ЧТО ВСЕ УЖЕ СОБРАНО И НОРМАЛЬНО РАБОТАЕТ. незная задачи которая поставлена передомной вы пытаетесь рассказать что мой код не подойдет если еще будет клавиатура, мышка или еще что то, одним словом того чего нет и не потребуется в моей задаче.ВНИМАНИЕ ВОПРОС !!! Если включать таймер на 0,4 секунды (как это написано в техн. описании прибора), то наблюдается что то непонятное. Тестовая частота 760 Кгц на счетчике за этот период времени насчитывается без проблем, но стоит подключить конденсатор с нанофарадной емкостью (к примеру 100 нФ), так с МК начинают приходить очень странные данные - всегда заполнен только младший байт и значения в нем колеблются от 0 до 255. я и подумал, что проблема в частоте поступающих импульсов. С увеличением задержки до 1 секунды проблема исчезает. Вопрос: почему так происходит?? вроде же таймеру всеравно сколько времени считать и неважно какой частоты приходят импульсы. Возможно МК с деффектом или счетчик AVR всетаки имеет какие то ограничения.Кто знает, пожалуйста ответьте на мой конкретно поставленный вопрос, для тех кто незнает и хочет написать что-то об моем коде, о точности прибора, о правильном подсчете частоты и т.д. есть высказывание "молчание-золото".
|
|
|
|
|
May 5 2009, 17:32
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
[оффтоп] Мил человек, уж, вестимо, не Вам учить меня великому и могучему. Попробуйте хоть со знаками препинания разобраться - их специально придумали, чтобы поток сознания обретал форму, приемлемую для восприятия. И не злоупотребляйте большими черными буквами - от этого они не обретают новый смысл, а читать неудобно. [/оффтоп] А по теме - похоже, Вы и сами все знаете. Успехов в работе. И в борьбе. ЗЫЖ "фривольные упражнения" == "легкомысленные/непристойные упражнения" (см. какой-нить толковый словарь русского языка). По-моему, вполне соответствует. Или Вы решили, что я к "free" добавил "вольный" и родил новое слово?
|
|
|
|
|
May 5 2009, 18:39
|
Участник

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

|
Знаки препинания надоело расставлять, а черными заглавными буквами пишу потому что хочу привлеч внимание на мой вопрос, на который никто не хочет отвечать. По теме этой я уже действительно много изучил, но не все и есть вопрос на который еще никто не ответил (не только на форуме).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|