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

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

Что-то я не понял, а таймер нафига?
Demeny
Цитата(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 этот способ непригоден.
djmixi(Димка)
[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 для временных интервалов...
=GM=
Цитата(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.
Яrik
А какую максимальную частоту могут посчитать микроконтроллеры серии mega, без внешних делителей?
=GM=
Цитата(Я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 Гц. К сожалению, такая метода пригодна не для всех мег.
defunct
Считаем количество импульсов и тактов, делим одно на другое и домножаем на частоту чипа. Погрешность измерения для исходного сигнала при правильной реализации будет менее 1Гц.

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

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

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

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

Ещё вопрос по точности измерения. Измерение по предложенному вами методу за время измерения в 1 с даст точность ±1 Гц, а есть метода, которая даст не хуже ±0,02 Гц на том же секундном окне. Почувствуйте, что называется, разницу. Почти два порядка.
defunct
Цитата(=GM= @ Mar 16 2007, 00:18) *
....
Ничего личного, но так выглядит со стороны.

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

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

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

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

Я не упоминал о секндном окне. Речь шла об окне таймера!
Метода с делителем внесет доп. элемент.
=GM=
Цитата(defunct @ Mar 15 2007, 23:46) *
конечно же никак. но для 400kHz как в сабжевом сигнале подойдет.

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

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

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

Да, и никакого делителя не надо, это вы перегнули(:-). Все измерения идут на голой машине.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.