Перейти к содержанию
    

три частоты на АТмегу 128 с использованием таймеров

ТО GM

БОООООльшое спасибо. :), за ответ. Буду пробовать. :a14:

На здоровье.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

currenTime-oldTime)<OneSec

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

 

На здоровье.

 

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

Завтра, сегодня нет времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Я ж написал там в комментарии: "пункт 1-условно, можно сделать по-другому".

Ну поставьте для начала тупой цикл на ОДНУ секунду, ИЛИ делайте другую задачу в течение одной секунды (примерно, точность здесь не важна) ИЛИ опрашивайте флаг таймера, взведённого на 1 сек ИЛИ сравнивайте число в N1 с текущим содержимым таймера 1, всё зависит от разработчика программы, т.е. от вас. Главное, вы должны выдержать период измерения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На здоровье.

 

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

 

По данному коду в симуляторе 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;
} }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоесть программа работает правильно, это симулятор идиализирует возможности МК и реальные измерения частоты 6 МГц возможны но не будут постоянны.

Я правильно понял?

 

То GM.

Вы не могли бы обяснить все что необходимо для реализации цикла приведенного Вами (с его помощью можно менять время измерения):

while ((currenTime-oldTime)<OneSec)    //п.1-условно, можно сделать по-другому
{
}

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

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть программа работает правильно, это симулятор идиализирует возможности МК и реальные измерения частоты 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) Заведите отдельный таймер, если он есть, запустите его, пусть он взводит флаг через Тизм, в фоне опрашивайте флаг таймера, как только он взведён - наступило время измерения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не только можно, но и нужно. Как сделать - почитайте весь топик повнимательнее, этого достаточно.

 

На этом проце вообще можно сделать частотомер до 4 МГц (то есть до Fclk/2) с программой на си (мечта Яrik'а) с непревзойдённой точностью, скажем, до ±0,005 Гц на одном измерении, а с обработкой и того меньше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На этом проце вообще можно сделать частотомер до 4 МГц (то есть до Fclk/2) с программой на си (мечта Яrik'а) с непревзойдённой точностью, скажем, до ±0,005 Гц на одном измерении, а с обработкой и того меньше.

Только не надо про ±0,005 Гц говорить.

Не будет на частотах 4Mhz такой точности. Подставьте числа в ваши же формулы. Fo = 8Mhz, Fx=4Mhz.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только не надо про ±0,005 Гц говорить.

Не будет на частотах 4Mhz такой точности. Подставьте числа в ваши же формулы. Fo = 8Mhz, Fx=4Mhz.

Ну подставьте сами. А в качестве интервала измерения возьмите 100 секунд. И заметьте, это оценка предельно допустимой ошибки, реальная ошибка будет всегда меньше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в качестве интервала измерения возьмите 100 секунд.

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

 

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

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

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

 

И заметьте, это оценка предельно допустимой ошибки, реальная ошибка будет всегда меньше.

Заметил. Само-собой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проще написать программу, которая автоматом решает, что делать в конкретном случае

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

 

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

Все те же ±0.5Гц на секундном интервале.

Здесь бесспорно "захвать" выиграет.

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Моим методом (ну не совсем моим, он известен давно, просто я его приспособил к периферии аврки, в этом смысле он мой) за 1 с интервал вполне реально сделать 1000 НЕЗАВИСИМЫХ измерений, потом обработать результат, вот и всё обоснование.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...