sKWO 0 5 апреля, 2007 Опубликовано 5 апреля, 2007 (изменено) · Жалоба суть дела такова можно ли с хорошей точностью определить частоты поданные на таймера АТмеги 128?? изменнения -+ 40 ГЦ (в этих пределах) частоты 50 КГц, 90 КГц, 170 КГц. У АТмеги 128 три таймера - один 16-ти разрядный(1). и два 8-ми разрядных. Как правильно написать прогу на Си??? Нужно ли мне работать по флагам или подсчитывать количества переполнений таймеров и если да то какое количество переполнений удовлетворит точности определе ления для каждой из частот +- 2герца? Нужно ли ставить предделители для восьмиразрядных таймеров на два или на :n? Тактовая частота контроллера 22.1184 МГц! Значения думаю передавать по УАРТУ!! bodja74 у Вас возникли какае нибудь идеи? а у Резидента? Изменено 5 апреля, 2007 пользователем sKWO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 5 апреля, 2007 Опубликовано 5 апреля, 2007 · Жалоба Во-первых, вы не указали за какой период времени хотите получить значение с заданной точностью? Во-вторых, для получения точных отсчетов нужно использовать режим захвата (Capture) таймера. Я слабо знаком с AVR, у вашей атмеги имеются три входа захвата? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sKWO 0 6 апреля, 2007 Опубликовано 6 апреля, 2007 · Жалоба НЕТ. Capture присутствует только у таймера 1 (16 разрядный) а продолжительность счёта будет зависеть от точности результата допустим за 1с резидент извините за тупо вопрос на телесистемах по поводу клавиш с гистерезисом Микроконтроллер Атмега 168 а не 128 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 6 апреля, 2007 Опубликовано 6 апреля, 2007 · Жалоба 2 частоты мерять в принципе реально - а вот 3 - ??? , я бы советовал для 2-х входящих сигналов работать с INT0,INT1(как пишут в книгах и ДШ - обнаружение фронтов на входах интов происходит синхронно - тобто за 1 такт , но для ваших частот и 16 тактов что мож уйти на вход интерупт - роли не сыграет),вот, ну а если взять ИНТ2 - то там мин время для принятия решения- 50нс - в принципе я так дцмаю реально склепать такую схему... Но итн2 я всегда обходил дальней дорогой, поэтому не могу точно сказать как будет работать - но в принципе будет :) . ну а время мерять таймерами(можно так же юзать каую нить переменную типа лонга если в таймер не вкладываемся) - вот я б так реализовал, ну а если пойти по правильному пути - то тут надо действительно на вход ИСП подавать таймера , а он вроде только у Т1 присутствует... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 7 апреля, 2007 Опубликовано 7 апреля, 2007 · Жалоба изменения -+ 40 ГЦ (в этих пределах) частоты 50 КГц, 90 КГц, 170 КГц. У АТмеги 128 три таймера - один 16-ти разрядный(1). и два 8-ми разрядных. Начнём с того, что у атмеги128 четыре таймера. Два - 16-разрядных и два - 8-разрядных. Первые к тому же имеют input capture unit Нужно ли мне работать по флагам или подсчитывать количества переполнений таймеров и если да то какое количество переполнений удовлетворит точности определения для каждой из частот +- 2герца? Ставьте две частоты на два input capture unit, третью (50 кГц) - на прерывание. За одну секунду без всяких ухищрений получите ±1 Гц для всех частот. Значения думаю передавать по УАРТУ!! Да хоть по FireWire(:-)!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 7 апреля, 2007 Опубликовано 7 апреля, 2007 · Жалоба Начнём с того, что у атмеги128 четыре таймера. Два - 16-разрядных и два - 8-разрядных. Первые к тому же имеют input capture unit m168, см comment #2 Во первых. Господа, Capture Unit для таких частот не пригодится. Capture Unit решает обратную задачу - измерение временных интервалов и чем меньше частота тем лучше. На частоте же 170Khz это будет всего ~100 тактов на период, точность будет мягко сказать хреновая при значительных затратах процессорного времени. А теперь к самой задаче: таймер T0 использовать в режиме External Clock source с прескейлером 1. таймер T2 - в asyncronous режиме (тоже External clock) с прескейлером 1. T1 16-ти разрядный оставить для отмерки секундных интервалов (и возможно каких-то других нужд) к входу T0 подрубить сигнал 90khz к входу T2 - 170khz По прерыванию OVF увеличивать (на 256) значения 32-х разрядных счетчиков. 50khz мерять с помощью Int0 - в обработчике прерывания инкрементировать счетчик. По прерыванию OC T1 (каждую секунду), прибавлять к счетчикам текущее значение таймеров T0, T2, сбрасывать таймеры T0, T2 и выводить рез-тат. Точность будет +-1 Hz за секунду для всех 3х частот, плюс останется куча процессорного времени. Тобиш и частоту тактирования можно брать раза в два меньше. PS: Кварц 22.1184 - фтопку, оверклок - неправильная затея. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 7 апреля, 2007 Опубликовано 7 апреля, 2007 · Жалоба (=GM= @ Apr 7 2007, 00:40) Начнём с того, что у атмеги128 четыре таймера. Два - 16-разрядных и два - 8-разрядных. Первые к тому же имеют input capture unit m168, см comment #2 Что за comment #2? На заголовок темы посмотрите. Во первых. Господа, Capture Unit для таких частот не пригодится. Capture Unit решает обратную задачу - измерение временных интервалов и чем меньше частота тем лучше. На частоте же 170Khz это будет всего ~100 тактов на период, точность будет мягко сказать хреновая при значительных затратах процессорного времени. Ну тут я полностью с вами не согласен. Именно Capture Unit поможет добиться непревзойдённой точности. Кто нам мешает измерить 170000 периодов в секунду с помощью Capture Unit? Вгрубе так, запустили прерывание Capture Unit, оно сработало, в прерывании записали захваченное время т1 и выключили прерывания Capture Unit. Выждали примерно (!) секунду, включили прерывания Capture Unit опять, сработало, в прерывании записали время т2 и выключили прерывания Capture Unit. Зная количество периодов входной частоты, (т2-т1) и тактовую частоту, вычисляем частоту входного сигнала, точность измерения примерно ±0,02 Гц. Сравните с вашими ±1 Гц. Другим способом на данном железе вы такой точности не добьётесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 8 апреля, 2007 Опубликовано 8 апреля, 2007 · Жалоба Во первых. Господа, Capture Unit для таких частот не пригодится. Capture Unit решает обратную задачу - измерение временных интервалов и чем меньше частота тем лучше. На частоте же 170Khz это будет всего ~100 тактов на период, точность будет мягко сказать хреновая при значительных затратах процессорного времени. Я ведь потому и спросил о периоде готовности результата. Чем больше период времени выделенный для подсчета частоты, тем точнее можно получить результат за счет матем.обработки. Да, при частоте тактирования таймера 22МГц использование Capture позволяет получить дискретность определения периода частоты порядка 45нс. Для частоты 170кГц эта точность хуже 1%. Но если усреднить результаты измерения за временной интервал значительно превышающий период частоты сигнала, то мы получим гораздо бОльшее временнОе разрешение, чем искомые 45нс. За 1 сек можно посчитать частоту 170кГц с точностью почти на порядок выше, чем дает единичный отсчет с дискретностью определения периода в 45мс. Впрочем на форуме это уже неоднократно обсуждалось, имеет ли смысл повторяться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 8 апреля, 2007 Опубликовано 8 апреля, 2007 · Жалоба m168, см comment #2 Что за comment #2? На заголовок темы посмотрите. Понятно, тобиш вам до лампочки поправка условия задачи автором темы в comment'e #2. И 22.1184 для m128 совсем не смущает? Как всегда решаете какую-то свою мега задачу? ;> 20MSPS на AVR c Fosc 20Mhz. Ну тут я полностью с вами не согласен. Именно Capture Unit поможет добиться непревзойдённой точности. Кто нам мешает измерить 170000 периодов в секунду с помощью Capture Unit? Вгрубе так, запустили прерывание Capture Unit, оно сработало, в прерывании записали захваченное время т1 и выключили прерывания Capture Unit. Выждали примерно (!) секунду, включили прерывания Capture Unit опять, сработало, в прерывании записали время т2 и выключили прерывания Capture Unit. Зная количество периодов входной частоты, (т2-т1) и тактовую частоту, вычисляем частоту входного сигнала, точность измерения примерно ±0,02 Гц. Сравните с вашими ±1 Гц. Другим способом на данном железе вы такой точности не добьётесь. Вы упускаете тот факт, что прерывания будут идти с шагом в 100 тактов лишь только от одного источника, источников 3, ваша система на трех источниках просто захлебнется, а еще ведь надо и UART как-то обслуживать, и вероятно выполнять еще какие-то задачи. Зачем гонка за точностью 0.02Гц, там где по условию задачи достаточно +-2Гц. Или вы предлагаете все на ассемблере отточить в 300 байт кода. Дык зачем тогда m128 и даже m168 ставить? resident Вы говорили где-то, что с AVR'ами работали мало, поэтому я допускаю что, вы не в курсе того, что AVR будет просто пропускать прерывания, которые не будет успевать обработать. И даже мат обработка не поможет устранить эту ошибку, точность будет весьма скверная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 8 апреля, 2007 Опубликовано 8 апреля, 2007 · Жалоба Понятно, то бишь вам до лампочки поправка условия задачи автором темы в comment'e #2. И 22.1184 для m128 совсем не смущает? Положим, пост #2 - это пост не автора, а rezident'a. Кто частоту применяет, тот пусть и смущается, сам я стараюсь не выходить за пределы технических спецификаций на прибор. Как всегда решаете какую-то свою мега задачу? ;> 20MSPS на AVR c Fosc 20Mhz. Подумываю(:-). Мне интересно выжать из прибора максимум возможного. Вы упускаете тот факт, что прерывания будут идти с шагом в 100 тактов лишь только от одного источника, источников 3, ваша система на трех источниках просто захлебнется, а еще ведь надо и UART как-то обслуживать, и вероятно выполнять еще какие-то задачи. А вы упускаете тот весьма значительный факт, что прерываний всего ШЕСТЬ, три в начале измерения, и три в конце измерения, и между ними промежуток в ОДНУ секунду. Ну и кто там захлебнётся, и чем? Да к тому же измерения частот независимы и их можно обрабатывать последовательно, т.е. ОДНО прерывание одномоментно. Что касается количества прерываний, там еще должны быть прерывания от таймеров - обработка переполнения, тоже не вижу никаких проблем. Зачем гонка за точностью 0.02Гц, там где по условию задачи достаточно +-2Гц. Никакой гонки, просто использование Capture Unit, который вы отметаете за ненадобностью, автоматически даст эту самую точность. Или вы предлагаете все на ассемблере отточить в 300 байт кода. Дык зачем тогда m128 и даже m168 ставить?Ну почему, данную задачу можно легко реализовать на си, и даже под какой-нибудь осью, всё зависит от постановки задачи. А на ассемблере всё уместится в 150 байт кода, особо не напрягаясь. Один час работы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bodja74 0 8 апреля, 2007 Опубликовано 8 апреля, 2007 · Жалоба 2=GM= Думаю что вариант с внешним тактом таймеров будет получше чем захват, с внешним тактом вообще никаких вычислений не нужно - просто выбрать из регистра значение допустим через секунду,примерно также и с ИНТ ,просто инкрементировать в прерываниии и больше ничего. в варианте с захватом чем меньше импульс (выше частота) тем больше погрешность при расчете частоты, и здесь 0.02Гц весьма сомнительно,так при частоте 170кГц мы будем иметь погрешность 1% - соответственно для этой частоты +\- 1.7кГц :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 8 апреля, 2007 Опубликовано 8 апреля, 2007 · Жалоба 2=GM= Думаю что вариант с внешним тактом таймеров будет получше чем захват, с внешним тактом вообще никаких вычислений не нужно - просто выбрать из регистра значение допустим через секунду,примерно также и с ИНТ ,просто инкрементировать в прерываниии и больше ничего. в варианте с захватом чем меньше импульс (выше частота) тем больше погрешность при расчете частоты, и здесь 0.02Гц весьма сомнительно, так при частоте 170 кГц мы будем иметь погрешность 1% - соответственно для этой частоты +\- 1.7кГц :) Тут какая-то путаница в понимании и терминологии. Давайте с самого начала. Поясните ваш вариант с внешним тактом таймеров, как он выглядит(:-). К слову сказать, если такт внешний, то таймер называется счётчиком. А потом я вам расскажу про свой вариант с захватом. И покажу, что на секундном интервале частота 170 кГц измеряется МК с тактовой частотой 16 МГц с точностью ±0,010625 Гц (вгрубе ±0,01 Гц) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 9 апреля, 2007 Опубликовано 9 апреля, 2007 · Жалоба bodja74, видимо имеет в виду метод "временнЫх ворот", т.е. подсчет числа импульсов за определенный интервал времени. А потом я вам расскажу про свой вариант с захватом. И покажу, что на секундном интервале частота 170 кГц измеряется МК с тактовой частотой 16 МГц с точностью ±0,010625 Гц (вгрубе ±0,01 Гц) Это временнОе разрешение такое получается, а точность измерения несколько похуже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 9 апреля, 2007 Опубликовано 9 апреля, 2007 · Жалоба bodja74, видимо имеет в виду метод "временнЫх ворот", т.е. подсчет числа импульсов за определенный интервал времени. Ну, так во всех методах делается. Весь вопрос в том и состоит, подсчёт числа КАКИХ импульсов производится и КАК формируется интервал времени измерения. Спасибо за ответ, но хотелось бы услышать мнение Богдана(:-). Это временнОе разрешение такое получается, а точность измерения несколько похуже. Сейчас опять будут недопонимания(:-). Дайте определение временного разрешения и точности измерения. То что я привёл, это максимальная погрешность однократного измерения (с 1 с интервалом измерения и без учета погрешности опорной частоты 16 МГц). Реальная погрешность, вгрубе, будет ниже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 9 апреля, 2007 Опубликовано 9 апреля, 2007 · Жалоба Положим, пост #2 - это пост не автора, а rezident'a. Кто частоту применяет, тот пусть и смущается, сам я стараюсь не выходить за пределы технических спецификаций на прибор. Нет, это не пост резидента. Это пост автора ветки, где автор вероятно случайно не там поставил закрывающий таг цитаты. Резидент такое не писал. Для того чтобы в этом убедиться, достаточно прочитать (предшествующие коменту #2) коменты 0 и 1. Ну да ладно, не мне вас учить внимательности. А вы упускаете тот весьма значительный факт, что прерываний всего ШЕСТЬ, три в начале измерения, и три в конце измерения, и между ними промежуток в ОДНУ секунду. Ну и кто там захлебнётся, и чем? ?! Что это вы собрались так мерять? :) Однако, хорош метод для генерации случайных чисел! Ну почему, данную задачу можно легко реализовать на си, и даже под какой-нибудь осью, всё зависит от постановки задачи. А на ассемблере всё уместится в 150 байт кода, особо не напрягаясь. Один час работы. Ок, в таком случае программа для измерения частоты ОДНОГО входного сигнала 170khz с точностью не хуже 2Гц займет для вас около 20-ти минут (сопоставимо с временем написания одного комента в форуме). Если Вы умеете не только трепаться языком, то с любопытством жду от вас пример программы для измерения частоты ОДНОГО входного сигнала 170khz с точностью не хуже 2Гц с использованием Capture Unit. И когда будет готов пример программы, мы сможем обсудить его преимущества и недостатки. Thanks. То что я привёл, это максимальная погрешность однократного измерения (с 1 с интервалом измерения и без учета погрешности опорной частоты 16 МГц). Реальная погрешность, вгрубе, будет ниже. То что вы привели в простонародье называтся "трепом". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться