=GM= 0 22 августа, 2007 Опубликовано 22 августа, 2007 · Жалоба ТО GM БОООООльшое спасибо. :), за ответ. Буду пробовать. :a14: На здоровье. ДолОжите нам(:-), какую максимальную частоту удалось измерить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Яrik 0 22 августа, 2007 Опубликовано 22 августа, 2007 · Жалоба currenTime-oldTime)<OneSec Это переменные? На здоровье. ДолОжите нам(:-), какую максимальную частоту удалось измерить. Завтра, сегодня нет времени. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 23 августа, 2007 Опубликовано 23 августа, 2007 · Жалоба Это переменные? Я ж написал там в комментарии: "пункт 1-условно, можно сделать по-другому". Ну поставьте для начала тупой цикл на ОДНУ секунду, ИЛИ делайте другую задачу в течение одной секунды (примерно, точность здесь не важна) ИЛИ опрашивайте флаг таймера, взведённого на 1 сек ИЛИ сравнивайте число в N1 с текущим содержимым таймера 1, всё зависит от разработчика программы, т.е. от вас. Главное, вы должны выдержать период измерения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Яrik 0 23 августа, 2007 Опубликовано 23 августа, 2007 · Жалоба На здоровье. ДолОжите нам(:-), какую максимальную частоту удалось измерить. По данному коду в симуляторе 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= 0 23 августа, 2007 Опубликовано 23 августа, 2007 · Жалоба По данному коду в симуляторе VMlab удалось померять частоту 6,25МГц (выше не пробывал). Но меня терзают самнения может я что то не так делаю, я где то на форуме читал, что максимальная частота измерения для АВР полтактовой, а то и меньше. Сомнения вас терзают правильно, для тактовой частоты 8 МГц, вы выше 4 МГц не введёте. Вернее, ввести-то можно всё, не будет адекватности, вот в чём беда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Яrik 0 23 августа, 2007 Опубликовано 23 августа, 2007 · Жалоба Тоесть программа работает правильно, это симулятор идиализирует возможности МК и реальные измерения частоты 6 МГц возможны но не будут постоянны. Я правильно понял? То GM. Вы не могли бы обяснить все что необходимо для реализации цикла приведенного Вами (с его помощью можно менять время измерения): while ((currenTime-oldTime)<OneSec) //п.1-условно, можно сделать по-другому { } Что считает время currenTime, oldTime? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 23 августа, 2007 Опубликовано 23 августа, 2007 · Жалоба То есть программа работает правильно, это симулятор идиализирует возможности МК и реальные измерения частоты 6 МГц возможны но не будут постоянны. Я правильно понял? Неправильно. Для 8-МГц аврки выше 4 МГц вы принципиально ничего не померяете. То 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 0 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба Знатоки, подскажите, пожалуйста, как реализовать частотомер по методу GM на ATMega64L. По описанию, у этого микроконтроллера нет входа для внешнего сигнала T0. Может, можно вместо таймера Т0 использовать таймер Т2? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба Не только можно, но и нужно. Как сделать - почитайте весь топик повнимательнее, этого достаточно. На этом проце вообще можно сделать частотомер до 4 МГц (то есть до Fclk/2) с программой на си (мечта Яrik'а) с непревзойдённой точностью, скажем, до ±0,005 Гц на одном измерении, а с обработкой и того меньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба На этом проце вообще можно сделать частотомер до 4 МГц (то есть до Fclk/2) с программой на си (мечта Яrik'а) с непревзойдённой точностью, скажем, до ±0,005 Гц на одном измерении, а с обработкой и того меньше. Только не надо про ±0,005 Гц говорить. Не будет на частотах 4Mhz такой точности. Подставьте числа в ваши же формулы. Fo = 8Mhz, Fx=4Mhz. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба Только не надо про ±0,005 Гц говорить. Не будет на частотах 4Mhz такой точности. Подставьте числа в ваши же формулы. Fo = 8Mhz, Fx=4Mhz. Ну подставьте сами. А в качестве интервала измерения возьмите 100 секунд. И заметьте, это оценка предельно допустимой ошибки, реальная ошибка будет всегда меньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба А в качестве интервала измерения возьмите 100 секунд. Прибор с абсолютной точностью при бесконечном интервале измерения? :) скажем, до ±0,005 Гц на одном измерении и что ради ±0,005 Гц на 4Mhz, будем тормозить 100сек и на более низких частотах? Тогда нет смысла извращаться с захватом. Метод "ворот" проще и даст те же ±0,005 Гц на 100 секундном интервале (разбив его на 100 интервалов с последующим усреднением). И заметьте, это оценка предельно допустимой ошибки, реальная ошибка будет всегда меньше. Заметил. Само-собой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба defunct:Прибор с абсолютной точностью при бесконечном интервале измерения? Ну, 100с явно не бесконечный интервал. Отвлекусь. Когда-то работал в пейджинговой компании, у меня было 12 стоваттных передатчиков, работающих синхронно. Пользовался похожим портативным прибором, сделанным на пике кстати, который давал ДЕСЯТЬ значащих цифр. Период измерения составлял 1с, 10с и 100с. Да, неудобно было ждать результата почти 2 минуты, но это же разовая операция. Не знаю другого доступного способа померить частоту в полевых условиях с такой точностью, находясь на радиорелейной башне на высоте 120 м от земли. (Потом, когда всё было настроено, можно было мерять частоту и корректировать дистанционно из единого центра) defunct: и что ради ±0,005 Гц на 4MГц, будем тормозить 100сек и на более низких частотах? Проще написать программу, которая автоматом решает, что делать в конкретном случае. Относительная погрешность составляет ±1,25Е-9, вам что, всегда нужна предельная погрешность? Кстати, покажите, какую точность вы получите методом ворот, измеряя 1 кГц? defunct:Тогда нет смысла извращаться с захватом. Метод "ворот" проще и даст те же ±0,005 Гц на 100 секундном интервале (разбив его на 100 интервалов с последующим усреднением). С усреднением метод захвата даст тот же результат, что и метод ворот, но на секундном интервале, а не на 100с. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба Проще написать программу, которая автоматом решает, что делать в конкретном случае Ок принимается. Кстати, покажите, какую точность вы получите методом ворот, измеряя 1 кГц? Все те же ±0.5Гц на секундном интервале. Здесь бесспорно "захвать" выиграет. С усреднением метод захвата даст тот же результат, что и метод ворот, но на секундном интервале, а не на 100с. Обоснуйте. Fo = 8Mhz, Fx = 4Mhz. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба defunct: Все те же ±0.5Гц на секундном интервале. Здесь бесспорно "захвать" выиграет. Выиграет естественно, но как! С непревзойдённой точностью: ±0.0000625 Гц. Может она и не нужна на таких частотах, но сама получается и на "голой" аврке. А в методе ворот, вообще-то будет ±1 Гц, а не ±0.5Гц, как вы считаете, не пойму? defunct: Обоснуйте. Fo = 8Mhz, Fx = 4Mhz. Моим методом (ну не совсем моим, он известен давно, просто я его приспособил к периферии аврки, в этом смысле он мой) за 1 с интервал вполне реально сделать 1000 НЕЗАВИСИМЫХ измерений, потом обработать результат, вот и всё обоснование. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться