Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: demanik  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Частотомер (скважность и прочее и прочее и прочее)
Частотомер
доцент2 Дата: Ср, 05.07.2017, 20:41  |                                                                                                                Сообщение # 31
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 433
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Добавлено (05.07.2017, 20:41)
---------------------------------------------
bulat, Вы не могли бы пояснить как работает Ваш расчет на пример при частоте 1кГц и 50МГц.
TMR1ON=1
Asm
; Задержка 400 машинных циклов
; Длительность задержки 400 микросекунд
; Частота задающего генератора 4 МГц
Movlw       .133
Movwf       Reg_1
delay       Decfsz      Reg_1,F
GoTo        delay
EndAsm

TMR1ON=0
a = TIMER1    ; измеряем за 400 микросекунд
a=a*1000         'столько ожидаем за 1 сек
a=a/65535       'и должен переполниться а раз

TIMER1 = 0
TMR1ON=1
Asm
; Задержка 400 000 машинных циклов
; Длительность задержки 400 миллисекунд
; Частота задающего генератора 4 МГц
Movlw       .119
Movwf       Reg_1
Movlw       .8
Movwf       Reg_2
Movlw       .3
Movwf       Reg_3
delay1       Decfsz      Reg_1,F
GoTo        delay1
Decfsz      Reg_2,F
GoTo        delay1
Decfsz      Reg_3,F
GoTo        delay1
EndAsm
TMR1ON=0
'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
j=65536*a
j=j+TIMER1
Print At 1, 1, "frequency:    "
b=j/100

Сообщение отредактировал доцент2 - Ср, 05.07.2017, 20:42
ЯНДЕКС Дата: 05.07.2017
доцент2 Дата: Вс, 23.07.2017, 13:42  |                                                                                                                Сообщение # 32
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 433
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

В ходе пыток TMR1 pic18f252 (pin11) получил частотомер (спасибо ivan_fd). Кварц мк 20МГц. Измеряет нормально.
Подскажите, можно ли с помощью данного входа измерить длительность импульса и паузы (в диапазоне частот от 40Гц до 60МГц), что бы посчитать скважность? Если да, то нужен алгоритм.
T = t + tau (t - длительн. импульса tau - длит. "паузы")
S = T / t (S - скважность)
В дальнейшем планирую использовать 18f26k22 (набралась маленькая кучка, с десяток) с кварцем 16Мгц и внутренним умножителем до 64МГц.
Прикрепления: 9158613.jpg(106.5 Kb)

Сообщение отредактировал доцент2 - Вс, 23.07.2017, 14:29
ivan_fd Дата: Пн, 24.07.2017, 15:03  |                                                                                                                Сообщение # 33
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1040
Репутация: 83   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

С помощью данного входа не получится.

Меня все время преследуют умные мысли...но я быстрее!!!
xvovanx Дата: Пн, 24.07.2017, 16:37  |                                                                                                                Сообщение # 34
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 360
Репутация: 23   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата доцент2 ()
измерить длительность импульса и паузы ... что бы посчитать скважность

Думаю для этого лучше использовать входы внешних прерываний INT0, INT1. В 18 серии можно выставить регистрами внешние прерывания по фронтам (0-1 и 1-0). Сигнал подать сразу на оба входа. На первом входе зафиксируем фронт 0-1, на втором спад - можно определить длительность импульса. И далее зафиксировав опять фронт - определяем паузу.
доцент2 Дата: Пн, 24.07.2017, 20:27  |                                                                                                                Сообщение # 35
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 433
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Т.е., как только пришел сигнал 0-1 происходит прерывание и запускаем внутренний таймер TMR0 или TMR1 до прихода спада 1-0 надо подсчитать сколько натикает в таймере.
А при частоте сигнала близкой или более частоты генератора МК как быть? Или я чего-то не понимаю.
xvovanx Дата: Чт, 27.07.2017, 13:54  |                                                                                                                Сообщение # 36
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 360
Репутация: 23   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата доцент2 ()
А при частоте сигнала близкой или более частоты генератора МК как быть?

Если сигнал соизмерим с тактом микропросессора, тут уже без внешних делителей не обойтись.
доцент2 Дата: Чт, 03.05.2018, 21:41  |                                                                                                                Сообщение # 37
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 433
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Цитата xvovanx ()
тут уже без внешних делителей не обойтись.
Хотелось бы получать не только частоту, но и скважность сигнала во всем диапазоне измерения. Информативность была бы лучше.

Добавлено (03.05.2018, 21:41)
---------------------------------------------
Пытаю дальше частотомер.
Вот кусок программы, измерение длится 1 секунда, делитель таймера TMR1 1:4
Прерывание
Context Save
    If TMR1IF=1 Then    ' если произошло прерывание по переполнению таймера TMR1, то       
       Inc TMR1perep     ' приращение количества переполнений TMR1
       TIMER1=0
       TMR1IF=0            ' сброс Флага прерывания по переполнению таймера TMR1                 
    EndIf             
Context Restore     'возврат из обработчика прерывания

izmer_1sec:
TMR1IF = 0 ' сброс Флага переполнения таймера TMR1
TMR1IE = 1  ' Разрешение прерывания по переполнению таймера TMR1          
TIMER1 = 0
TMR1perep = 0 ' количество переполнений в 0
TMR1ON = 1 ' запустить таймер TMR1
Asm
; Задержка 10 000 000 машинных циклов
; Длительность задержки 1000 миллисекунд
; Частота задающего генератора 40 МГц
            Movlw       .223
            Movwf       Reg_1
            Movlw       .187
            Movwf       Reg_2
            Movlw       .51
            Movwf       Reg_3
            Decfsz      Reg_1
            Bra         $-2
            Decfsz      Reg_2
            Bra         $-6
            Decfsz      Reg_3
            Bra         $-.10
            Nop
            Nop           
EndAsm
TMR1ON = 0                   ' остановить таймер TMR1
If tame_izmer=2  Then j  = ((TIMER1 + 65535 * TMR1perep) * 4)/1

В принципе все считает, но присутствует погрешность, например:
генератор 10.000.000Гц        частотомер показывает 9.990.969Гц
25.175.000         -        25.174.440
53.203.400         -        53.221.215
78.643.200         -        78.685.526
Аналогичная погрешность при измерениях с задержкой 100мсек, 10мсек,, 1мсек.
Ошибка равна примерно TIMER1*4
Например при измерении частоты 53.203.400Гц  кол-во переполнений TMR1perep=203 и величина TIMER1=2265
Подскажите где копать.

Сообщение отредактировал доцент2 - Ср, 23.08.2017, 17:22
ivan_fd Дата: Чт, 03.05.2018, 22:55  |                                                                                                                Сообщение # 38
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1040
Репутация: 83   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Я сейчас уже не припомню, но поищите частотомер от, помоему GO, (автор RLC2) там правда все на асме, но считает очень точно.
У меня где то были исходники, поищу, если интересно.


Меня все время преследуют умные мысли...но я быстрее!!!
доцент2 Дата: Пт, 04.05.2018, 18:40  |                                                                                                                Сообщение # 39
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 433
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Асм для меня это темный лес.
Цитата ivan_fd ()
У меня где то были исходники, поищу, если интересно.
Конечно интересно. Буду ждать.
Вот пример измерения при разных задержках с использование подсчета переполнения таймера:
должно быть 25.175.000Гц
1сек          25.178.078
0.1сек       25.177.560
0.01сек     25.171.600
0.001сек   25.171.998
Подскажите на каком этапе могут возникать такие погрешности.

Сообщение отредактировал доцент2 - Пт, 04.05.2018, 21:27
ivan_fd Дата: Сб, 05.05.2018, 15:11  |                                                                                                                Сообщение # 40
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1040
Репутация: 83   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Вот, нашел исходник. Я в нем сильно не разбирался.
Прикрепления: FCL2x16.rar(7.6 Kb)


Меня все время преследуют умные мысли...но я быстрее!!!
доцент2 Дата: Сб, 05.05.2018, 20:19  |                                                                                                                Сообщение # 41
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 433
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Спасибо за исходник. Асм для меня конечно темный лес. Попробую разобраться.

Добавлено (05.05.2018, 20:19)
---------------------------------------------
Не совсем понимаю этот досчет через TMR0.
У меня используется TMR1 и следующий алгоритм:
предделитель таймера 1:4
- запускаем TMR1
- переходим к задержке, например 1секунда
- считаем количество переполнений TMR1perep, если переполнение есть, то каждый раз обнуляем счетчик TIMER1
- далее расчет ((TIMER1 + 65535 * TMR1perep) * 4)/1
В принципе здесь досчет на TMR0 и не нужен он идет на переменную TIMER1.
Может я не прав?
Еще один момент, для МК я использую кварц на 10МГц и умножение PLL. Таким образом получаю частоту МК 40МГц. Может здесь собака порылась?

Сообщение отредактировал доцент2 - Сб, 05.05.2018, 20:23
ivan_fd Дата: Вс, 06.05.2018, 20:41  |                                                                                                                Сообщение # 42
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1040
Репутация: 83   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Я этот исходник  смотрел очень давно и не основательно. Если будет время посмотрю, что да как.
А на счет кварца. Там в оригинальной схеме кварц на 4МГц и на одном входе стоит подстроечный конденсатор. Что бы подстраивать точность.


Меня все время преследуют умные мысли...но я быстрее!!!
доцент2 Дата: Вт, 08.05.2018, 17:52  |                                                                                                                Сообщение # 43
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 433
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Мне не совсем понятно почему при разной длительности задержки ошибка как отрицательная, так и положительная, например:
должно быть 25.175.000Гц, показывает:
1с            25.177.916
0,1с         25.177.480
0,01с       25.171.200
0,001с     25.171.998

Добавлено (08.05.2018, 17:52)
---------------------------------------------
Неужели ни кто частотомер сам не пытался сделать? Наверняка причина неточности ерундовая.

ivan_fd Дата: Вт, 08.05.2018, 20:41  |                                                                                                                Сообщение # 44
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1040
Репутация: 83   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Это вы в железе проверяете? С чем сравниваете? Схема?

Меня все время преследуют умные мысли...но я быстрее!!!
доцент2 Дата: Вт, 08.05.2018, 22:48  |                                                                                                                Сообщение # 45
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 433
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Проверяю на мекетке. Сигнал беру с кварцевых генераторов на 25.175.000Гц, 27.786.000, 53.203.400 и 78.643.200. На выходе они дают сигнал с амплитудой 5В. Генераторы подключаю на прямую к выводу МК. На низких частотах пока не проверял (надо простенький генератор на логике собрать).
Для сравнения пока использую частотомер  (до 60МГц), собранный лет пять назад на pic16f84А. Его показания соответствуют частотам генераторов (+/- 100...300Гц).
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Частотомер (скважность и прочее и прочее и прочее)
Поиск: