Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: три частоты на АТмегу 128 с использованием таймеров
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3, 4, 5
=AVR=
Для усугубления - тем же методом, что расписал уважаемый GM, только еще с кучей наворотов - накопление/фильтрация/масштабирование на ходу, дитеринг для сглаживания ступенек и т.д. я многоканально измеряю частоты в своей аппаратуре, которая по миру разошлась сотнями экземпляров. Точность(!) и дискретность измерений - порядка 10Е-9 (0.0001 ГЦ для сигнала 100 КГЦ) при 10-миллисекундном цикле измерений и частоте таймера МК в 100 МГЦ (Silabs C8051F121) или в 5 раз хуже при Ftimer = 20 МГЦ (ATMega88, 644). Опора - TCXO, в последних разработках - GPS. И резервы еще есть smile.gif)
=GM=
Цитата(=AVR= @ Apr 14 2007, 23:45) *
Для усугубления - тем же методом, что расписал уважаемый GM, только еще с кучей наворотов - накопление/фильтрация/масштабирование на ходу, дитеринг для сглаживания ступенек и т.д. я многоканально измеряю частоты в своей аппаратуре, которая по миру разошлась сотнями экземпляров. Точность(!) и дискретность измерений - порядка 10Е-9 (0.0001 ГЦ для сигнала 100 КГЦ) при 10-миллисекундном цикле измерений и частоте таймера МК в 100 МГЦ (Silabs C8051F121) или в 5 раз хуже при Ftimer = 20 МГЦ (ATMega88, 644). Опора - TCXO, в последних разработках - GPS. И резервы еще есть smile.gif)

Что такое в мире творится, наверное медведь в лесу сдох(:-) - АВР на электрониксе зарегился!
Расскажите про дитеринг уважаемому автору темы, а то он (или она) куда-то закатился, кочерёжкой не достанешь(:-).
=GM=
Цитата(=AVR= @ Apr 16 2007, 00:10) *
Зарегился, кстати, исключительно благодаря позавчерашней ссылке rezident'а в Телесисах на этот thread - прочитал и счел своим долгом укрепить Вашу линию упоминанием успешности своего аналогичного решения, а то Вас уже едва ли не еретиком-одиночкой без мотора готовы были назначить smile.gif А про дитеринг аффтару с удовольствием расскажу, коли подберется к необходимости использования такового, но чую, не скоро это будет smile.gif

Ну, наверное, и снежный человек - йети, тоже сдох, и мать его ...(:-). Люди! АВР укрепляет мою линию и меня от предания еретичеству! Чудны дела твои, господи! А мне что теперь, st256-го поддерживать с его мухобойной статьёй(:-)?

Вообще-то, я и сам могу отбиться, не маленький ужо. Да и главный оппонент, defunct, слил, не выдержал что называется напряжёнки(:-), и Bodja74 куда-то пропал.

Тем не менее, за поддержку спасибо.
Snaky
Натолкнулся сегодня на эту ветку и вспомнилось, что в свое время, когда тоже задавался задачей измерения частоты сигнала (также, кстати на AVR) попалась мне книжка
Касаткин А.С. Обработка сигналов частотных датчиков. – М.: Энергия, 1966. – 120 с.
В книге как раз расписываются различные способы и алгоритмы измерения частоты/периода цифровых сигналов (рассматривается 14 или 15 способов (!), насколько помню, в том числе и те два которые сравнивали здесь). Там приводятся графики достижимых точностей и погрешностей измерения рассмотренных способов.
Единственный недостаток - книга старая и схемы приведены на дискретной логике, но при желании можно перевести на уровень программ для МК или ПЛИС - может даже получится что-то новое из хорошо забытого старого wink.gif
Dog Pawlowa
Справедливости ради стоит отметить, что диапазон измеряемых частот получается ограниченным сверху при сравнении с методом временных ворот, если только не использовать для подсчета количества импульсов измеряемой частоты отдельный таймер, а при увеличении количества измеряемых сигналов таймеров может и не хватить для каждого сигнала smile.gif
Уточню, а то запинаете wink.gif - но при увеличении входной частоты погрешность метода временных ворот улучшается, так что проблема точности становится не особенно актуальной.
Rst7
Я, господа, честно говоря не понимаю смысла ломания копий. В какой нормальной разработке можно применять такие измерения? Я о том, что измерение производится один(!) раз, совершенно нет подавления возможных помех и т.д. В рамках радиолюбительской поделки - еще ничего, но скорее всего такие точности не нужны, а при проффесиональном подходе - это все не годится.
mse
Цитата(Rst7 @ Apr 16 2007, 09:36) *
Я, господа, честно говоря не понимаю смысла ломания копий. В какой нормальной разработке можно применять такие измерения? Я о том, что измерение производится один(!) раз, совершенно нет подавления возможных помех и т.д. В рамках радиолюбительской поделки - еще ничего, но скорее всего такие точности не нужны, а при проффесиональном подходе - это все не годится.

Господи! ;О) Ну произведите это измерение 10-20...100 раз, статистицки обработайте да выведите куды надоть. Но измерение-то надо провести! Хотяб один раз. ;О) Нам, радиолюбителям - подельщикам, больше и не надо.
defunct
Цитата(=GM= @ Apr 16 2007, 02:30) *
defunct, слил, не выдержал что называется напряжёнки(:-), и Bodja74 куда-то пропал.

Когда вы наконец-то удосужились объяснить метод, то смысла оппонировать больше не стало. ;>
Теперь каждый сможет разобраться на каком чипе его можно применить.
Автор ветки куда-то пропал, видать сам уже все померял.

А "слил", потому что рассуждать об измерении запредельных частот сейчас некогда.. Будет время сделаю, проверю, и напишу о результате. А пока это все треп.
=GM=
Цитата(Dog Pawlowa @ Apr 16 2007, 04:20) *
Справедливости ради стоит отметить, что диапазон измеряемых частот получается ограниченным сверху при сравнении с методом временных ворот, если только не использовать для подсчета количества импульсов измеряемой частоты отдельный таймер, а при увеличении количества измеряемых сигналов таймеров может и не хватить для каждого сигнала smile.gif
Уточню, а то запинаете wink.gif - но при увеличении входной частоты погрешность метода временных ворот улучшается, так что проблема точности становится не особенно актуальной.

Ну, если говорить об измерении частоты на голой атмеге128, то как для "метода захвата", так и для "метода ворот" имеется одно ФУНДАМЕНТАЛЬНОЕ ограничение - частота входного сигнала не может быть больше половины тактовой частоты процессора.

Но даже для пограничной входной частоты 8 МГц погрешность первого метода (±0.5 Гц) в ДВА раза выше погрешности второго метода (±1 Гц) и может быть легко увеличена в десятки раз, чего не скажешь о втором методе.

На практике это означает, например, что с помощью делителя на 10 вы можете мерять первым методом частоту 80 МГц с той же точностью, что и частоту 8 МГц вторым методом. Так что овчинка стоит выделки и проблема точности всё ещё актуальна.

Что касается отдельного таймера, то вы невнимательно читали мои посты, там как раз предлагается использовать отдельный таймер (timer/counter0) для подсчёта количества импульсов измеряемой частоты.

Цитата(defunct @ Apr 16 2007, 09:20) *
Когда вы наконец-то удосужились объяснить метод, то смысла оппонировать больше не стало. ;>
Теперь каждый сможет разобраться на каком чипе его можно применить.

Ну если вы поняли методу, значит, вы можете забрать свои слова обратно.

Цитата(defunct @ Apr 16 2007, 09:20) *
А "слил", потому что рассуждать об измерении запредельных частот сейчас некогда.. Будет время сделаю, проверю, и напишу о результате. А пока это все треп.

Ну вот, опять трёп! Вы уверены, что вы правильно применяете это слово(:-)?
Какие такие запредельные частоты? То есть 8 МГц для вас запредельно? А что ж вы раньше говорили, что измерить просто и никаких сложностей вы там не видите?
defunct
Цитата(=GM= @ Apr 16 2007, 12:35) *
Какие такие запредельные частоты? То есть 8 МГц для вас запредельно? А что ж вы раньше говорили, что измерить просто и никаких сложностей вы там не видите?

Я хочу попробовать померять частоты до ~50Mhz на AVR'кe без внешних компонентов.
Dog Pawlowa
Цитата(=GM= @ Apr 16 2007, 13:35) *
Что касается отдельного таймера, то вы невнимательно читали мои посты, там как раз предлагается использовать отдельный таймер (timer/counter0) для подсчёта количества импульсов измеряемой частоты.

GM, дорогой, дискуссия была напряженной, но пора уже расслабиться. Я прочитал Ваши реплики не более невнимательно, чем Вы smile.gif И я еще прочел автора темы - он хотел три частоты измерять. Рано или поздно таймеры могут закончиться. Успехов wink.gif
=GM=
Цитата(Dog Pawlowa @ Apr 16 2007, 13:15) *
GM, дорогой, дискуссия была напряженной, но пора уже расслабиться. Я прочитал Ваши реплики не более невнимательно, чем Вы smile.gif И я еще прочел автора темы - он хотел три частоты измерять. Рано или поздно таймеры могут закончиться. Успехов wink.gif

Уверен, они кончатся раньше(:-). А я, в основном, совершенно спокоен и расслаблен...до пятницы. На работе вынашиваю коварные планы, которые повергнут в шок братьев наших бледнолицых(:-).

Вообще притомился, собираюсь в отпуск...
sKWO
Цитата(defunct @ Apr 7 2007, 05:35) *
m168, см comment #2

Во первых. Господа, Capture Unit для таких частот не пригодится. Capture Unit решает обратную задачу - измерение временных интервалов и чем меньше частота тем лучше. На частоте же 170Khz это будет всего ~100 тактов на период, точность будет мягко сказать хреновая при значительных затратах процессорного времени.

А теперь к самой задаче:
таймер T0 использовать в режиме External Clock source с прескейлером 1.
таймер T2 - в asyncronous режиме (тоже External clock) с прескейлером 1.
T1 16-ти разрядный оставить для отмерки секундных интервалов (и возможно каких-то других нужд)
к входу T0 подрубить сигнал 90khz
к входу T2 - 170khz
По прерыванию OVF увеличивать (на 256) значения 32-х разрядных счетчиков.
50khz мерять с помощью Int0 - в обработчике прерывания инкрементировать счетчик.

По прерыванию OC T1 (каждую секунду), прибавлять к счетчикам текущее значение таймеров T0, T2, сбрасывать таймеры T0, T2 и выводить рез-тат.

Точность будет +-1 Hz за секунду для всех 3х частот, плюс останется куча процессорного времени. Тобиш и частоту тактирования можно брать раза в два меньше.

PS: Кварц 22.1184 - фтопку, оверклок - неправильная затея.




От автора темы defunct
На 22-х мегагерцах атмеги 88 работают уже более полтора года
без срывов и подвисаний и сбоев tongue.gif
АТмега168 ето оно же 88 талько чуть пузатее по памяти и всё



Цитата(defunct @ Apr 16 2007, 14:45) *
Я хочу попробовать померять частоты до ~50Mhz на AVR'кe без внешних компонентов.


Как для "метода захвата", так и для "метода ворот" имеется одно ФУНДАМЕНТАЛЬНОЕ ограничение - частота входного сигнала не может быть больше половины тактовой частоты процессора.
Так заметил GM и я с ним согласен.
Кстати, defunct, если видели АВРки с тактовой 100МГц то подскажите!!!
А в общем спасибо за ваши ответы.
Вы прочитали вопрос и ответили точно по самой сути.

А "слил", потому что рассуждать об измерении запредельных частот сейчас некогда

Почитать ваши ответы очень интересно и полезно начинающим.
А Ваш спор с GM весьма некоректный как с его стороны так и с Вашей.
Он (спор) больше напоминал базар в тюряге двух радиолюбителей подрывников. (Не сочтите за грубость). (Слово за слово, строка за строку и понесло....). Пжлста a14.gif друг-друга.
Я Вас уважаю уже прочитав лиш ответы как знатока АВР, но всё же, моё мнение, GM и резидент прав
именно Capture Unit поможет добиться непревзойдённой точности.
"метод ворот" чудесен для высоких частот (неоспоримо).
И ёщё раз, я ВАМ ВСЕМ благодарен за сокращение времени поиска теории.


Цитата(Dog Pawlowa @ Apr 16 2007, 08:20) *
Справедливости ради стоит отметить, что диапазон измеряемых частот получается ограниченным сверху при сравнении с методом временных ворот, если только не использовать для подсчета количества импульсов измеряемой частоты отдельный таймер, а при увеличении количества измеряемых сигналов таймеров может и не хватить для каждого сигнала smile.gif
Уточню, а то запинаете wink.gif - но при увеличении входной частоты погрешность метода временных ворот улучшается, так что проблема точности становится не особенно актуальной.

С Вами я согласен полностью.
Тут всё понятно. Спасиб! a14.gif
defunct
Цитата(sKWO @ Apr 16 2007, 19:28) *
Как для "метода захвата", так и для "метода ворот" имеется одно ФУНДАМЕНТАЛЬНОЕ ограничение - частота входного сигнала не может быть больше половины тактовой частоты процессора.
Так заметил GM и я с ним согласен.

это ограничение действует на всю синхронную периферию. Но для асинхронного таймера поидее не важна частота процессора, собсно я и хочу испытать его возможности.
sKWO
Цитата(=GM= @ Apr 10 2007, 12:42) *
Картинки хорошие, но неполные. Внизу под меандром надо нарисовать много-много импульсов опорной частоты, это будет наше время, заполнение, как угодно назовите.

Вот вы написали "Оно сработало" в конце периода Т1 (ваши обозначения на рис.1). Что это означает? Это означает, что содержимое таймера1 от "мелкого" опорного меандра (который вы не нарисовали) переписалось в регистр ICR1, его надо запомнить, а прерывание запретить (в принципе, можно не запрещать, просто не обращать внимания, если время и вычислительная обстановка позволяет, важно, что нужно только первое, которое даёт время начала вашего окна).

Отмечу, что таймер1 продолжает работать, отсчитывает длительность окна. В начале времени Т2 на вашем рисунке надо разрешить прерывание опять, всё так, дождаться когда оно сработает (конец периода Т2 на вашем рисунке), и запомнить время, сохранённое в ICR1.

Затем нужно вычислить разность этих времен. Что нам даст эта разность? Эта разность N нам даст время (в тиках таймера1) между первым фронтом входной частоты и последним фронтом. Причём это время будет не приблизительным, а ТОЧНЫМ, с точностью ±1 такт. В то же самое время, таймер0 подсчитает количество импульсов входной частоты М. Теперь вы имеете на руках М, N и Fo и по формуле можете посчитать Fx.

Скажу ещё раз, для ясности. Сигнал измеряемой частоты надо подать на вход ICP1 и вход timer0/counter0, который работает как счётчик, в то же время timer1 работает как таймер, считает импульсы опорной частоты.

Спасиб за классное обяснение, учитывая частоты Ваш метод меня устроил
и для моего случая он отимален.
И ещё, мне кажется что Вы немножко спешите Всех критиковать за невнимательность
а сами тоже невнимательны.
Я извинился за неправильную постановку вопроса в названии контроллера,
defunct , правильно это заметил! это мой ответ резиденту в самом начале!!

m168, см comment #2
Что за comment #2? На заголовок темы посмотрите.

Да и приятно провести время в отпуске!!!




Цитата(defunct @ Apr 16 2007, 20:39) *
это ограничение действует на всю синхронную периферию. Но для асинхронного таймера поидее не важна частота процессора, собсно я и хочу испытать его возможности.

Вприцыпе, идея интересна потому только что я не знаю как работать с асинхронным таймером
и его возможностями. С внешним счётчиком видел где-то схему частотомера на 2313том до 40МГц.
Желаю удачи!


Цитата(defunct @ Apr 16 2007, 20:39) *
это ограничение действует на всю синхронную периферию. Но для асинхронного таймера поидее не важна частота процессора, собсно я и хочу испытать его возможности.

Взял описсание злостной АТмеги 168 таймер 2 и выделил два момента:
  • The CPU main clock frequency must be more than four times the Oscillator

During asynchronous operation, the synchronization of the Interrupt Flags for the asynchronous
timer takes 3 processor cycles plus one timer cycle. The timer is therefore
advanced by at least one before the processor can read the timer value causing the setting
of the Interrupt Flag. The Output Compare pin is changed on the timer clock and is
not synchronized to the processor clock.
Вашу идею не совсем понимаю.
=GM=
То sKWO

Не знаю, есть ли АВРки с тактом 100 Мгц, а вот с тактом 48 МГц пожалуйста - АТ76С712 и 713.

Успехов в трудном деле измерения частоты. И напоследок: не давайте далеко заплывать плавающей запятой(:-).
Яrik
То =GM=

Очень заинтересовал ваш метод измерения частоты.
Интересует следующие. Вы писали, что таймер1 считает такты МК, собственно вопрос: как лучше опрабатывать переполнение по пррыванию или следить программно.
singlskv
Цитата(Яrik @ Aug 19 2007, 22:04) *
То =GM=

Очень заинтересовал ваш метод измерения частоты.
Интересует следующие. Вы писали, что таймер1 считает такты МК, собственно вопрос: как лучше опрабатывать переполнение по пррыванию или следить программно.

Помнитца где-то около года назад мы уже обсуждали эту тему,
кажись тогда она называлась типа: ловля импульсов с 1мкс точностью на кварце МГц. smile.gif
Название конечно переврал, но поиском должно искаться.
=GM=
Цитата(Яrik @ Aug 19 2007, 18:04) *
То =GM=
Очень заинтересовал ваш метод измерения частоты.
Интересует следующее. Вы писали, что таймер1 считает такты МК, собственно вопрос: как лучше обрабатывать переполнение по прерыванию или следить программно.

Зависит от задачи, но особой разницы нет, без прерываний проц будет тупо ждать наступления переполнения, следовательно, ничего другого сделать не сможет. Хотя, по своему опыту скажу, что и здесь можно вывернуться, у меня было несколько реализаций метода захвата без прерываний ( т.к. были жесткие требования по джиттеру), частота мерялась от 0.5 МГц до 1.5 МГц, так я и датчик температуры по одному проводу опрашивал и много ещё чего там делалось.

По прерываниям, ваш проц в фоне может вычислить частоту, по данным, полученным в предыдущем цикле.
Яrik
Спасибо. Всь сыр бор вот в чем, как Вы могли уже заметить я создал тему связаную с переполнением таймера0, поэтому и спрашивал как лучше.
Яrik
ТО GM
Для работы частотомера по Вашому методу контроллер обязательно должен иметь два таймера с Capture Unit? Я вот хотел сделать на ATmega8L, но что то не то, точность оставляет желать лучшего.
Вот код, подскажите что не так. Спасибо.
Код
#include <mega8.h>

static float Fx;
unsigned long int N1, N;
unsigned int M1, M;
unsigned int Perepol_Timer0=0, Perepol_Timer1=0;
unsigned int count_T1, count_T0;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
Perepol_Timer0++;
}

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void){
Perepol_Timer1++;
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void){
TIMSK&=0xDF;
count_T0=TCNT0;
count_T1=ICR1;
}


void main(void)
{
// Input/Output Ports initialization

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: T0 pin Rising Edge
TCCR0=0x07;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Rising Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: On
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x41;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")
while (1) {
Perepol_Timer1=0;
N1=Perepol_Timer1*65535+count_T1;
M1=Perepol_Timer0*255+count_T0;
while (Perepol_Timer1<12){
};
TIMSK|=0x20;
N=((unsigned long int)(Perepol_Timer1)*65535+(unsigned int)(count_T1))-N1;
M=(Perepol_Timer0*255+count_T0)-M1;
Fx=(float)8000000.0*(float)M/(float)N;
};
TIMSK|=0x20;
}
=GM=
Цитата(Яrik @ Aug 21 2007, 17:56) *
То GM Для работы частотомера по Вашему методу контроллер обязательно должен иметь два таймера с Capture Unit? Я вот хотел сделать на ATmega8L, но что-то не то, точность оставляет желать лучшего

Достаточно одного.
Цитата(Яrik @ Aug 21 2007, 17:56) *
Вот код, подскажите что не так. Спасибо

Во-первых, счётчики переполнений надо умножать на 65536 и 256 соответственно, а не так как у вас.
Во-вторых, у вас прерывание по захвату сработает на второй перепад, скажем частота 1 МГц, значит через 1 мкс, а вам надо ждать примерно 1 секунду. Кстати, частота вычислится, но точность будет никакая, поскольку определение частоты будет происходить по одному периоду(:-(.

Примерный алгоритм бесконечного цикла может быть следующим.
1) ждём 1с,
2) разрешили захват,
3) дождались захвата,
4) считали N2 и M2,
5) вычислили Fx и выдали на индикатор,
6) передвинули метку времени: N1=N2, M1=M2,
7) вернулись к пункту 1.

Код примерно такой.
Код
Perepol_Timer1=0;  //внимание, первое значение частоты может быть неточным
N1=0;M1=0;
while (1)
{
while ((currenTime-oldTime)<OneSec)    //п.1-условно, можно сделать по-другому
{
}
TIMSK|=0x20;                           //п.2-разрешили захват
while ((TIMSK&0x20)==0x20)             //п.3-условно, можно сделать по-другому
N2=((unsigned long int)(Perepol_Timer1))*65536+count_T1; //п.4-текущее время
M2=Perepol_Timer0*256+count_T0;
N=N2-N1;                               //п.5-вычисление частоты
M=M2-M1;
Fx=(float)8000000.0*(float)M/(float)N; //можно выдать во внешний мир
N1=N2;                                 //п.6-новое значение времени стало старым
M1=M2;
}                                     // <---while цикл---

В-третьих, я удивлён, как оказывается легко "метод захвата" реализовать на си(:-). Well done!
rezident
Умножение на 256 и 65536 имеет смысл заменить сдвигами. И перед делением стоит проверить значение N на нуль, чтобы избежать исключения (ошибка деления на нуль).
=GM=
Цитата(rezident @ Aug 21 2007, 23:55) *
Умножение на 256 и 65536 имеет смысл заменить сдвигами. И перед делением стоит проверить значение N на нуль, чтобы избежать исключения (ошибка деления на нуль).
Насчёт деления всё верно, проверять надо. А на асме и сдвигать не надо, просто положить значение в соответствующую ячейку или регистр. Вот интересно, какую максимальную частоту сможет измерить сишная программа?
Яrik
ТО GM
БОООООльшое спасибо. smile.gif, за ответ. Буду пробывать. a14.gif
=GM=
Цитата(Яrik @ Aug 22 2007, 14:23) *
ТО GM
БОООООльшое спасибо. smile.gif, за ответ. Буду пробовать. a14.gif

На здоровье.

ДолОжите нам(:-), какую максимальную частоту удалось измерить.
Яrik
Цитата
currenTime-oldTime)<OneSec

Это переменные?

Цитата(=GM= @ Aug 22 2007, 18:43) *
На здоровье.

ДолОжите нам(:-), какую максимальную частоту удалось измерить.

Завтра, сегодня нет времени.
=GM=
Цитата(Яrik @ Aug 22 2007, 15:52) *
Это переменные?

Я ж написал там в комментарии: "пункт 1-условно, можно сделать по-другому".
Ну поставьте для начала тупой цикл на ОДНУ секунду, ИЛИ делайте другую задачу в течение одной секунды (примерно, точность здесь не важна) ИЛИ опрашивайте флаг таймера, взведённого на 1 сек ИЛИ сравнивайте число в N1 с текущим содержимым таймера 1, всё зависит от разработчика программы, т.е. от вас. Главное, вы должны выдержать период измерения.
Яrik
Цитата(=GM= @ Aug 22 2007, 18:43) *
На здоровье.

ДолОжите нам(:-), какую максимальную частоту удалось измерить.


По данному коду в симуляторе VMlab удалось померять частоту 6,25МГц (выше не пробывал). Но меня терзают самнения может я что то не так делаю, я где то на форуме читал, что максимальная частота измерения для АВР пол тактовой, а то и меньше.

Код
#include <mega8.h>
#include <delay.h>

static float Fx;
unsigned long int N1, N2, N;
unsigned long int M1, M2, M;
unsigned int Perepol_Timer0=0, Perepol_Timer1=0;
unsigned int count_T1, count_T0;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
Perepol_Timer0++;

}

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void){
Perepol_Timer1++;
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void){
TIMSK&=0xDF;
count_T0=TCNT0;
count_T1=ICR1;

}


void main(void)
{
PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;


PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
TCCR0=0x07;
TCNT0=0x00;

// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x41;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;

// Analog Comparator initialization
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

Perepol_Timer1=0;
N1=0;M1=0;
while (1){
delay_ms(1000);
TIMSK|=0x20;                        
while ((TIMSK&0x20)==0x20){}            
N2=(unsigned long int)(Perepol_Timer1)*65536+count_T1;
M2=(unsigned long int)Perepol_Timer0*256+count_T0;
N=N2-N1;                              
M=M2-M1;
Fx=(float)8000000.0*(float)M/(float)N;
N1=N2;                                
M1=M2;
} }
=GM=
Цитата(Яrik @ Aug 23 2007, 14:18) *
По данному коду в симуляторе VMlab удалось померять частоту 6,25МГц (выше не пробывал). Но меня терзают самнения может я что то не так делаю, я где то на форуме читал, что максимальная частота измерения для АВР полтактовой, а то и меньше.

Сомнения вас терзают правильно, для тактовой частоты 8 МГц, вы выше 4 МГц не введёте. Вернее, ввести-то можно всё, не будет адекватности, вот в чём беда.
Яrik
Тоесть программа работает правильно, это симулятор идиализирует возможности МК и реальные измерения частоты 6 МГц возможны но не будут постоянны.
Я правильно понял?

То GM.
Вы не могли бы обяснить все что необходимо для реализации цикла приведенного Вами (с его помощью можно менять время измерения):
Код
while ((currenTime-oldTime)<OneSec)    //п.1-условно, можно сделать по-другому
{
}

Что считает время currenTime, oldTime?

Спасибо.
=GM=
Цитата(Яrik @ Aug 23 2007, 16:43) *
То есть программа работает правильно, это симулятор идиализирует возможности МК и реальные измерения частоты 6 МГц возможны но не будут постоянны. Я правильно понял?

Неправильно. Для 8-МГц аврки выше 4 МГц вы принципиально ничего не померяете.
Цитата(Яrik @ Aug 23 2007, 16:43) *
То GM.
Вы не могли бы обяснить все что необходимо для реализации цикла приведенного Вами (с его помощью можно менять время измерения):
Код
while ((currenTime-oldTime)<OneSec)    //п.1-условно, можно сделать по-другому
{
}

Что считает время currenTime, oldTime?

Ну ещё раз, вот вам варианты, на выбор:

1) Поставьте тупой цикл на Тизм (например, Тизм={0.1, 1.0, 10.0}) в виде программной задержки - в цикле вызываете подпрограмму задержки на 1 мс. Меняя счётчик цикла, будете менять время счёта.

2) Вызовите некую подпрограмму с подходящим временем работы Тизм. После её окончания можно приступать к измерению частоты.

3) Таймер1 у вас фактически является счетчиком некоего времени, поэтому вычисляйте
Т=(unsigned long int)(Perepol_Timer1)*65536+count_T1 - N1, до тех пор пока оно не станет равным заданному Тизм.

4) Заведите отдельный таймер, если он есть, запустите его, пусть он взводит флаг через Тизм, в фоне опрашивайте флаг таймера, как только он взведён - наступило время измерения.
Tomade
Знатоки, подскажите, пожалуйста, как реализовать частотомер по методу GM на ATMega64L. По описанию, у этого микроконтроллера нет входа для внешнего сигнала T0. Может, можно вместо таймера Т0 использовать таймер Т2?
=GM=
Не только можно, но и нужно. Как сделать - почитайте весь топик повнимательнее, этого достаточно.

На этом проце вообще можно сделать частотомер до 4 МГц (то есть до Fclk/2) с программой на си (мечта Яrik'а) с непревзойдённой точностью, скажем, до ±0,005 Гц на одном измерении, а с обработкой и того меньше.
defunct
Цитата(=GM= @ Jul 21 2008, 14:24) *
На этом проце вообще можно сделать частотомер до 4 МГц (то есть до Fclk/2) с программой на си (мечта Яrik'а) с непревзойдённой точностью, скажем, до ±0,005 Гц на одном измерении, а с обработкой и того меньше.

Только не надо про ±0,005 Гц говорить.
Не будет на частотах 4Mhz такой точности. Подставьте числа в ваши же формулы. Fo = 8Mhz, Fx=4Mhz.
=GM=
Цитата(defunct @ Jul 21 2008, 11:59) *
Только не надо про ±0,005 Гц говорить.
Не будет на частотах 4Mhz такой точности. Подставьте числа в ваши же формулы. Fo = 8Mhz, Fx=4Mhz.

Ну подставьте сами. А в качестве интервала измерения возьмите 100 секунд. И заметьте, это оценка предельно допустимой ошибки, реальная ошибка будет всегда меньше.
defunct
Цитата(=GM= @ Jul 21 2008, 16:31) *
А в качестве интервала измерения возьмите 100 секунд.

Прибор с абсолютной точностью при бесконечном интервале измерения? smile.gif

Цитата
скажем, до ±0,005 Гц на одном измерении

и что ради ±0,005 Гц на 4Mhz, будем тормозить 100сек и на более низких частотах?
Тогда нет смысла извращаться с захватом. Метод "ворот" проще и даст те же ±0,005 Гц на 100 секундном интервале (разбив его на 100 интервалов с последующим усреднением).

Цитата(=GM= @ Jul 21 2008, 16:31) *
И заметьте, это оценка предельно допустимой ошибки, реальная ошибка будет всегда меньше.

Заметил. Само-собой.
=GM=
defunct:Прибор с абсолютной точностью при бесконечном интервале измерения?

Ну, 100с явно не бесконечный интервал. Отвлекусь. Когда-то работал в пейджинговой компании, у меня было 12 стоваттных передатчиков, работающих синхронно. Пользовался похожим портативным прибором, сделанным на пике кстати, который давал ДЕСЯТЬ значащих цифр. Период измерения составлял 1с, 10с и 100с. Да, неудобно было ждать результата почти 2 минуты, но это же разовая операция. Не знаю другого доступного способа померить частоту в полевых условиях с такой точностью, находясь на радиорелейной башне на высоте 120 м от земли. (Потом, когда всё было настроено, можно было мерять частоту и корректировать дистанционно из единого центра)

defunct: и что ради ±0,005 Гц на 4MГц, будем тормозить 100сек и на более низких частотах?

Проще написать программу, которая автоматом решает, что делать в конкретном случае. Относительная погрешность составляет ±1,25Е-9, вам что, всегда нужна предельная погрешность? Кстати, покажите, какую точность вы получите методом ворот, измеряя 1 кГц?

defunct:Тогда нет смысла извращаться с захватом. Метод "ворот" проще и даст те же ±0,005 Гц на 100 секундном интервале (разбив его на 100 интервалов с последующим усреднением).

С усреднением метод захвата даст тот же результат, что и метод ворот, но на секундном интервале, а не на 100с.
defunct
Цитата(=GM= @ Jul 21 2008, 17:56) *
Проще написать программу, которая автоматом решает, что делать в конкретном случае

Ок принимается.

Цитата
Кстати, покажите, какую точность вы получите методом ворот, измеряя 1 кГц?

Все те же ±0.5Гц на секундном интервале.
Здесь бесспорно "захвать" выиграет.

Цитата
С усреднением метод захвата даст тот же результат, что и метод ворот, но на секундном интервале, а не на 100с.

Обоснуйте. Fo = 8Mhz, Fx = 4Mhz.
=GM=
defunct: Все те же ±0.5Гц на секундном интервале. Здесь бесспорно "захвать" выиграет.

Выиграет естественно, но как! С непревзойдённой точностью: ±0.0000625 Гц. Может она и не нужна на таких частотах, но сама получается и на "голой" аврке. А в методе ворот, вообще-то будет ±1 Гц, а не ±0.5Гц, как вы считаете, не пойму?

defunct: Обоснуйте. Fo = 8Mhz, Fx = 4Mhz.

Моим методом (ну не совсем моим, он известен давно, просто я его приспособил к периферии аврки, в этом смысле он мой) за 1 с интервал вполне реально сделать 1000 НЕЗАВИСИМЫХ измерений, потом обработать результат, вот и всё обоснование.
defunct
Цитата(=GM= @ Jul 21 2008, 19:31) *
defunct: Обоснуйте. Fo = 8Mhz, Fx = 4Mhz.
Моим методом (ну не совсем моим, он известен давно, просто я его приспособил к периферии аврки, в этом смысле он мой) за 1 с интервал вполне реально сделать 1000 НЕЗАВИСИМЫХ измерений, потом обработать результат, вот и всё обоснование.

допустим Fx не 4Mhz, а 3.98Mhz хотя это не суть важно, ну и как эти 1000 независимых измерений в сумме выйдут на точность ±0.005?

Ведь чтобы выйти на такую точность нужно чтобы каждое отдельно взятое измерение обладало точностью не ниже |0.005| * 1000,

а у вас точность одного измерения на интервале 1с = |0.25| если я не ошибаюсь (Fx/Fo = 0.5). меньше интервал ниже точность. i.e. если интервал равен двум периодам Fo - то точности нет вообще, можно лишь грубо оценить есть сигнал или нет.
Peeoner
Вот я наваял тут вобщем прогу по вашему методу,осталось только все слепить в кучю.
Я как бы уже тему открывал,но раз уж тут есть тема по конкретному методу то спрошу тут.
Если у меня период измерения будет 0.1с ,какую получю погрешность? И если период измерения будет не целым числом ,ну скажем 0.14-0.095 сильно это повлияет на точность?Тактовая частота АВРки 10Мгц,есть ли смысл подымать до 16?
Есть ли смысл использовать 10 разрядов? Или 6 в самый раз?
=GM=
Цитата(defunct @ Jul 21 2008, 17:40) *
допустим Fx не 4Mhz, а 3.98Mhz хотя это не суть важно

Допустим, теоретически 4 МГц РОВНО (Fclk/2), хотя это и не суть важно.

Цитата(defunct @ Jul 21 2008, 17:40) *
ну и как эти 1000 независимых измерений в сумме выйдут на точность ±0.005? Ведь чтобы выйти на такую точность нужно чтобы каждое отдельно взятое измерение обладало точностью не ниже |0.005| * 1000, а у вас точность одного измерения на интервале 1с = |0.25| если я не ошибаюсь (Fx/Fo = 0.5)


Ошибаетесь, defunct, как всегда, впрочем(:-). Точность одного измерения на секундном интервале ±0.5 Гц, что вы всё время перевираете?

Давайте, я вас совсем добью, и скажу, что за секунду сделаю 10000 НЕЗАВИСИМЫХ измерений, да что там 10 тыщ, давайте сделаем 50 тысяч измерений в секунду. Какая будет суммарная погрешность такого количества измерений по сравнению с погрешностью отдельного измерения, не подскажете?
defunct
Цитата(=GM= @ Jul 21 2008, 23:16) *
Ошибаетесь, defunct, как всегда, впрочем(:-). Точность одного измерения на секундном интервале ±0.5 Гц, что вы всё время перевираете?

скорее делаю комплимент вашему методу. ибо раньше в ветке вы заявляли о ±0.5 Гц в методе ворот.
В захвате же где Fo = 2Fx, вы обещали дать точность выше как раз за счет измерения периодов Fo.
Читайте внимательней ;>


Цитата
Давайте, я вас совсем добью, и скажу, что за секунду сделаю 10000 НЕЗАВИСИМЫХ измерений, да что там 10 тыщ, давайте сделаем 50 тысяч измерений в секунду. Какая будет суммарная погрешность такого количества измерений по сравнению с погрешностью отдельного измерения, не подскажете?

Добивать меня бесполезно и так defunct ;>
Просто расскажите, что вы подразумеваете под НЕЗАВИСИМЫМ измерением, и какова точность отдельно взятого независимого измерения.

И еще небольшой вопросик cool.gif
Подтверждаете ли вы что в методе захвата точность зависит соотношения измеряемой частоты к опорной Fx/Fo?
=GM=
Цитата(defunct @ Jul 21 2008, 19:56) *
скорее делаю комплимент вашему методу. ибо раньше в ветке вы заявляли о ±0.5 Гц в методе ворот. В захвате же где Fo = 2Fx, вы обещали дать точность выше как раз за счет измерения периодов Fo. Читайте внимательней

Это гдей-то я такое говорил? В пределе максимальная погрешность для метода захвата в два раза лучше, чем для метода ворот, это я говорил, помню. А именно, ±0.5 Гц в методе захвата супротив ±1.0 Гц в методе ворот для нашего конкретного случая Fo=8 MГц, Fx=4 MГц.

Цитата(defunct @ Jul 21 2008, 19:56) *
Просто расскажите, что вы подразумеваете под НЕЗАВИСИМЫМ измерением, и какова точность отдельно взятого независимого измерения

Давайте, для разнообразия вы мне расскажете, что такое независимое измерение, а я, так и быть, побуду "нулём в сиянии", это ведь ваши слова? Вот, кстати, нашёл отличную книжку Дворяшина Б.В. по методам радиотехнических измерений, даже две, всем рекомендую. Молодость вспомнил, ведь Дворяшин читал нам курс лекций по измерениям и лабы вёл...

А погрешность отдельно взятого независимого измерения так и будет ±0.5 Гц, ничего не могу поделать. Ну и какая будет погрешность 1000 независимых измерений в таком случае?

Цитата(defunct @ Jul 21 2008, 19:56) *
И еще небольшой вопросик. Подтверждаете ли вы что в методе захвата точность зависит соотношения измеряемой частоты к опорной Fx/Fo?

Абсолютная погрешность, естественно, зависит от соотношения частот, а вот относительная - не зависит. Сказанное справедливо как для метода захвата, так и для метода ворот. Почитайте книжки Дворяшина, там такая теория наведена, ой-ё-ёй, мало не покажется...
defunct
Цитата(=GM= @ Jul 22 2008, 00:25) *
Это гдей-то я такое говорил? В пределе максимальная погрешность для метода захвата в два раза лучше, чем для метода ворот, это я говорил, помню. А именно, ±0.5 Гц в методе захвата супротив ±1.0 Гц в методе ворот для нашего конкретного случая Fo=8 MГц, Fx=4 MГц.

Сорри запамятовал, давно эту тему не перечитывал.
Хорошо пусть |0.5|, и |1|.

Цитата
Давайте, для разнообразия вы мне расскажете, что такое независимое измерение, а я, так и быть, побуду "нулём в сиянии", это ведь ваши слова? Вот, кстати, нашёл отличную книжку Дворяшина Б.В. по методам радиотехнических измерений, даже две, всем рекомендую. Молодость вспомнил, ведь Дворяшин читал нам курс лекций по измерениям и лабы вёл...

Проглочу, поскольку виноват, см "PS".
По делу.
Такой замечательной книжки у меня под рукой нет (у всех свои кумиры), поэтому могу только предположить, что речь идет об измерении, с независимой погрешностью, т.е. не вызывающей погрешности других измерений.
Теперь объясните мне как вы сделаете 1000 независимых измерений на интервале 1с, так чтобы погрешность каждого измерения была как вы пишете ±0.5 Гц.
Fx все же давайте сделаем 3.98Mhz (хотя бы для наглядности, чтоб не тупо 1/2).

Цитата
А погрешность отдельно взятого независимого измерения так и будет ±0.5 Гц, ничего не могу поделать. Ну и какая будет погрешность 1000 независимых измерений в таком случае?

Опять ведь не договариваете.
На каком интервале будет заявленная погрешность?

Цитата
Почитайте книжки Дворяшина, там такая теория наведена, ой-ё-ёй, мало не покажется...
Спасибо за рекомендацию, при возможности воспользуюсь.


PS: Свои слова насчет 0 в сиянии забираю обратно.
Tomade
Цитата(Peeoner @ Jul 21 2008, 23:43) *
Вот я наваял тут вобщем прогу по вашему методу,осталось только все слепить в кучю.

Поделитесь, пожалуйста, наработками. Думаю, начинающим, вроде меня, будет полезно посмотреть.
=GM=
Цитата(defunct @ Jul 21 2008, 23:03) *
Опять ведь не договариваете. На каком интервале будет заявленная погрешность?

Ну, блин, вы даёте! Конечно, на односекундном интервале. Мне что, каждый раз это писать, когда я говорю о погрешности? Я уж язык весь отболтал (:-).

Цитата(defunct @ Jul 21 2008, 23:03) *
Теперь объясните мне как вы сделаете 1000 независимых измерений на интервале 1с, так чтобы погрешность каждого измерения была как вы пишете ±0.5 Гц

Я уже готов сделать 50000 независимых измерений на секундном интервале с погрешностью каждого в ±0.5 Гц, естественно для нашего конкретного случая Fo=8 MГц, Fx=4 MГц. Щас мне надо отъехать, где-то после обеда попытаюсь пояснить, как это можно сделать. А всё-ж-таки, defunct, не прочувствовали вы всю прелесть моего метода (:-).
Tomade
Попробовал написать программу по методу GM, за основу взял программу Яrik_а. Микроконтроллер - ATMega 64L, тактовую частоту взял 1 мГц (просто для тренировки). Вместо нулевого таймера, который задействован у Яrik_а, взял таймер_2.
Работу программы проверял в VMLABе, смоделировав там пульсовый генератор меандра частотой 10 кГц.
Но ничего хорошего не получилось. Вместо ожидаемой индицируемой частоты 10 кГц на ЖК-индикаторе VMLABа в каждом цикле высвечиваются разные значения - от 2 до 30 кГц, причём бывают и отрицательные числа. Подскажите, пожалуйста, где ошибка в программе.

static float Fx;
unsigned long int N1, N2, N;
unsigned long int M1, M2, M;
unsigned int Perepol_Timer2=0, Perepol_Timer1=0;
unsigned int count_T1, count_T2;

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
Perepol_Timer1++;
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
TIMSK&=0xDF;
count_T2=TCNT2;
count_T1=ICR1;
}

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{Perepol_Timer2++;}

void main(void){
// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0xC1;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
TCCR2=0x07;
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x64;
ETIMSK=0x00;
#asm("sei")

Perepol_Timer1=0;
Perepol_Timer2=0;
N1=0;M1=0;

while (1) {
delay_ms(1000);
TIMSK|=0x20;
while ((TIMSK&0x20)==0x20){}
N2=(unsigned long int)(Perepol_Timer1)*65536+count_T1;
M2=(unsigned long int)Perepol_Timer2*65536+count_T2;
N=N2-N1;
M=M2-M1;
Fx=(float)1000000.0*(float)M/(float)N;
//Здесь идёт вывод измеряемой частоты Fx на ЖК-индикатор
N1=N2;
M1=M2; }}
defunct
Цитата(=GM= @ Jul 22 2008, 12:22) *
Ну, блин, вы даёте! Конечно, на односекундном интервале. Мне что, каждый раз это писать, когда я говорю о погрешности? Я уж язык весь отболтал (:-).

Ок, просто это важный момент который надо было услышать от вас именно сейчас ;>
Цитата
Я уже готов сделать 50000 независимых измерений на секундном интервале с погрешностью каждого в ±0.5 Гц, естественно для нашего конкретного случая Fo=8 MГц, Fx=4 MГц. Щас мне надо отъехать, где-то после обеда попытаюсь пояснить, как это можно сделать. А всё-ж-таки, defunct, не прочувствовали вы всю прелесть моего метода (:-).

Как можно на одном секундном интервале сделать 50k независимых измерений секундного интервала (пусть они даже будут пересекаться)?! На секундном интервале есть возможность сделать только одно независимое измерение с точностью ±0.5 Гц (первая часть поста). Все остальные будут обладать либо меньшей точностью, либо не будут независимыми!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.