Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Частотомер на PIC


Автор: konst696 1.9.2004, 13:38
Привет всем!
Хочу написать прогу для частотомера под p16f84a
Столкнулся с проблемой, как заставить поделить контроллер кол-во полученых импульсов на время.
Покопался в инете на эту тему, посмотрел исходники для частотомеров, но это меня еще больше запутало.
Помогите разобраться, может вообще следует использовать другой метод измерения частоты.
Заранее благодарен. qstn.gif

Автор: serg1 2.9.2004, 05:30
Я бы использовал такой алгоритм.
Подавал на вход прерывания INT0 импульсы, чпстоту которых надо измерить, и по передним фронтам запускал и останавливал таймер. Помоему фсё wink.gif

Автор: cardinal 2.9.2004, 10:37
Цитата(konst696 @ 1.9.2004, 12:38)
Покопался в инете на эту тему, посмотрел исходники для частотомеров, но это меня еще больше запутало.

konst696, выкладывай те места, которые тебя запутали...

Автор: PILOT 2.9.2004, 13:23
Зачем делить?
Показываешь кол-во импульсов за 1 сек и все.

СУВ.

Автор: lummox 30.9.2004, 13:39
Цитата(PILOT @ 2.9.2004, 13:23)
Зачем делить? Показываешь кол-во импульсов за 1 сек и все.

Ну да, если частоты порядка кГц, а требуемая точность порядка 3 знаков. Если же меряются десятки Герц, то для достижения той же точности понадобятся десятки секунд. Быстрый результат можно получить измерив период сигнала, а частоту вычислить взяв обратную величину. Видимо это имелось ввиду.
Тогда придётся делить эталонную частоту на кол-во импульсов этой частоты за период измеряемого сигнала.

Автор: avtar 18.11.2004, 11:50
пример деления 32/32
на PIC16F628 при 20МГц время выполнения 265 мкС

;---------------------------------------------------------------------

;------- HEADER ----------
;---------------------------------------------------------------------
; FredMaher Madrid 30 Sept 02 [email protected]
; Tony Newton's 24џ24 routine with worked example
;Доработано до 32/32 Тарасов А.в.

LIST P=16F628 ; 16F628 Runs at 20 MHz
INCLUDE "p16F628.inc"

__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON & _LVP_OFF & _BODEN_OFF

ERRORLEVEL -224 ; suppress annoying message because of tris
ERRORLEVEL -302 ; suppress message because of page change

;__FUSES _PWRTE_ON & _CP_OFF & _WDT_ON & _HS_OSC & _LVP_OFF & _MCLRE_OFF & _BODEN_OFF

; asds


; Define Information
;#DEFINE RS PORTA, 2
;#DEFINE E PORTA, 3
;#DEFINE TOGGLESW PORTB, 6 ; not used at the moment
;#DEFINE LED PORTB, 5

; Macro
Bank0 macro
bcf STATUS, RP0 ;Выбор bank 0
bcf STATUS, RP1
endm

Bank1 macro
bsf STATUS, RP0 ;Выбор bank 1
bcf STATUS, RP1
endm


;---------------------------------------------------------------
CBLOCK 20H ; from 20C to 7F = 67
;---------------------------------------------------------------

; MATH ROUTINES
; 32 / 32 Div --> 32

; TONY NIXON's Algorithm starts here + my retouching+ДОРАБОТКА ДО 32 РАЗРЯДОВ

; SUBROUTINE - 32/32 Деление
; Константа или делимое: nratorC nratorH nratorM nratorL
; Делитель: denomC denomH denomM denomL
;
; Результат: nratorC nratorH nratorM nratorL
; Остаток: remainC remainH remainM remainL
nratorC ;20Н константа или делимое для деления,при выходе из п.п. результат деления
nratorH
nratorM
nratorL
denomC ;24Н делитель из счетчика импульсов
denomH
denomM
denomL
remainC ;28Н Остаток
remainH
remainM
remainL
shiftC ;32H Временный регистр счетчик сдвигов
shiftH
shiftM
shiftL
BCount


;-------------------------------------------------------------------
ENDC ; end of definition block
;-------------------------------------------------------------------




ORG 0 ; Старт с 0
goto Main ; jump over to main routine

Main:
call Div32
Homesweethome
nop
goto Homesweethome

Div32

;Пример 1000000000/625= 3B9ACA00h / 271h =1600000 ( remainder... remain/denom gives the decimal correctly... = Dec 0.962)



movlw 0x3B ; Ввод константы (делимого)
movwf nratorC
movlw 0x9A
movwf nratorH
movlw 0xCA
movwf nratorM
movlw 0x00
movwf nratorL
movlw 0x00 ; Ввод делителя
movwf denomC
movlw 0x00
movwf denomH
movlw 0x00
movwf denomM
movlw 0x01
movwf denomL


divizn movlw .32
movwf BCount
movf nratorC,w
movwf shiftC
movf nratorH,w
movwf shiftH
movf nratorM,w
movwf shiftM
movf nratorL,w
movwf shiftL
clrf nratorC
clrf nratorH
clrf nratorM
clrf nratorL
clrf remainC
clrf remainH
clrf remainM
clrf remainL
dloop bcf STATUS,C
rlf shiftL,f
rlf shiftM,f
rlf shiftH,f
rlf shiftC,f
rlf remainL,f
rlf remainM,f
rlf remainH,f
rlf remainC,f
;
movf denomC,w
subwf remainC,w
btfss STATUS,Z
goto nochk
;
movf denomH,w
subwf remainH,w
btfss STATUS,Z
goto nochk
;
movf denomM,w
subwf remainM,w
btfss STATUS,Z
goto nochk
;
movf denomL,w
subwf remainL,w
nochk btfss STATUS,C
goto nogo
;
movf denomL,w
subwf remainL,f
btfss STATUS,C
decf remainM,f
movf remainM,w
xorlw 0xff
btfsc STATUS,Z
decf remainH,f
movf denomM,w
subwf remainM,f
btfss STATUS,C
decf remainH,f
movf denomH,w
subwf remainH,f
btfss STATUS,C
decf remainC,f
movf denomC,w
subwf remainC,f
bsf STATUS,C

nogo:
rlf nratorL,f
rlf nratorM,f
rlf nratorH,f
rlf nratorC,f
decfsz BCount,f
goto dloop
;




Return

end












Автор: konst696 8.12.2004, 13:42
Благодарю всех за ответы

Автор: Гость_Alex 4.1.2005, 15:50
Можно сделать следующим образом: у таймера есть предделитель и есть синхронизация с внешним сигналом. Внешним сигналом у нас будет опорный генератор, допустим на 32768 Гц. Тогда установив предделитель Мы можем добиться чтобы таймер работал ровно секунду. А пока он работает мы считаем импульсы. По кривому, а можно другим таймером юзая его как счетчик, а по прерывания от первого таймера останавливаем счет импульсов. Таким образом у нас будет переменная соджержащая кол-во импульсов за интервал времени, который задается предделителем и точность нашего частотомера зависит от точности задающего генератора

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)