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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Форум Picbasic.ru » Скорая помощь начинающим » Помощь в вопросах программирования » алгоритм
алгоритм
contra Дата: Вс, 03.06.2012, 09:53  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 0   ±
Замечания:   ±
На сайте с 27.06.2009

Статус: Offline

Всем привет! пытаюсь написать программу для частотомера, но натолкнулся на на то, что, для подсчёта импульсов на высоких ( выше 10кгц)
нужен делитель частоты, но и он оказывается бесполезным на частотах более 100кгц. Вот и хотелось бы узнать, как это делается правильно.
А точнее сказать, хочется узнать алгоритм частотомера (до 1MHz)
ЯНДЕКС Дата: 03.06.2012
ivan_fd Дата: Вс, 03.06.2012, 11:25  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Частотомеров на PIC в сети полно. Без всяких предделителей PIC может считать ~ до 50МГц.
Ставите, например на таймер 1 синхронизацию по внешнему сигнгалу, и на вход синхронизации подаете
сигнал вашего сигнала.
contra Дата: Вс, 03.06.2012, 13:12  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 0   ±
Замечания:   ±
На сайте с 27.06.2009

Статус: Offline

Quote (ivan_fd)
Ставите, например на таймер 1 синхронизацию по внешнему сигнгалу, и на вход синхронизации подаете
сигнал вашего сигнала.

Сделал как вы посоветовали, но всё равно на частотах выше 20кгц считает не верно.
Посмотрите пожалуйста на мою прогу, что у меня не так?
Прикрепления: counter123.bas (2.4 Kb)

Сообщение отредактировал contra - Вс, 03.06.2012, 13:15
retas Дата: Вс, 03.06.2012, 14:17  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 447
Репутация: 11   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

Попробуйте увеличить Xtal.
contra Дата: Вс, 03.06.2012, 18:19  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 0   ±
Замечания:   ±
На сайте с 27.06.2009

Статус: Offline

Xtal увеличивал до 10 и до 20, но проблема осталась. Вот файл в Протеусе:
Прикрепления: count123.dsn (88.0 Kb)

Сообщение отредактировал contra - Вс, 03.06.2012, 18:32
ADMIN Дата: Вс, 03.06.2012, 19:24  |                                                                                                                Сообщение # 6
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

В принципе, все работает. Единственное, что я заметил - в справке написано:
"With a 4MHz oscillator, the pin is checked every 20us, and every 4us with a 20MHz oscillator.
From this we can determine that the highest frequency of pulses that may be counted is: -
25KHz using a 4MHz oscillator.
125KHz using a 20MHz oscillator"
То есть, максимальная частота, при 20МГц осцилляторе - 125 кГц. Но, в то же время - не указано, что максимум, что можно использовать - переменную типа Word. Чтобы считал на высоких частотах - нужно уменьшить время, за которое, собственно, не успеет переполниться эта переменная. Таким образом:

Dim cnt as word (хоть float пиши - эффект будет один)
Dim Freq as dword
cnt = counter, portb.0 , 100 - а здесь считай за 100 мсек
а потом умножай на 10:
Freq = cnt*10
Но в этом случае теряется точность измерения.
Прикрепления: freq.rar (49.7 Kb)
contra Дата: Вс, 03.06.2012, 20:31  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 0   ±
Замечания:   ±
На сайте с 27.06.2009

Статус: Offline

Quote (ivan_fd)
Без всяких предделителей PIC может считать ~ до 50МГц.

Как добиться такого результата?
ivan_fd Дата: Вс, 03.06.2012, 22:06  |                                                                                                                Сообщение # 8
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

При чем здесь оператор Counter? Я же вам написал, что подаете сигнал на ногу внешней тактовой таймера. Таймер начинает считать с частотой которую подаете на него. Считаете, например 1 сек., потом смотрите, что натикало в таймере, и пересчитываете в частоту.

Если хотите примеры, могу дать, но они на ассемблере.
contra Дата: Вт, 05.06.2012, 22:09  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 0   ±
Замечания:   ±
На сайте с 27.06.2009

Статус: Offline

Quote (ivan_fd)
Считаете, например 1 сек., потом смотрите, что натикало в таймере, и пересчитываете в частоту.

Если я правильно понял, то , нужно использовать прерывания?
А как задать период счёта равным 1 сек? и можно ли TMR1L использовать как DWord?
ivan_fd Дата: Вт, 05.06.2012, 22:39  |                                                                                                                Сообщение # 10
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (contra)
А как задать период счёта равным 1 сек?


Можно, например, на АСМе сделать точную задержку.

Quote (contra)
и можно ли TMR1L использовать как DWord?


Я думаю, можно.
contra Дата: Вт, 05.06.2012, 22:55  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 0   ±
Замечания:   ±
На сайте с 27.06.2009

Статус: Offline

Quote (ivan_fd)
Можно, например, на АСМе сделать точную задержку.

Особой точности не требуется т.к. всё это для понимания процесса, поэтому подскажите, пожалуйста, про задержку на Протоне
Quote (contra)
Если я правильно понял, то , нужно использовать прерывания?

два дня ломал мозг, и пришёл к такому выводу,( про прерывания) интересно - не ошибся ли?
ЯНДЕКС Дата: 05.06.2012
ivan_fd Дата: Вт, 05.06.2012, 23:23  |                                                                                                                Сообщение # 12
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

В создании частотомера, как раз и нужна точность.

Можно обойтись и без прерываний.

Алгоритм приблизительно такой:

1. Делаем для Таймер1 внешний тактовый сигнал.
2. Обнуляем таймер.
3. Включаем его.
4. Делаем точную задержку, например 1 сек.
5. После задержки, выключаем таймер.
6. Смотрим, было ли переполнение таймера. Если было (частота выше), значит нужно измерять меньше времени, например 100 мс.
7. Далее переводим наши данные с таймера в частоту.

Я не говорю, что это правильный алгоритм, но для пробы пойдет.
contra Дата: Ср, 06.06.2012, 19:43  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 0   ±
Замечания:   ±
На сайте с 27.06.2009

Статус: Offline

ivan_fd, спасибо за помощь, начинает понемногу доходить (по правде сказать, тяжело даётся). Но вот уперся в стену - не могу понять как читается TMR1? ведь, нужно считывать оба байта, а как это сделать не знаю. В даташите ничего не понял. И второй вопрос: можно ли использовать
TMR0 для задержки, например так:
TMR0 = 156
if TMR0 = 256 then ' если таймер переполнился то:
freq = TMR1L ' присвоить переменной freq значение TMR1
получится ли, при таком коде, задержка на 100ms?

Сообщение отредактировал contra - Ср, 06.06.2012, 19:50
ivan_fd Дата: Чт, 07.06.2012, 00:21  |                                                                                                                Сообщение # 14
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Так как Вы написали не есть хорошо. Это будет зависеть он кварца. Сделайте задержку на АСМЕ, для этого здесь
на сайте есть программа для расчета задержек.
Вот она.
Прикрепления: PicDelay.zip (41.5 Kb)
contra Дата: Чт, 07.06.2012, 17:01  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 0   ±
Замечания:   ±
На сайте с 27.06.2009

Статус: Offline

ivan_fdБ спасибо, программу скачал, буду юзать, и вопрос по поводу чтения TMR1 не пойму как происходит чтение сразу из двух байтов
(TMR1L и TMR1H)? пробовал так:
f = TMR1L.Word
f = TMR1H.Word
freq = f
но у меня не получается, на высоких частотах счётчик опять считает неправильно
Форум Picbasic.ru » Скорая помощь начинающим » Помощь в вопросах программирования » алгоритм
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: