реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Счет частоты
djmixi(Димка)
сообщение Mar 14 2007, 13:45
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 75
Регистрация: 13-02-07
Пользователь №: 25 307



Товарщи помогите посчитать частоту...нужно фискировать изменение частоты 400 кГц с точностью в 1кГц.
я пишу на Алгоритме Билдере и думаю реализвать это так:
1. Настраиваю таймер0 внешний пин Т0.
2. Записываю в TCNT0 254.
3. По приходу импульса таймер переполняектся и срабатвывает прерывание от таймера 0 - там я прибавляю 1 к X.
4. В течении определенного времени провожу подсчет этих прерываний (по показанию X).
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Mar 14 2007, 14:11
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(djmixi(Димка) @ Mar 14 2007, 14:45) *
Товарщи помогите посчитать частоту...нужно фискировать изменение частоты 400 кГц с точностью в 1кГц.
я пишу на Алгоритме Билдере и думаю реализвать это так:
1. Настраиваю таймер0 внешний пин Т0.
2. Записываю в TCNT0 254.
3. По приходу импульса таймер переполняектся и срабатвывает прерывание от таймера 0 - там я прибавляю 1 к X.
4. В течении определенного времени провожу подсчет этих прерываний (по показанию X).

А в прерывании опять 254 записываете?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
muravei
сообщение Mar 14 2007, 14:26
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(djmixi(Димка) @ Mar 14 2007, 13:45) *
4. В течении определенного времени провожу подсчет этих прерываний (по показанию X).

Что-то я не понял, а таймер нафига?
Go to the top of the page
 
+Quote Post
Demeny
сообщение Mar 14 2007, 14:29
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(djmixi(Димка) @ Mar 14 2007, 13:45) *
Товарщи помогите посчитать частоту...нужно фискировать изменение частоты 400 кГц с точностью в 1кГц.
я пишу на Алгоритме Билдере и думаю реализвать это так:
1. Настраиваю таймер0 внешний пин Т0.
2. Записываю в TCNT0 254.
3. По приходу импульса таймер переполняектся и срабатвывает прерывание от таймера 0 - там я прибавляю 1 к X.
4. В течении определенного времени провожу подсчет этих прерываний (по показанию X).

Всё много проще. Есть два основных метода измерения частоты.

1. Подсчёт импульсов за единицу времени. В этом случае точность измерения зависит от того, сколько импульсов у Вас уложится за выбранную Вами единицу времени и насколько точно Вы сможете отмерить эту единицу.
Именно этот метод лежит в основе предложенного Вами способа. Но реализован он у Вас нерационально (на мой взгляд). Предлагаю так. Счётчик 0 (8 битный) используем для отмеривания временных интервалов измерения. В Вашем случае этот интервал должен составлять не менее 1 мс. А счётчик 1 (16 битный) настраиваем на подсчёт импульсов с ножки Т1, куда и заводим исследуемую частоту. Прерывания будет генерить счётчик 0, например, по переполнению. В процедуре обработки считываем текущие показания счётчика 1, обнуляем его и вычисляем новое значение частоты.

2. Заполнение каждого пришедшего импульса импульсами существенно более высокой известной частоты. Этот способ применяется тогда, когда новое измеренное значение надо получать существенно чаще, чем это позволяет первый способ, вплоть до каждого периода. Для получения заявленной точности заполнение в Вашем случае будет частотой свыше 160 МГц, поэтому для реализации на AVR этот способ непригоден.


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
djmixi(Димка)
сообщение Mar 14 2007, 15:23
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 75
Регистрация: 13-02-07
Пользователь №: 25 307



[quote name='Demeny' post='223613' date='Mar 14 2007, 17:29']
[quote name='djmixi(Димка)' post='223590' date='Mar 14 2007, 13:45']
Товарщи помогите посчитать частоту...нужно фискировать изменение частоты 400 кГц с точностью в 1кГц.
я пишу на Алгоритме Билдере и думаю реализвать это так:
1. Настраиваю таймер0 внешний пин Т0.
2. Записываю в TCNT0 254.
3. По приходу импульса таймер переполняектся и срабатвывает прерывание от таймера 0 - там я прибавляю 1 к X.
4. В течении определенного времени провожу подсчет этих прерываний (по показанию X).
[/quote]
Всё много проще. Есть два основных метода измерения частоты.

1. Подсчёт импульсов за единицу времени. В этом случае точность измерения зависит от того, сколько импульсов у Вас уложится за выбранную Вами единицу времени и насколько точно Вы сможете отмерить эту единицу.
Именно этот метод лежит в основе предложенного Вами способа. Но реализован он у Вас нерационально (на мой взгляд). Предлагаю так. Счётчик 0 (8 битный) используем для отмеривания временных интервалов измерения. В Вашем случае этот интервал должен составлять не менее 1 мс. А счётчик 1 (16 битный) настраиваем на подсчёт импульсов с ножки Т1, куда и заводим исследуемую частоту. Прерывания будет генерить счётчик 0, например, по переполнению. В процедуре обработки считываем текущие показания счётчика 1, обнуляем его и вычисляем новое значение частоты.

2. Заполнение каждого пришедшего импульса импульсами существенно более высокой известной частоты. Этот способ применяется тогда, когда новое измеренное значение надо получать существенно чаще, чем это позволяет первый способ, вплоть до каждого периода. Для получения заявленной точности заполнение в Вашем случае будет частотой свыше 160 МГц, поэтому для реализации на AVR этот способ непригоден.
[/quote]

СПАСИБО ОСОБЕННО ЗА ПЕРВЫЙ СПОСПОБ!
но возникал проблемма у меня тини26 контроллер там 8 разр таймер 0 - у него есть доступ в T0 а у первого таймера 16 разрядного нет настройки на T0....что делать???


[quote name='djmixi(Димка)' date='Mar 14 2007, 18:16' post='223630']
[quote name='Demeny' post='223613' date='Mar 14 2007, 17:29']
[quote name='djmixi(Димка)' post='223590' date='Mar 14 2007, 13:45']
Товарщи помогите посчитать частоту...нужно фискировать изменение частоты 400 кГц с точностью в 1кГц.
я пишу на Алгоритме Билдере и думаю реализвать это так:
1. Настраиваю таймер0 внешний пин Т0.
2. Записываю в TCNT0 254.
3. По приходу импульса таймер переполняектся и срабатвывает прерывание от таймера 0 - там я прибавляю 1 к X.
4. В течении определенного времени провожу подсчет этих прерываний (по показанию X).
[/quote]
Всё много проще. Есть два основных метода измерения частоты.

1. Подсчёт импульсов за единицу времени. В этом случае точность измерения зависит от того, сколько импульсов у Вас уложится за выбранную Вами единицу времени и насколько точно Вы сможете отмерить эту единицу.
Именно этот метод лежит в основе предложенного Вами способа. Но реализован он у Вас нерационально (на мой взгляд). Предлагаю так. Счётчик 0 (8 битный) используем для отмеривания временных интервалов измерения. В Вашем случае этот интервал должен составлять не менее 1 мс. А счётчик 1 (16 битный) настраиваем на подсчёт импульсов с ножки Т1, куда и заводим исследуемую частоту. Прерывания будет генерить счётчик 0, например, по переполнению. В процедуре обработки считываем текущие показания счётчика 1, обнуляем его и вычисляем новое значение частоты.

2. Заполнение каждого пришедшего импульса импульсами существенно более высокой известной частоты. Этот способ применяется тогда, когда новое измеренное значение надо получать существенно чаще, чем это позволяет первый способ, вплоть до каждого периода. Для получения заявленной точности заполнение в Вашем случае будет частотой свыше 160 МГц, поэтому для реализации на AVR этот способ непригоден.
[/quote]

СПАСИБО ОСОБЕННО ЗА ПЕРВЫЙ СПОСПОБ!
но возникал проблемма у меня тини26 контроллер там 8 разр таймер 0 - у него есть доступ в T0 а у первого таймера 16 разрядного нет настройки на T0....что делать???
ДЛЯ этого я и извращаюсь с таймером 0 - запихиваю туды 16 раз переменную X а таймер 1 для временных интервалов...
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 14 2007, 18:40
Сообщение #6


Ambidexter
*****

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



Цитата(djmixi(Димка) @ Mar 14 2007, 18:16) *
Цитата(Demeny @ Mar 14 2007, 17:29) *

Цитата(djmixi(Димка) @ Mar 14 2007, 13:45) *

Товарищи, помогите посчитать частоту...нужно фиксировать изменение частоты 400 кГц с точностью в 1кГц.
я пишу на Алгоритме Билдере и думаю реализвать это так:
1. Настраиваю таймер0 внешний пин Т0.
2. Записываю в TCNT0 254.
3. По приходу импульса таймер переполняектся и срабатывает прерывание от таймера 0 - там я прибавляю 1 к X.
4. В течении определенного времени провожу подсчет этих прерываний (по показанию X).

Всё много проще. Есть два основных метода измерения частоты.

1. Подсчёт импульсов за единицу времени. В этом случае точность измерения зависит от того, сколько импульсов у Вас уложится за выбранную Вами единицу времени и насколько точно Вы сможете отмерить эту единицу.
Именно этот метод лежит в основе предложенного Вами способа. Но реализован он у Вас нерационально (на мой взгляд). Предлагаю так. Счётчик 0 (8 битный) используем для отмеривания временных интервалов измерения. В Вашем случае этот интервал должен составлять не менее 1 мс. А счётчик 1 (16 битный) настраиваем на подсчёт импульсов с ножки Т1, куда и заводим исследуемую частоту. Прерывания будет генерить счётчик 0, например, по переполнению. В процедуре обработки считываем текущие показания счётчика 1, обнуляем его и вычисляем новое значение частоты.

2. Заполнение каждого пришедшего импульса импульсами существенно более высокой известной частоты. Этот способ применяется тогда, когда новое измеренное значение надо получать существенно чаще, чем это позволяет первый способ, вплоть до каждого периода. Для получения заявленной точности заполнение в Вашем случае будет частотой свыше 160 МГц, поэтому для реализации на AVR этот способ непригоден.


СПАСИБО ОСОБЕННО ЗА ПЕРВЫЙ СПОСПОБ!
но возникал проблемма у меня тини26 контроллер там 8 разр таймер 0 - у него есть доступ в T0 а у первого таймера 16 разрядного нет настройки на T0....что делать???
ДЛЯ этого я и извращаюсь с таймером 0 - запихиваю туды 16 раз переменную X а таймер 1 для временных интервалов...

Делайте, как делали, поскольку у вас таймер1 тоже 8-битный. По моей оценке, даже если вы просто откроете окно на 10 мс, затем вычислите разность показаний таймера1, то посчитаете свои 400 кГц с точностью не хуже ±100 Гц. При условии, что у вас 16 МГц клок.

Недавно было обсуждение похожего вопроса http://electronix.ru/forum/index.php?showtopic=27983, там правда мега 128 присутствовала, в посте 19 было предложено вообще без прерываний считать.

Кстати, есть и третий способ, симбиоз первого и второго - заполнение точно М периодов частоты Fx периодами более высокой известной частоты Fo, точность существенно увеличивается. Для вашей частоты за примерно односекундное окно точность была бы не хуже ±0.025 Гц. Я в своё время на 8515 за 1.2 миллисекунды считал 1500 кГц с точностью ±10 Гц. К сожалению, данный подход на вашем МК не осуществим из-за отсутствия ICR.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Яrik
сообщение Mar 14 2007, 22:05
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



А какую максимальную частоту могут посчитать микроконтроллеры серии mega, без внешних делителей?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 15 2007, 00:18
Сообщение #8


Ambidexter
*****

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



Цитата(Яrik @ Mar 14 2007, 19:05) *
А какую максимальную частоту могут посчитать микроконтроллеры серии mega, без внешних делителей?

Есть несколько подходов к этому нехорошему делу(:-). При одном подходе Fmax=Fclk/5, т.е. для 20 МГц машинок получите не более 4 Мгц без единого внешнего элемента с точностью не хуже ±0.20 Гц для однократного измерения, т.е. относительная точность составляет ±5•10^-8, что на порядок превышает относительную точность опорного генератора.

Недавно придумалась другая метода, с помощью которой довёл измеренное Fmax до Fclk/2 с той же относительной точностью, т.е. можно измерить 10 Мгц с точностью ±0.5 Гц. Ставите делитель на 10 и меряете 100 МГц с точностью ±5 Гц, еще один - и меряете 1000 МГц с точностью ±50 Гц. К сожалению, такая метода пригодна не для всех мег.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 15 2007, 02:34
Сообщение #9


кекс
******

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



Считаем количество импульсов и тактов, делим одно на другое и домножаем на частоту чипа. Погрешность измерения для исходного сигнала при правильной реализации будет менее 1Гц.

Как это сделать:
Такты отмеряем таймером. А импульсы - программным опросом.
Заряжаем прерывание по OVF, запускаем таймер. запрещаем все прерывания кроме таймера. В цикле опрашиваем порт и увеличиваем счетчик импульсов. В обработчике прерывания таймера - отключаем таймер, считаем, выводим рез-тат, сбрасываем счетчик импульсов.

ps: сорри если повторил кого-то, ветку не читал.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 16 2007, 01:18
Сообщение #10


Ambidexter
*****

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



Цитата(defunct @ Mar 14 2007, 23:34) *
сорри если повторил кого-то, ветку не читал.

Ну и мы читать не будем(:-)! Вообще-то зачем отвечать, не читая? Выглядит всё это так, как будто вы, чиновник от программирования(:-), такой важный и исполненый сознания собственного достоинства, снизошли до нас грешных, не читая выдали решение...и всё это для галочки(:-). Ничего личного, но так выглядит со стороны.
Цитата(defunct @ Mar 14 2007, 23:34) *
Считаем количество импульсов и тактов, делим одно на другое и домножаем на частоту чипа. Погрешность измерения для исходного сигнала при правильной реализации будет менее 1Гц.
Как это сделать:
Такты отмеряем таймером. А импульсы - программным опросом.
Заряжаем прерывание по OVF, запускаем таймер. запрещаем все прерывания кроме таймера. В цикле опрашиваем порт и увеличиваем счетчик импульсов. В обработчике прерывания таймера - отключаем таймер, считаем, выводим рез-тат, сбрасываем счетчик импульсов.

Но вот такой вопрос по вашей методе. Импульсы вы отмеряете программным опросом, а входная частота 6 МГц, как вы отмерите импульсы такой частоты? Я, например, не уверен, что возможно. Покажите, как отмерить!

Ещё вопрос по точности измерения. Измерение по предложенному вами методу за время измерения в 1 с даст точность ±1 Гц, а есть метода, которая даст не хуже ±0,02 Гц на том же секундном окне. Почувствуйте, что называется, разницу. Почти два порядка.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 16 2007, 02:46
Сообщение #11


кекс
******

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



Цитата(=GM= @ Mar 16 2007, 00:18) *
....
Ничего личного, но так выглядит со стороны.

Я вас понимаю, и возможно подумал бы тоже самое про того кто так ответил.
Но я выбирал между тем постить ответ или поспать лишние 10 минут, так что извиняйте.

Цитата
Но вот такой вопрос по вашей методе. Импульсы вы отмеряете программным опросом, а входная частота 6 МГц, как вы отмерите импульсы такой частоты? Я, например, не уверен, что возможно. Покажите, как отмерить!

конечно же никак. но для 400kHz как в сабжевом сигнале подойдет.

Цитата
Ещё вопрос по точности измерения. Измерение по предложенному вами методу за время измерения в 1 с даст точность ±1 Гц, а есть метода, которая даст не хуже ±0,02 Гц на том же секундном окне. Почувствуйте, что называется, разницу. Почти два порядка.

Я не упоминал о секндном окне. Речь шла об окне таймера!
Метода с делителем внесет доп. элемент.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 16 2007, 03:13
Сообщение #12


Ambidexter
*****

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



Цитата(defunct @ Mar 15 2007, 23:46) *
конечно же никак. но для 400kHz как в сабжевом сигнале подойдет.

Для автора темы подойдёт точность 100 Гц. А здесь мы как бы о теории рассуждаем(:-).
Цитата(defunct @ Mar 15 2007, 23:46) *
Я не упоминал о секундном окне. Речь шла об окне таймера!
Метода с делителем внесет доп. элемент.

Предполагаю, что окно таймера и есть секундный интервал. Согласен, прямо вы не упоминали, но указав точность ±1 Гц, косвенно вы имели в виду именно 1 секундный интервал. Для 0.1 с окна точность вашего метода будет ±10 Гц.

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

Да, и никакого делителя не надо, это вы перегнули(:-). Все измерения идут на голой машине.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 05:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01486 секунд с 7
ELECTRONIX ©2004-2016