ps1x 0 23 июня, 2010 Опубликовано 23 июня, 2010 · Жалоба Ну что, ps1x, есть подвижки? В принципе, я нашёл решение для си, надо проверить... Да, вместо использования компаратора я сделал усилитель на 2 транзисторах. Изготовил плату и спаял :) А вот по программе пока не продвигался :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 24 июня, 2010 Опубликовано 24 июня, 2010 · Жалоба Попробуйте следующий код, для ваших целей должен подойти ISR (TIMER0_OVF_vect) //переполнение входных тиков { mover++; //учтём в mover } ISR (TIMER1_OVF_vect) //переполнение таймера1 { nover++; //учтём в nover } int main(void) { TIMSK=(1<<TOIE1)|(1<<TOIE0); //разрешим TOV1 и TOV0 asm volatile("sei\n\t"::); //разрешим прерывания while(1) //непрерывное измерение частоты { TIMSK &=~_BV(TOIE1); //запретим прерывания TOV1 do { if(TIFR &_BV(TOV1)) //при появлении { //переполнения поправим nover++; //старшее слово TIFR =_BV(TOV1); //и сбросим TOV1 } } while((TIFR&_BV(TOV1))==0); //ждём начала измерения ntick1=ICR1; //запомним ICR1 ntick2=nover; //и старшую часть if(TIFR &_BV(TOV1)) { nover++; TIFR =_BV(TOV1); //сбросим TOV1 if(ntick1<0x8000) ntick2=nover; } TIFR=(1<<ICF1); //сбросим флаг захвата TIMSK |=_BV(TOIE1); //разрешим прерывания TOV1 mtick1=TCNT0; //запомним TCNT0 mtick2=mover&0x00FF; //и старшую часть N1=((uint32_t)(ntick2)<<16)+(uint32_t) ntick1; //системные тики M1=((uint32_t)(mtick2)<<8) +(uint32_t) mtick1; //входные тики delay_ms(1000); //задержка на 1 с TIMSK &=~_BV(TOIE1); //запретим прерывания TOV1 do { if(TIFR &_BV(TOV1)) //при появлении { //переполнения поправим nover++; //старшее слово TIFR =_BV(TOV1); //и сбросим TOV1 } } while((TIFR&_BV(TOV1))==0); //ждём конечного захвата ntick1=ICR1; //запомним ICR1 ntick2=nover; //и старшую часть if(TIFR &_BV(TOV1)) { nover++; TIFR =_BV(TOV1); //сбросим TOV1 if(ntick1<0x8000) ntick2=nover; } TIFR=(1<<ICF1); //сбросим флаг захвата TIMSK |=_BV(TOIE1); //разрешим прерывания TOV1 mtick1=TCNT0; //запомним TCNT0 mtick2=mover&0x00FF; //и старшую часть N2=((uint32_t)(ntick2)<<16)+(uint32_t) ntick1; //системные тики M2=((uint32_t)(mtick2)<<8) +(uint32_t) mtick1; //входные тики N=N2-N1; //системные тики за время измерения M=M2-M1; //входные тики за время измерения Fx=12000000.0*(float)M/(float)N; //вычисление частоты сигнала // <<код вывода на индикатор>> } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ps1x 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Работает прекрасно :) +/- 0.0001 мкС Большущее спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба На здоровье. Но 0,0001 мкс - это 0,1 нс, вы не ошиблись? Меня ваш проект заинтересовал постольку, поскольку он написан на си (который я местами недолюбливаю :-), а на форуме было много вопросов, как реализовать мой алгоритм именно на си, но что-то все кодеры пропадали, не дойдя до конечного результата. Теперь одна из реализаций налицо, буду на неё ссылаться при случае :-). Ещё, интересно было бы выяснить, какую максимальную частоту вы сможете измерить без переделки программы? С небольшими изменениями вы можете мерить до половины тактовой, в вашем случае до 6 МГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба На здоровье.Простите, что вклиниваюсь, но возникает у меня вопросик. А что будет с прибором, когда частота очень низкая или её нет вовсе? Может я что не понял, но в коде есть "бесконечные" циклы, ожидающие события от периферии... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Простите, что вклиниваюсь, но возникает у меня вопросик. А что будет с прибором, когда частота очень низкая или её нет вовсе? Может я что не понял, но в коде есть "бесконечные" циклы, ожидающие события от периферии... Я уж испугался, что будет вопросик про Балеру или, того хуже, про прачечную :-). Это у вас с переездом связано, что ли? 1) У автора стоит автогенератор, вырабатывающий частоты в диапазоне 2-10 кГц, так что частота должна быть. 2) С другой стороны, если нет частоты, то вроде бы нечего отображать. 3) Однако, вы абсолютно правы в том, что данная программа имеет некоторые ограничения (как и всё в этом мире, впрочем). В программе нет модуля оценки входной частоты, просто в данном топике задача была не представить полностью коммерческий продукт, а немного другая, именно - написать программу на си для измерения частоты с минимальной погрешностью. Код программы открыт, так что, кому надо могут модифицировать его под себя. Задача в основном достигнута, 1000 Гц измеряются с СЕМЬЮ верными цифрами. Кстати, методом ворот можно достичь только ТРИ значащие цифры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ps1x 0 26 июня, 2010 Опубликовано 26 июня, 2010 · Жалоба Но 0,0001 мкс - это 0,1 нс, вы не ошиблись? Наверное ошибся. +/-0.0001 Гц было точно при частоте ~1018 гц Ещё, интересно было бы выяснить, какую максимальную частоту вы сможете измерить без переделки программы? С небольшими изменениями вы можете мерить до половины тактовой, в вашем случае до 6 МГц. Завтра попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 27 июня, 2010 Опубликовано 27 июня, 2010 · Жалоба Я уж испугался, что будет вопросик про Балеру или, того хуже, про прачечную :-). Это у вас с переездом связано, что ли?Да нет:-) Разработчики пока на старом месте останутся. 1) У автора стоит автогенератор, вырабатывающий частоты в диапазоне 2-10 кГц, так что частота должна быть. 2) С другой стороны, если нет частоты, то вроде бы нечего отображать. 3) Однако, вы абсолютно правы в том, что данная программа имеет некоторые ограничения (как и всё в этом мире, впрочем). В программе нет модуля оценки входной частоты, просто в данном топике задача была не представить полностью коммерческий продукт, а немного другая, именно - написать программу на си для измерения частоты с минимальной погрешностью. Код программы открыт, так что, кому надо могут модифицировать его под себя. Задача в основном достигнута, 1000 Гц измеряются с СЕМЬЮ верными цифрами. Кстати, методом ворот можно достичь только ТРИ значащие цифры. Понятно. Но я вижу лёгкое неудобство в том что надо детектировать наличие частоты. Я в своём тахометре работаю по двум алгоритмам и когда надо перехожу с одного на другой. Но как всегда есть одно но. Хочется повысить быстродействие измерительного канала и при этом не потерять в точности, вот я и приглядываюсь к Вашему методу. Пока лишь смотрю, т.к. сразу не вижу простого и красивого способа его применить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 28 июня, 2010 Опубликовано 28 июня, 2010 · Жалоба 1) В чём конкретно вы видите лёгкое неудобство от детектирования? 2) Так всё таинственно, ну расскажите, что за алгоритмы... 3) Не знаю, что вы понимаете под красиво и легко, но посмотрел вполглаза на паспорт вашего тахометра, и увидел, что ваша "детская" погрешность в 1 Гц для 1000 Гц моим методом может быть легко превышена за время измерения 0,001 с (с погрешностью не более +-0,1 Гц). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 28 июня, 2010 Опубликовано 28 июня, 2010 · Жалоба 1) В чём конкретно вы видите лёгкое неудобство от детектирования? Теряется единообразие для быстрых и медленных частот (у меня же от 0,001Гц индикация работает). Да и со свободными таймерами могут быть напряги. Надо попробовать т.к это лишь предположения:-) 2) Так всё таинственно, ну расскажите, что за алгоритмы... Считаю либо кол-во импульсов за секунду, либо интервалы между импульсами, а переключаюсь по условию наименьшей погрешности измерения. 3) Не знаю, что вы понимаете под красиво и легко, но посмотрел вполглаза на паспорт вашего тахометра, и увидел, что ваша "детская" погрешность в 1 Гц для 1000 Гц моим методом может быть легко превышена за время измерения 0,001 с (с погрешностью не более +-0,1 Гц).При этом имеем динамическую индикацию и клавиатуру, modbus до 921.6КБод, DAC, счётчик импульсов и счётчик времени наработки, внешние логические входы-выходы и ещё всякого разного функционала немало наберётся, да и бутлоадер отъедает часть флеша. Я не спорю, что можно лучше, я даже уверен в этом. Но ресурсов контроллера уже особо не хватает на сильный импрувмент:-( Приборчик то старенький уже, сейчас бы на кортексе делал а не на 16 (162)-ой меге. Вот я и примеряюсь, обдумываю неспешно, т.к. текущий проект много сил требует... Как вспомню, сколько нервов истратил на его сертификацию в Морском регистре, уууу.... то дисплей им с регулировкой яркости подавай, то корпус горючий, то питание =24В с нехилым гистерезисом и все эти требования постепенно выдают ведь собаки такие:-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 28 июня, 2010 Опубликовано 28 июня, 2010 · Жалоба Теряется единообразие для быстрых и медленных частот (у меня же от 0,001Гц индикация работает) Ну, это вы ещё не прочувствовали мой алгоритм, в этом плане он универсальный. Можно или задаться числом периодов M=1, когда измеряете период длинного импульса, близкого к интервалу наблюдения, или целое число периодов М>1, также близкого к интервалу наблюдения, когда измеряете более короткие импульсы. Вся прелесть метода в том, что погрешность измерения минимальна всегда, невзирая на номинал входной частоты, поэтому не надо переключаться с одного алгоритма на другой, полное "единообразие" по-вашему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ps1x 0 3 ноября, 2010 Опубликовано 3 ноября, 2010 · Жалоба Пожалуй, подниму тему из глубин форума. Встала задача измерять 2 сигнала 2-10кГц. Судя по всему нужно подключать датчики и считать по очереди. Достаточно ли для этого транзистора на каждый вход, базой соединенных с выводами МК, которые и будут определять подключенный вход? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
akl 0 3 ноября, 2010 Опубликовано 3 ноября, 2010 · Жалоба В mega8 есть аналоговый компаратор, имеющий доступ к модулю CAPT таймера1 и непосредственно вход ICP1. Переключаясь программно между двумя режимами работы таймера, можно измерить обе частоты. ...Можно или задаться числом периодов M=1, когда измеряете период длинного импульса, близкого к интервалу наблюдения, или целое число периодов М>1, также близкого к интервалу наблюдения, когда измеряете более короткие импульсы. Вся прелесть метода в том, что ... Задаваться числом М можно, но ведь заранее неизвестно, какой сигнал придет, а вот подсчитать целые числа M и N за выбранный примерно интервал измерения - запросто. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ps1x 0 3 ноября, 2010 Опубликовано 3 ноября, 2010 · Жалоба В mega8 есть аналоговый компаратор, имеющий доступ к модулю CAPT таймера1 и непосредственно вход ICP1. Переключаясь программно между двумя режимами работы таймера, можно измерить обе частоты. Мне тут умные люди подсказали что при измерении двух струн собственно измерения должны проводиться одновременно. В таком случае может использовать T0 и T1 входы таймеров а подключать их программно через транзистор? без ICP... А на входе поставить внешний компаратор, например lm339n. ps. А вот и GM! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
akl 0 3 ноября, 2010 Опубликовано 3 ноября, 2010 · Жалоба Судя по всему нужно подключать датчики и считать по очереди.Я исходил из этого. По новой вводной можно сказать -если две струны это составляющие одного преобразователя -если они возбуждаются индивидуальными автогенераторами, причем исключена возможность их взаимосинхронизации -если будут учтены различия в работе Т0 и Т1, то, наверно, можно. ИМХО, я бы, в таком случае, поставил две ATtiny2313 с тактированием от одного кварцевого генератора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться