алгоритм
|
|
contra |
Дата: Вс, 03.06.2012, 09:53 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.06.2009
Статус:
Offline
|
Всем привет! пытаюсь написать программу для частотомера, но натолкнулся на на то, что, для подсчёта импульсов на высоких ( выше 10кгц) нужен делитель частоты, но и он оказывается бесполезным на частотах более 100кгц. Вот и хотелось бы узнать, как это делается правильно. А точнее сказать, хочется узнать алгоритм частотомера (до 1MHz)
|
|
|
|
ivan_fd |
Дата: Вс, 03.06.2012, 11:25 | Сообщение # 2 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Частотомеров на PIC в сети полно. Без всяких предделителей PIC может считать ~ до 50МГц. Ставите, например на таймер 1 синхронизацию по внешнему сигнгалу, и на вход синхронизации подаете сигнал вашего сигнала.
|
|
|
|
contra |
Дата: Вс, 03.06.2012, 13:12 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.06.2009
Статус:
Offline
|
Quote (ivan_fd) Ставите, например на таймер 1 синхронизацию по внешнему сигнгалу, и на вход синхронизации подаете сигнал вашего сигнала. Сделал как вы посоветовали, но всё равно на частотах выше 20кгц считает не верно. Посмотрите пожалуйста на мою прогу, что у меня не так?
Сообщение отредактировал
contra - Вс, 03.06.2012, 13:15
|
|
|
|
retas |
Дата: Вс, 03.06.2012, 14:17 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
Попробуйте увеличить Xtal.
|
|
|
|
contra |
Дата: Вс, 03.06.2012, 18:19 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.06.2009
Статус:
Offline
|
Xtal увеличивал до 10 и до 20, но проблема осталась. Вот файл в Протеусе:
Сообщение отредактировал
contra - Вс, 03.06.2012, 18:32
|
|
|
|
ADMIN |
Дата: Вс, 03.06.2012, 19:24 | Сообщение # 6 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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 Но в этом случае теряется точность измерения.
|
|
|
|
contra |
Дата: Вс, 03.06.2012, 20:31 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.06.2009
Статус:
Offline
|
Quote (ivan_fd) Без всяких предделителей PIC может считать ~ до 50МГц. Как добиться такого результата?
|
|
|
|
ivan_fd |
Дата: Вс, 03.06.2012, 22:06 | Сообщение # 8 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
При чем здесь оператор Counter? Я же вам написал, что подаете сигнал на ногу внешней тактовой таймера. Таймер начинает считать с частотой которую подаете на него. Считаете, например 1 сек., потом смотрите, что натикало в таймере, и пересчитываете в частоту.
Если хотите примеры, могу дать, но они на ассемблере.
|
|
|
|
contra |
Дата: Вт, 05.06.2012, 22:09 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.06.2009
Статус:
Offline
|
Quote (ivan_fd) Считаете, например 1 сек., потом смотрите, что натикало в таймере, и пересчитываете в частоту. Если я правильно понял, то , нужно использовать прерывания? А как задать период счёта равным 1 сек? и можно ли TMR1L использовать как DWord?
|
|
|
|
ivan_fd |
Дата: Вт, 05.06.2012, 22:39 | Сообщение # 10 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Quote (contra) А как задать период счёта равным 1 сек?
Можно, например, на АСМе сделать точную задержку.
Quote (contra) и можно ли TMR1L использовать как DWord?
Я думаю, можно.
|
|
|
|
contra |
Дата: Вт, 05.06.2012, 22:55 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.06.2009
Статус:
Offline
|
Quote (ivan_fd) Можно, например, на АСМе сделать точную задержку. Особой точности не требуется т.к. всё это для понимания процесса, поэтому подскажите, пожалуйста, про задержку на Протоне Quote (contra) Если я правильно понял, то , нужно использовать прерывания? два дня ломал мозг, и пришёл к такому выводу,( про прерывания) интересно - не ошибся ли?
|
|
|
|
ivan_fd |
Дата: Вт, 05.06.2012, 23:23 | Сообщение # 12 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
В создании частотомера, как раз и нужна точность.
Можно обойтись и без прерываний.
Алгоритм приблизительно такой:
1. Делаем для Таймер1 внешний тактовый сигнал. 2. Обнуляем таймер. 3. Включаем его. 4. Делаем точную задержку, например 1 сек. 5. После задержки, выключаем таймер. 6. Смотрим, было ли переполнение таймера. Если было (частота выше), значит нужно измерять меньше времени, например 100 мс. 7. Далее переводим наши данные с таймера в частоту.
Я не говорю, что это правильный алгоритм, но для пробы пойдет.
|
|
|
|
contra |
Дата: Ср, 06.06.2012, 19:43 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Так как Вы написали не есть хорошо. Это будет зависеть он кварца. Сделайте задержку на АСМЕ, для этого здесь на сайте есть программа для расчета задержек. Вот она.
|
|
|
|
contra |
Дата: Чт, 07.06.2012, 17:01 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.06.2009
Статус:
Offline
|
ivan_fdБ спасибо, программу скачал, буду юзать, и вопрос по поводу чтения TMR1 не пойму как происходит чтение сразу из двух байтов (TMR1L и TMR1H)? пробовал так: f = TMR1L.Word f = TMR1H.Word freq = f но у меня не получается, на высоких частотах счётчик опять считает неправильно
|
|
|
|