алгоритм
|
|
DAlexV |
Дата: Чт, 05.07.2012, 00:29 | Сообщение # 31 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
http://atlab.narod.ru/articles/particle7.htm Самый быстрый вариант, да и работает четко, проверил. Для измерения малых частот считаем переполнение таймера
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
ivan_fd |
Дата: Чт, 05.07.2012, 10:24 | Сообщение # 32 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Я уже говорил, но скажу еще раз.
Какой кварц Вы ставите не имеет особого значения, вот Вам пример с кварцем 4МГц, меряет 15МГц без проблем. Пусть не супер точно, но суть понятна.
Сообщение отредактировал
ivan_fd - Чт, 05.07.2012, 10:41
|
|
|
|
доцент2 |
Дата: Чт, 05.07.2012, 19:15 | Сообщение # 33 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
нормально работает только при установке предделителя 1:2, иначе врет ужасно. я так понимаю формулы учитывающей величину задержки, установку предделителя и т.д. нет и опять таки приходиться все подбирать методом тыка (хорошо есть протеус установил частоту... и подбирай форму расчета). к сожалению. как только установил предделитель 1:2 (спасибо ivan_fd за пример) заработало до 60МГц, с неточностью в 17кГц.
DAlexV спасибо за ссылочку изучу.
Сообщение отредактировал
доцент2 - Чт, 05.07.2012, 19:24
|
|
|
|
retas |
Дата: Чт, 05.07.2012, 19:28 | Сообщение # 34 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
Вот так штука! ivan_fd предложил прекрасный метод измерения, но не заакцентировал что измеряемую частоту он подаёт програмно на Timer1, т.е. таймер у него считает не импульсы внутреннего осцилятора МК а внешнего генератора.
|
|
|
|
доцент2 |
Дата: Вс, 08.07.2012, 11:45 | Сообщение # 35 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
помогите разобраться с построением тахометра. нашел в инете статью про тахометр для вертилятора. принцип расчета оборотов понятен, но к сожалению не могу понять как это сделать! смысл такой (pic16f628a). 1. на вход RA4 (TOCKI) подается сигнал с датчика оборотов. 2. включаем внутренний генератор. 3. за период следования входного сигнала надо подсчитать кол-во импульсов внутреннего генератора следующих с заданным периодом.
всю голову сломал не могу понять как это сделать. помогите!!!!!!!!!
Сообщение отредактировал
доцент2 - Вс, 08.07.2012, 11:47
|
|
|
|
DAlexV |
Дата: Вс, 08.07.2012, 16:54 | Сообщение # 36 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Делал немного иначе. 1 вход с прерыванием по фронту(или спаду)+ 1 таймер. Таймер (делитель) настраиваешь в зависимости от измеряемой частоты. В прерывании по входу запоминаешь значение таймера, после чего его сбрасываешь. Уже вне прерывания делаешь умножение кол-ва тиков таймера на время его тика, получаешь длительность импульса(период). Далее частота=1/период. Если произошло прерывание по переполнению таймера, значит обороты низкие(хотя переполнение можно использовать для измерения более низких оборотов, но мне это не требовалось). Прикрепил архив. В нем схема, программа (SwordFish) и Cof для связки с Proteus-ом. Можно пошагово наблюдать за происходящим. Кол-во импульсов за 1 оборот = 4. Удачи
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
доцент2 |
Дата: Вс, 08.07.2012, 22:01 | Сообщение # 37 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
спасибо за ответ, но! привведенный пример в протеусе показывает крякозябру, в протоне тоже ерунде какая-то, не компелируется. прерывание по фронту на кокой вход пускать, +1 таймер - это что (1+TMR0 или TMR1)? какой таймер использовать (их в pic16f628a три штуки). мягко говоря не совсем понятно! если можно разложить по азам как осуществить измерение частоты, на протоне, по схеме на рисунке.
я не профи поэтому если можно по проще.
Сообщение отредактировал
доцент2 - Вс, 08.07.2012, 22:04
|
|
|
|
DAlexV |
Дата: Вс, 08.07.2012, 23:13 | Сообщение # 38 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (доцент2) привведенный пример в протеусе показывает крякозябру Согласен, но если нажать на паузу, то можно будет пошагово посмотреть работу программы. Quote (доцент2) в протоне тоже ерунде какая-то, не компелируется Quote (доцент2) программа (SwordFish) И не будет, они несовместимы. Quote (доцент2) 1 вход с прерыванием по фронту Для 628 это RB0 вроде бы. Quote (доцент2) какой таймер использовать (их в pic16f628a три штуки) Любой свободный, 16 разрядный предпочтительнее(точнее мерить будет) Quote (доцент2) если можно разложить по азам как осуществить измерение частоты, на протоне, по схеме на рисунке Судя по статье в которой использовался вход RA2 для 16f630 это и есть вход INT На Протоне точно не помогу, не умею я на нем готовить, а принцип я уже описывал выше. Советую пройтись пошагово по программе в Протеусе выставив точки останова на непонятных местах, будут вопросы, пишите, помогу по возможности.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
доцент2 |
Дата: Вт, 10.07.2012, 17:50 | Сообщение # 39 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
DALexV - использовал ваш алгаритм и еще в инете нарыл немного, получилось вот это. считать к сожалению не хочет, подскажите в чем я ошибся!
|
|
|
|
DAlexV |
Дата: Ср, 11.07.2012, 00:58 | Сообщение # 40 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Пришлось ставить Протон Прикрепил подправленный файл, алгоритм работает. Добавил 4-х строчный дисплей для вывода большей служебной информации. Так же можно посмотреть пошагово как работает программа. Добавил окно наблюдения, окно регистров и расставил точки останова в нужных местах. Советую поиграть с частотой кварца(чем выше, тем точнее будет мерить), не забыв исправлять коэффициенты умножения. Удачи
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
доцент2 |
Дата: Чт, 12.07.2012, 00:14 | Сообщение # 41 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Спасибо, ошибку понял. Сейчас в протоне считает нормально (+/- 1..3 об/мин при 460...10000 об/мин) будет время опробую в железе. В случае превышения пределов для переменной таймера (65536), т.е. при малых оборотах пока не могу подобрать формулу для расчета. Например: кол-во тиков таймера за период по входу 75000, т.е. таймер переполниться, обнулиться и покажет 9464. как привести измерения к нормальному значению пока для меня вопрос.
Сообщение отредактировал
доцент2 - Чт, 12.07.2012, 00:20
|
|
|
|
DAlexV |
Дата: Чт, 12.07.2012, 10:24 | Сообщение # 42 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Все просто. Время тиков таймера у нас 0.000001s допустим. Таймер 16 разрядный $FFFF(65535). $FFFF(65535)*0.000001=0,065535s - это время переполнения, далее его умножаем на количество переполнений и плюсуем к нашей формуле
CHASTOTA=1/((CHETTMR1*0.000001)+(PERIOD*0.065535))
Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
доцент2 |
Дата: Чт, 12.07.2012, 17:31 | Сообщение # 43 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
действительно все просто (а я тут весь листок раскарябал в кракозябрах), попробую, спасибо! хочу сделать на основе этого проекта измеритель угла опережения зажигания со стробоскопом на светодиоде. 1. появление искры на проводе свечи первого цилиндра - это прерывание по входу RB0 (INT), тот же измеритель частоты. 2. по прерыванию (INT) с задержкой появляется вспышка направленная на метку В.М.Т. расположенной на шкиве или маховике коленчатого вала. Пока думаю как реализовать ругулируемую с кнопок +/- длительность задержки появления вспышки светодиода. Может на ASM ввести в событие прерывания по входу задержку, например на 1мкс, и поставить ее в цикл, а кол-во повторений задавать из основной программы набирая нужный интервал. Потом вычислить длительность полученной задержки и перевести ее в градусы. Это предварительный план действий! возможно и неверный, если есть замечания поправте.
|
|
|
|
доцент2 |
Дата: Сб, 14.07.2012, 21:48 | Сообщение # 44 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
попробовал добавить стробоскоп к тахометру вот что получилось.
только возникает ряд вопросов: 1. почему-то не могу задать переменной u начальное значение, например 20. при запуске она все равно равна 0. Cls u=20 основная программа .......... 2. правильно ли выбран способ задержки? 3. как засветить светодиод на определенное время, а потом погасить его (без цепочек типа RC)? у меня он "зажигается" почти в нужное время (небольшое отклонение в задержке), затем он должен работать какое-то время, а потом погаснуть. Попробовал поставить второй блок задержки на Asm, но компилятор ругается. Оператор паузы приводит к нарушению измерения.
надеюсь на подсказку.
|
|
|
|
retas |
Дата: Вс, 15.07.2012, 13:43 | Сообщение # 45 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
Как установить ноль на выходе с задержкой??? МК признаёт только нули и единицы и если дана команда что в какой то момент portX должен стать =0, то также потребуется команда чтоб он стал =1. Наверное можно поступить так: 1. Вместе с командой portX=0, делаете TimerX=0 и CntTimeraX(счетчик переполнений Timer'a)=0 2. При TimerX=0 должен срабатывать прерыв и +1 прибавляться в CntTimeraX. 3. При достижении CntTimeraX=Y(т.е. нужной вам задержки), делаете portX=1 - если требуется точная задержка, то эту процедуру нужно делать в прерывах. правильно ли выбран способ задержки? Главное здесь не применять Delay ибо он уже есть в основной вашей прогре, а на асм можете хоть 19 раз написать 'nop'. Неприятность, в вынужденности делать задержку в прерывах, но раз уж она такая маленькая, то наверное не нагадит.
|
|
|
|