Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Форум Picbasic.ru » Скорая помощь начинающим » Помощь в вопросах программирования » алгоритм
алгоритм
DAlexV Дата: Чт, 05.07.2012, 00:29  |                                                                                                                Сообщение # 31
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

http://atlab.narod.ru/articles/particle7.htm
Самый быстрый вариант, да и работает четко, проверил. Для измерения малых частот считаем переполнение таймера


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
ЯНДЕКС Дата: 05.07.2012
ivan_fd Дата: Чт, 05.07.2012, 10:24  |                                                                                                                Сообщение # 32
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Я уже говорил, но скажу еще раз.

Какой кварц Вы ставите не имеет особого значения, вот Вам пример с кварцем 4МГц, меряет
15МГц без проблем. Пусть не супер точно, но суть понятна.



Прикрепления: 9498739.zip (56.3 Kb)

Сообщение отредактировал ivan_fd - Чт, 05.07.2012, 10:41
доцент2 Дата: Чт, 05.07.2012, 19:15  |                                                                                                                Сообщение # 33
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 447
Репутация: 11   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

Вот так штука!
ivan_fd предложил прекрасный метод измерения, но не заакцентировал что измеряемую частоту он
подаёт програмно на Timer1, т.е. таймер у него считает не импульсы внутреннего осцилятора МК а внешнего
генератора.
доцент2 Дата: Вс, 08.07.2012, 11:45  |                                                                                                                Сообщение # 35
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

помогите разобраться с построением тахометра.
нашел в инете статью про тахометр для вертилятора.
принцип расчета оборотов понятен, но к сожалению не могу понять как это сделать!
смысл такой (pic16f628a).
1. на вход RA4 (TOCKI) подается сигнал с датчика оборотов.
2. включаем внутренний генератор.
3. за период следования входного сигнала надо подсчитать кол-во импульсов внутреннего генератора следующих с заданным периодом.

всю голову сломал не могу понять как это сделать. помогите!!!!!!!!!
Прикрепления: ___.docx (90.7 Kb) · 3955009.jpg (28.7 Kb) · __1.rar (48.4 Kb)

Сообщение отредактировал доцент2 - Вс, 08.07.2012, 11:47
DAlexV Дата: Вс, 08.07.2012, 16:54  |                                                                                                                Сообщение # 36
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Делал немного иначе. 1 вход с прерыванием по фронту(или спаду)+ 1 таймер. Таймер (делитель) настраиваешь в зависимости от измеряемой частоты. В прерывании по входу запоминаешь значение таймера, после чего его сбрасываешь. Уже вне прерывания делаешь умножение кол-ва тиков таймера на время его тика, получаешь длительность импульса(период). Далее частота=1/период. Если произошло прерывание по переполнению таймера, значит обороты низкие(хотя переполнение можно использовать для измерения более низких оборотов, но мне это не требовалось). Прикрепил архив. В нем схема, программа (SwordFish) и Cof для связки с Proteus-ом. Можно пошагово наблюдать за происходящим. Кол-во импульсов за 1 оборот = 4. Удачи wink
Прикрепления: Gen_1320.rar (74.6 Kb)


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
доцент2 Дата: Вс, 08.07.2012, 22:01  |                                                                                                                Сообщение # 37
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

спасибо за ответ, но!
привведенный пример в протеусе показывает крякозябру, в протоне тоже ерунде какая-то, не компелируется.
прерывание по фронту на кокой вход пускать, +1 таймер - это что (1+TMR0 или TMR1)?
какой таймер использовать (их в pic16f628a три штуки).
мягко говоря не совсем понятно!
если можно разложить по азам как осуществить измерение частоты, на протоне, по схеме на рисунке.

я не профи поэтому если можно по проще.
Прикрепления: 3285751.jpg (28.7 Kb)

Сообщение отредактировал доцент2 - Вс, 08.07.2012, 22:04
DAlexV Дата: Вс, 08.07.2012, 23:13  |                                                                                                                Сообщение # 38
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

DALexV - использовал ваш алгаритм и еще в инете нарыл немного, получилось вот это.
считать к сожалению не хочет, подскажите в чем я ошибся!
Прикрепления: 8159838.rar (74.9 Kb)
DAlexV Дата: Ср, 11.07.2012, 00:58  |                                                                                                                Сообщение # 40
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Пришлось ставить Протон sad Прикрепил подправленный файл, алгоритм работает. Добавил 4-х строчный дисплей для вывода большей служебной информации. Так же можно посмотреть пошагово как работает программа. Добавил окно наблюдения, окно регистров и расставил точки останова в нужных местах. Советую поиграть с частотой кварца(чем выше, тем точнее будет мерить), не забыв исправлять коэффициенты умножения. Удачи wink
Прикрепления: 5090896.rar (78.3 Kb)


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
доцент2 Дата: Чт, 12.07.2012, 00:14  |                                                                                                                Сообщение # 41
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Спасибо, ошибку понял. Сейчас в протоне считает нормально (+/- 1..3 об/мин при 460...10000 об/мин) будет время опробую в железе.
В случае превышения пределов для переменной таймера (65536), т.е. при малых оборотах пока не могу подобрать формулу для расчета.
Например: кол-во тиков таймера за период по входу 75000, т.е. таймер переполниться, обнулиться и покажет 9464.
как привести измерения к нормальному значению пока для меня вопрос.

Сообщение отредактировал доцент2 - Чт, 12.07.2012, 00:20
ЯНДЕКС Дата: 12.07.2012
DAlexV Дата: Чт, 12.07.2012, 10:24  |                                                                                                                Сообщение # 42
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Все просто. Время тиков таймера у нас 0.000001s допустим. Таймер 16 разрядный $FFFF(65535). $FFFF(65535)*0.000001=0,065535s - это время переполнения, далее его умножаем на количество переполнений и плюсуем к нашей формуле

CHASTOTA=1/((CHETTMR1*0.000001)+(PERIOD*0.065535))

Успехов wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
доцент2 Дата: Чт, 12.07.2012, 17:31  |                                                                                                                Сообщение # 43
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

действительно все просто (а я тут весь листок раскарябал в кракозябрах), попробую, спасибо!
хочу сделать на основе этого проекта измеритель угла опережения зажигания со стробоскопом на светодиоде.
1. появление искры на проводе свечи первого цилиндра - это прерывание по входу RB0 (INT), тот же измеритель частоты.
2. по прерыванию (INT) с задержкой появляется вспышка направленная на метку В.М.Т. расположенной на шкиве или маховике коленчатого вала.
Пока думаю как реализовать ругулируемую с кнопок +/- длительность задержки появления вспышки светодиода.
Может на ASM ввести в событие прерывания по входу задержку, например на 1мкс, и поставить ее в цикл, а кол-во повторений задавать из основной программы набирая нужный интервал.
Потом вычислить длительность полученной задержки и перевести ее в градусы.
Это предварительный план действий! возможно и неверный, если есть замечания поправте.
доцент2 Дата: Сб, 14.07.2012, 21:48  |                                                                                                                Сообщение # 44
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

попробовал добавить стробоскоп к тахометру вот что получилось.

только возникает ряд вопросов:
1. почему-то не могу задать переменной u начальное значение, например 20. при запуске она все равно равна 0.
Cls
u=20
основная программа
..........
2. правильно ли выбран способ задержки?
3. как засветить светодиод на определенное время, а потом погасить его (без цепочек типа RC)?
у меня он "зажигается" почти в нужное время (небольшое отклонение в задержке), затем он должен работать какое-то
время, а потом погаснуть. Попробовал поставить второй блок задержки на Asm, но компилятор ругается. Оператор паузы приводит к нарушению измерения.

надеюсь на подсказку.
Прикрепления: -__1_8.rar (74.8 Kb)
retas Дата: Вс, 15.07.2012, 13:43  |                                                                                                                Сообщение # 45
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 447
Репутация: 11   ±
Замечания:   ±
На сайте с 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'.
Неприятность, в вынужденности делать задержку в прерывах, но раз уж она такая маленькая, то наверное не нагадит.
Форум Picbasic.ru » Скорая помощь начинающим » Помощь в вопросах программирования » алгоритм
  • Страница 3 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: