|
|
  |
три частоты на АТмегу 128 с использованием таймеров, оределить изменения каждой частоты |
|
|
|
Aug 22 2007, 15:43
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Яrik @ Aug 22 2007, 14:23)  ТО GM БОООООльшое спасибо.  , за ответ. Буду пробовать.  На здоровье. ДолОжите нам(:-), какую максимальную частоту удалось измерить.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 22 2007, 16:52
|
Частый гость
 
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216

|
Цитата currenTime-oldTime)<OneSec Это переменные? Цитата(=GM= @ Aug 22 2007, 18:43)  На здоровье.
ДолОжите нам(:-), какую максимальную частоту удалось измерить. Завтра, сегодня нет времени.
|
|
|
|
|
Aug 23 2007, 08:48
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Яrik @ Aug 22 2007, 15:52)  Это переменные? Я ж написал там в комментарии: "пункт 1-условно, можно сделать по-другому". Ну поставьте для начала тупой цикл на ОДНУ секунду, ИЛИ делайте другую задачу в течение одной секунды (примерно, точность здесь не важна) ИЛИ опрашивайте флаг таймера, взведённого на 1 сек ИЛИ сравнивайте число в N1 с текущим содержимым таймера 1, всё зависит от разработчика программы, т.е. от вас. Главное, вы должны выдержать период измерения.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 23 2007, 15:18
|
Частый гость
 
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216

|
Цитата(=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; } }
|
|
|
|
|
Aug 23 2007, 16:27
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Яrik @ Aug 23 2007, 14:18)  По данному коду в симуляторе VMlab удалось померять частоту 6,25МГц (выше не пробывал). Но меня терзают самнения может я что то не так делаю, я где то на форуме читал, что максимальная частота измерения для АВР полтактовой, а то и меньше. Сомнения вас терзают правильно, для тактовой частоты 8 МГц, вы выше 4 МГц не введёте. Вернее, ввести-то можно всё, не будет адекватности, вот в чём беда.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 23 2007, 16:43
|
Частый гость
 
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216

|
Тоесть программа работает правильно, это симулятор идиализирует возможности МК и реальные измерения частоты 6 МГц возможны но не будут постоянны. Я правильно понял? То GM. Вы не могли бы обяснить все что необходимо для реализации цикла приведенного Вами (с его помощью можно менять время измерения): Код while ((currenTime-oldTime)<OneSec) //п.1-условно, можно сделать по-другому { } Что считает время currenTime, oldTime? Спасибо.
|
|
|
|
|
Aug 23 2007, 21:56
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Я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) Заведите отдельный таймер, если он есть, запустите его, пусть он взводит флаг через Тизм, в фоне опрашивайте флаг таймера, как только он взведён - наступило время измерения.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 21 2008, 07:04
|
Участник

Группа: Новичок
Сообщений: 23
Регистрация: 26-05-08
Пользователь №: 37 817

|
Знатоки, подскажите, пожалуйста, как реализовать частотомер по методу GM на ATMega64L. По описанию, у этого микроконтроллера нет входа для внешнего сигнала T0. Может, можно вместо таймера Т0 использовать таймер Т2?
|
|
|
|
|
Jul 21 2008, 14:36
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Jul 21 2008, 16:31)  А в качестве интервала измерения возьмите 100 секунд. Прибор с абсолютной точностью при бесконечном интервале измерения?  Цитата скажем, до ±0,005 Гц на одном измерении и что ради ±0,005 Гц на 4Mhz, будем тормозить 100сек и на более низких частотах? Тогда нет смысла извращаться с захватом. Метод "ворот" проще и даст те же ±0,005 Гц на 100 секундном интервале (разбив его на 100 интервалов с последующим усреднением). Цитата(=GM= @ Jul 21 2008, 16:31)  И заметьте, это оценка предельно допустимой ошибки, реальная ошибка будет всегда меньше. Заметил. Само-собой.
|
|
|
|
|
Jul 21 2008, 14:56
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
defunct:Прибор с абсолютной точностью при бесконечном интервале измерения?
Ну, 100с явно не бесконечный интервал. Отвлекусь. Когда-то работал в пейджинговой компании, у меня было 12 стоваттных передатчиков, работающих синхронно. Пользовался похожим портативным прибором, сделанным на пике кстати, который давал ДЕСЯТЬ значащих цифр. Период измерения составлял 1с, 10с и 100с. Да, неудобно было ждать результата почти 2 минуты, но это же разовая операция. Не знаю другого доступного способа померить частоту в полевых условиях с такой точностью, находясь на радиорелейной башне на высоте 120 м от земли. (Потом, когда всё было настроено, можно было мерять частоту и корректировать дистанционно из единого центра)
defunct: и что ради ±0,005 Гц на 4MГц, будем тормозить 100сек и на более низких частотах?
Проще написать программу, которая автоматом решает, что делать в конкретном случае. Относительная погрешность составляет ±1,25Е-9, вам что, всегда нужна предельная погрешность? Кстати, покажите, какую точность вы получите методом ворот, измеряя 1 кГц?
defunct:Тогда нет смысла извращаться с захватом. Метод "ворот" проще и даст те же ±0,005 Гц на 100 секундном интервале (разбив его на 100 интервалов с последующим усреднением).
С усреднением метод захвата даст тот же результат, что и метод ворот, но на секундном интервале, а не на 100с.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 21 2008, 15:42
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Jul 21 2008, 17:56)  Проще написать программу, которая автоматом решает, что делать в конкретном случае Ок принимается. Цитата Кстати, покажите, какую точность вы получите методом ворот, измеряя 1 кГц? Все те же ±0.5Гц на секундном интервале. Здесь бесспорно "захвать" выиграет. Цитата С усреднением метод захвата даст тот же результат, что и метод ворот, но на секундном интервале, а не на 100с. Обоснуйте. Fo = 8Mhz, Fx = 4Mhz.
|
|
|
|
|
Jul 21 2008, 16:31
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
defunct: Все те же ±0.5Гц на секундном интервале. Здесь бесспорно "захвать" выиграет.
Выиграет естественно, но как! С непревзойдённой точностью: ±0.0000625 Гц. Может она и не нужна на таких частотах, но сама получается и на "голой" аврке. А в методе ворот, вообще-то будет ±1 Гц, а не ±0.5Гц, как вы считаете, не пойму?
defunct: Обоснуйте. Fo = 8Mhz, Fx = 4Mhz.
Моим методом (ну не совсем моим, он известен давно, просто я его приспособил к периферии аврки, в этом смысле он мой) за 1 с интервал вполне реально сделать 1000 НЕЗАВИСИМЫХ измерений, потом обработать результат, вот и всё обоснование.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|