[an error occurred while processing this directive]
Вот есть тест-программка на С, отлаживался алгоритм измерения частоты вокруг 50 гц на основе фапч. (+) По ссылке - код.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено SM 24 сентября 2002 г. 11:14
В ответ на: Тут недавно ФАПЧ поминали... А где бы посмотреть примеры программной реализации оной, алгоритмы? Например, программное детектирование ЧМ сигналов? отправлено VVT 24 сентября 2002 г. 10:53

Части наиболее простой системы примерно такие:
(Изначальная задача - цифруется входной НЧ сигнал, надо померить частоту).

1. Компаратор с гистерезисом. Реализуется так:
Xn - выборка с ацп. , +-(2^(N-1)-1) N - разрядность АЦП.
Yn - выходной сигнал
A - величина гистерезиса.
| 1, если Xn > A
Y(n) = { Y(n-1), если A >= Xn >= -A
| 0, если Xn < -A


2. Делитель на 2. Для выравния длительностей положительного и
отрицательного полупериодов. Ну вобщем ликвидация последствий ухода
нуля АЦП.

| DY(n-1) XOR 1 если Y(n)=1 и Y(n-1)=0
DY(n) = {
| DY(n-1) во всех остальных случаях

3. Генератор, управляемый кодом (ГУК)

OSC - 32-х битное число без знака.
F - код, определяющий частоту (0x80000000 / (Fd/Fosc))

OSC(n) = OSC(n-1)+F
Z(n) = (OSC(n) >> 30) & 1

4. Фазовый детектор.

Привожу два варианта. Оба работают. Первый очень долго входит в
синхронизм, но меньше болтает частотой вокруг входного сигнала.
Второй - быстрее синхронизируется, но и больше болтается. Первый
был результатов собственных домыслов, второй - аналог того, что в
74HC4046 стоит (type 2).

------- 1-й. --------

| 1, если DY(n-1) = 0 и DY(n) = 1 и Z(n) = 0
FD1(n) = { 0, если Z(n-1) = 0 и Z(n) = 1
| FD1(n-1) во всех остальных случаях

| 1, если Z(n-1) = 0 и Z(n) = 1 и DY(n) = 0
FD2(n) = { 0, если DY(n-1) = 0 и DY(n) = 1
| FD2(n-1) во всех остальных случаях


------- 2-й. --------
сначала
FD1 = 1 если DY(n-1) = 0 и DY(n) = 1
FD2 = 1 если Z(n-1) = 0 и Z(n) = 1
затем
FD1 = FD2 = 0 если FD1=1 и FD2 = 1.

5. Определяем наличие и знак фазового сдвига.

| +1, если FD1(n) = 1;
PH(n) = { -1, если FD2(n) = 1;
| 0 , во всех остальных случаях.

6. Корректируем частоту ГУК.


К - коэффициент, показывающий дискретность изменения частоты ГУК.
От него зависит точность захвата, скорость, болтанка вокруг
центральной частоты.

F(n) = F(n-1) + PH(n)*K

7. Это все. Если конечно не объе@#лся :)
---------------------------------------------------------------

Бывают полезны следующие штучки :

1. Пофильтровать F(n) фильтром НЧ первого порядка.

2. Вместо пункта 6 использовать ФНЧ, на вход которого подано PH(n)*K

3. Динамически менять К в зависимости от наличия/отсутствия
синхронизма.

4. Если есть желание поизвращаться - можно фазовый детектор сделать
на основе корреляции :).

5. ГУК делать не зависимым от частоты дискретизации (например
пустить таймер с автоперезагрузкой). Повысит точность. Хотя конечно
болтанка есть быть всегда :) Но усреднением точность получается все
равно хорошая.

6. Использовать ФД "XOR", если есть желание получить сигнал со
сдвигом фазы на 90 град. к входному.

7. Один из методов определить наличие синхронизма - анализировать PH(n) за
достаточно длительный период времени. Если накопленная сумма за
достаточное время не превысила определенный порог по абсолютному
значению, то система в синхронизме.

8. Придумать можно еще тучу всего, главное реализуется на любом
даже самом тормозном чипе.



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru