Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Частотомер глючит в железе


Частотомер глючит в железе

Сообщений 1 страница 6 из 6

1

Добрый день! Простенький частотомер. Timer1 в режиме счёта, Timer0 считает время (секунда считается не точно, но это на этапе отладки, сейчас это не суть). В протеусе работает превосходно. В железе же глючит, и даже отображаемая частота плавает в зависимости от скважности сигнала. Подскажите, в какую сторону посмотреть. Может подглючивать от переходных процессов по фронтам сигнала?

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 32
$framesize = 32

$baud = 9600

Config Portd.5 = Input                                      ' вход для измерения частоты

Config Timer1 = Counter , Edge = Rising
Config Timer0 = Timer , Prescale = 1024

Enable Timer1
Enable Timer0
Enable Interrupts

On Timer1 Pulse_counter
On Timer0 Sr1

Dim A As Long , B As Byte , J As Long
B = 0

Dim Freq As Long

Start Timer0

Do

Waitms 500
Print "test line"

Print Freq

Loop
End


Sr1:
Incr J
If J > 30 Then
Stop Timer0
A = B * 65536
A = A + Counter1
Freq = A
J = 0
Counter1 = 0
Start Timer0
End If
Return

Pulse_counter:
Incr B
Counter1 = 0
Return

End

Отредактировано beginer (2017-05-26 14:43:39)

0

2

Чот вы намудрили.
Достаточно одного таймера, который запускается по приходу сигнала и при повторном выключается. Дальше простейшие вычисления (сколько успеть насчитать, переводим в нужную систему счисления, частота/миллисекунды).

0

3

Да суть не в методе, а в том, что что-то приводит к ложным срабатываниям счётчика. Я грешу на форнты импульсов, может быть там какой-то преходной процесс, и МК его видит как отдельный импульс. Что-то вроде дребезга контактов. С этим как-то можно бороться?

0

4

Какой алгоритм - так всё и работает. :D Прямая зависимость.
Ну и никто не знает, какой у вас там сигнал, может с помехами, смотрите осцилом.

0

5

вы предложили алгоритм с использованием таймера в режиме захвата? так он же не справится с частотой, допустим, в 500кГц. а мне нужно хотя бы до мегагерца.

ps: изловил глюк. виноват оказался не частотомер, а генератор частоты, а точнее - я сам. на низких частотах у генератора есть глюк: при изменении скважности плывёт частота. так что зря открыл тему. наверное, следует её удалить.

Отредактировано beginer (2017-05-26 18:16:43)

0

6

beginer написал(а):

вы предложили алгоритм с использованием таймера в режиме захвата? так он же не справится с частотой, допустим, в 500кГц. а мне нужно хотя бы до мегагерца.

Нет.
Я предложил использовать 16-бит таймер, запустить его на высокой частоте, дальше при приходе импульса этот таймер запускать, а при приходе ещё одного имульса - останавливать. Дальше просто смотрим сколько он насчитал за этот период. Получится почти аппаратное решение, которое минимум будет оказывать влияние на точность измерения. Погрешность будет расти только при измерении больших частот.
Подобным алгоритмом я измерял скорость выполнения программы в МК. Минус подхода только в том, что 16-бит легко можно превысить/переполнится значение счета и как следствие неправильное вычисление значения. Т.е. подсчитать 4МГц или 1 Гц возможно будет сложно, нужно вводить диапазон измерений или делать это как-то автоматически.

А насчет 500КГц, если пытаться строить алгоритм программно (как у вас), то технически может получится, что МК не сможет физически за столько тактов подсчитать нужное количество импульсов.

Отредактировано RDW (2017-05-26 18:54:41)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Частотомер глючит в железе