[an error occurred while processing this directive]
|
Части наиболее простой системы примерно такие:
(Изначальная задача - цифруется входной НЧ сигнал, надо померить частоту).
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