Piotrze, binaria od Ciebie udało mi się bez problemu wgrać z pomocą przeglądarki Chrome i zajęło to minutę a sam program działa bez problemu.
Różnice w interpretacji kodu u Ciebie i u mnie (choćby format ścieżek) wynikają prawdopodobnie z tego, że mamy różne środowiska linux-owe. U mnie działa Fedora (RedHat) u Ciebie Debian ale w końcu wszystko działa jak trzeba.
Udało mi się opisać generowanie sygnałów przesuniętych w fazie w samym si5351. Niestety, niefortunnie w kodzie Waleta częstotliwość robocza oznakowana jest jako F1 co może być mylące z wyjściami si5351 opisanymi jako F0, F1 i F2. Starałem się tam gdzie to może budzić wątpliwości wyraźnie te zmienne opisać dodatkowo.
Ślady po tej metodzie znaleźć można w liniach 1654-1707 choć linie odpowiedzialne za przesunięcie fazy w si5351 zostały zakomentowane. Podany niżej kod może jednak stanowić podstawę do własnej analizy tego problemu.
Dokumentacja si5351 informuje, że można uzyskać przesunięcie fazy za pomocą rejestru fazy przypisanego do każdego wyjścia układu (rejestry 165 do 167 dla układu z trzema wyjściami). Dokładniej, 7 bitowy rejestr fazy (wartości dopuszczalne to 0-127) pozwala na opóźnienie sygnału wyjściowego w stosunku do sterowania bez opóźnienia o wartość tego rejestru pomnożoną przez 1/4 okresu pętli PLL. Brzmi to trochę zawile ale najlepiej to zrobić na przykładach.
Zalecana częstotliwość pętli PLL dla si5351 to 600 do 800MHz. W tym wypadku interesuje nas ta dolna granica bo ona wyznacza minimalną częstotliwość dla jakiej można operację przesunięcia fazy o 90 stopni dokonać.
Częstotliwość 600MHz to okres ok. 0,000000001667 sekundy.
Każdej jednostce w rejestrze fazy (0-127) można przypisać 1/4 tego okresu a więc ok. 0,000000000417 sekundy.
Maksymalna zawartość rejestru przesunięcia fazy (wymagana wartość parzysta) to 126 tak więc z tą wartością uda się opóźnić start sygnału o 0,000000000417*126 = 0,0000000525 sekundy.
Jednocześnie przesunięcie w fazie o 90 stopni sygnału wyjściowego F1-F3 to jedna czwarta okresu tego sygnału tak więc z wartością 126 w rejestrze fazy oraz częstotliwością PLL 600MHz można uzyskać pożądany efekt dla częstotliwości nie mniejszej niż około 1/(0,0000000525 *4) = 4761904,76Hz (4.761904MHz)
To oznacza, że bez modyfikacji ustawień dolnej częstotliwości PLL nie uda się uzyskać pasma 3.5MHz.
W praktyce daje się obniżyć dolną częstotliwość PLL do 400MHz a nawet niżej ale 400MHz udaje się uzyskać u niemal wszystkich egzemplarzy układów bez zrywania drgań. Jak w bibliotece Etherkit obniżyć tą dolną granicę pisałem omawiając generator si5351.
Policzmy jaką najniższą częstotliwość z przesunięciem fazy o 90 stopni uzyska się dla częstotliwości PLL równej 400MHz.
Licząc podobnie, okres dla 400MHz to 0,0000000025 sekundy a czwarta część tego czasu to 0,000000000625 sek. Dla maksymalnej wartości w rejestrze fazy (126) uzyskamy przesunięcie czasowe 0,00000007875 sekundy. To oczywiście odpowiada jednej czwartej okresu jednego z sygnałów wyjściowych F1-F3 a więc najmniejsza częstotliwość wyniesie 1/(4*0,00000007875) = 3174603,17Hz a więc ok. 3.1746MHz.
Patrząc na obliczenia widać, ze zarówno w obliczeniach dla pętli PLL jak i w obliczeniu częstotliwości wyjściowej występuje "magiczna" czwórka, która może być uproszczona.
Algorytm obliczenia przesunięcia fazy na częstotliwości roboczej F z wykorzystaniem narzędzi Etherkit może więc wyglądać następująco:
1. Podziel najniższą częstotliwość PLL przez częstotliwość roboczą F i zaokrąglij wynik w górę do najbliższej liczby parzystej N, która powinna mieścić się w granicach 2-126.
2. Oblicz częstotliwość PLL mnożąc N przez częstotliwość roboczą F czyli oblicz PLL = N * F
3. Dla tak znalezionej wartości PLL wygeneruj na wyjściach F0 i F1 si5351 żądaną częstotliwość roboczą F
4. Ustaw rejestr przesunięcia fazy dla wyjścia F0 lub F1 na obliczoną wartość N
5. Zresetuj pętlę PLL
W takich warunkach zmiana wstęgi będzie się odbywać przez wykonanie przesunięcia w fazie dla częstotliwości F0 lub F1 si5351.
Odpowiedni kod może wyglądać następująco zakładając, że niskie pll używane będzie poniżej 6.8MHz:
// jeśli częstotliwość robocza jest mniejsza niż 6.8M to pll = 400000 a jeśli wyższa to pll = 700000
long long pll_lim;
if (F1 < 680000000ULL) { //Tu F1 jest częstotliwością roboczą urządzenia
pll_lim = 40000000000ULL;
} else {
pll_lim = 70000000000ULL;
}
//obliczenie współczynnika podziału pll_div
pll_div = int(pll_lim / F1);
if (pll_div & 1 == 1) { //jeśli podzielnik nieparzysty zwiększ go o 1
pll_div++;
}
//sprawdzenie czy obliczony podzielnik daje minimalną wartość przyjętą dla pll oraz ustalenie, że pll_div będzie parzyste a w końcu wyliczenie ostatecznej wartości pll_tmp = pll_div * częstotliwość pracy (w kodzie Waleta to F1)
pll_tmp = pll_div * F1;
while (pll_tmp < pll_lim) {
pll_div++;
if (pll_div & 1 == 1) {
pll_div++;
}
pll_tmp = pll_div * F1;
}
//ustawienie na obu wyjściach (F0 i F1) si5351 częstotliwości roboczej (w kodzie Waleta to F1)
si5351->set_freq_manual(F1, pll_tmp, SI5351_CLK0);
si5351->set_freq_manual(F1, pll_tmp, SI5351_CLK1);
//wybór przesunięcia w fazie dla F0 lub F1 w zależności od wybranej wstęgi pracy
if (UpDn_state == true) {
si5351->set_phase(SI5351_CLK0, 0);
si5351->set_phase(SI5351_CLK1, pll_div);
//si5351->pll_reset(SI5351_PLLB);
} else {
si5351->set_phase(SI5351_CLK0, pll_div);
si5351->set_phase(SI5351_CLK1, 0);
//si5351->pll_reset(SI5351_PLLA);
}
//reset pętli PLL w celu wprowadzenia zmiam fazy w życie
si5351->pll_reset(SI5351_PLLA);
Jak pisałem, początkowo stosowałem taki system generowania heterodyny dla mieszacza Tayloe ale konieczność resetowania pętli PLL objawiała się stukotem podczas strojenia dlatego obecnie używam układu formowania na układach 7474 oraz 7486. Planuję jednak dla przyszłej wersji płytki ha zastosować zwory w połączeniach tak aby częstotliwości F0 i F1 dla mieszacza mogły pochodzić zarówno z układu formowania lub wprost z si5351. Zajrzę do kodu resetowania pętli PLL w Etherkit bo może autor zastosował tam jakieś opóźnienia i da się działanie w tej formie poprawić.
O ile ktoś chciałby się zdecydować na wykonanie urządzenia w obudowie podobnej do mojej z wyprowadzeniem gniazd na przedni panel jak to pokazałem nieco wcześniej to należy wykonać w płytce h0 podpiłowania na spodzie płytek tak aby mogły przedostać się te przewody na drugą stronę tej płytki gdzie są złącza.
[Obrazek: http://lx-net.pl/walet/image/otwory01.jpg] [Obrazek: http://lx-net.pl/walet/image/otwory02.jpg]
Widać to na pierwszym zdjęciu. Kolejne płytki: ha,hb i hc mają już z obu stron wykonane otwory jak to pokazałem na kolejnym zdjęciu, które po lekkim podpiłowaniu cieńszej krawędzi pozwalają na prowadzenie przewodów do tyłu urządzenia (o ile będzie to potrzebne). O ile wykonam kolejne płytki to będą one już posiadać odpowiednie otwory w płytce h0.
cdn. lj
Github
Różnice w interpretacji kodu u Ciebie i u mnie (choćby format ścieżek) wynikają prawdopodobnie z tego, że mamy różne środowiska linux-owe. U mnie działa Fedora (RedHat) u Ciebie Debian ale w końcu wszystko działa jak trzeba.
Udało mi się opisać generowanie sygnałów przesuniętych w fazie w samym si5351. Niestety, niefortunnie w kodzie Waleta częstotliwość robocza oznakowana jest jako F1 co może być mylące z wyjściami si5351 opisanymi jako F0, F1 i F2. Starałem się tam gdzie to może budzić wątpliwości wyraźnie te zmienne opisać dodatkowo.
Ślady po tej metodzie znaleźć można w liniach 1654-1707 choć linie odpowiedzialne za przesunięcie fazy w si5351 zostały zakomentowane. Podany niżej kod może jednak stanowić podstawę do własnej analizy tego problemu.
Dokumentacja si5351 informuje, że można uzyskać przesunięcie fazy za pomocą rejestru fazy przypisanego do każdego wyjścia układu (rejestry 165 do 167 dla układu z trzema wyjściami). Dokładniej, 7 bitowy rejestr fazy (wartości dopuszczalne to 0-127) pozwala na opóźnienie sygnału wyjściowego w stosunku do sterowania bez opóźnienia o wartość tego rejestru pomnożoną przez 1/4 okresu pętli PLL. Brzmi to trochę zawile ale najlepiej to zrobić na przykładach.
Zalecana częstotliwość pętli PLL dla si5351 to 600 do 800MHz. W tym wypadku interesuje nas ta dolna granica bo ona wyznacza minimalną częstotliwość dla jakiej można operację przesunięcia fazy o 90 stopni dokonać.
Częstotliwość 600MHz to okres ok. 0,000000001667 sekundy.
Każdej jednostce w rejestrze fazy (0-127) można przypisać 1/4 tego okresu a więc ok. 0,000000000417 sekundy.
Maksymalna zawartość rejestru przesunięcia fazy (wymagana wartość parzysta) to 126 tak więc z tą wartością uda się opóźnić start sygnału o 0,000000000417*126 = 0,0000000525 sekundy.
Jednocześnie przesunięcie w fazie o 90 stopni sygnału wyjściowego F1-F3 to jedna czwarta okresu tego sygnału tak więc z wartością 126 w rejestrze fazy oraz częstotliwością PLL 600MHz można uzyskać pożądany efekt dla częstotliwości nie mniejszej niż około 1/(0,0000000525 *4) = 4761904,76Hz (4.761904MHz)
To oznacza, że bez modyfikacji ustawień dolnej częstotliwości PLL nie uda się uzyskać pasma 3.5MHz.
W praktyce daje się obniżyć dolną częstotliwość PLL do 400MHz a nawet niżej ale 400MHz udaje się uzyskać u niemal wszystkich egzemplarzy układów bez zrywania drgań. Jak w bibliotece Etherkit obniżyć tą dolną granicę pisałem omawiając generator si5351.
Policzmy jaką najniższą częstotliwość z przesunięciem fazy o 90 stopni uzyska się dla częstotliwości PLL równej 400MHz.
Licząc podobnie, okres dla 400MHz to 0,0000000025 sekundy a czwarta część tego czasu to 0,000000000625 sek. Dla maksymalnej wartości w rejestrze fazy (126) uzyskamy przesunięcie czasowe 0,00000007875 sekundy. To oczywiście odpowiada jednej czwartej okresu jednego z sygnałów wyjściowych F1-F3 a więc najmniejsza częstotliwość wyniesie 1/(4*0,00000007875) = 3174603,17Hz a więc ok. 3.1746MHz.
Patrząc na obliczenia widać, ze zarówno w obliczeniach dla pętli PLL jak i w obliczeniu częstotliwości wyjściowej występuje "magiczna" czwórka, która może być uproszczona.
Algorytm obliczenia przesunięcia fazy na częstotliwości roboczej F z wykorzystaniem narzędzi Etherkit może więc wyglądać następująco:
1. Podziel najniższą częstotliwość PLL przez częstotliwość roboczą F i zaokrąglij wynik w górę do najbliższej liczby parzystej N, która powinna mieścić się w granicach 2-126.
2. Oblicz częstotliwość PLL mnożąc N przez częstotliwość roboczą F czyli oblicz PLL = N * F
3. Dla tak znalezionej wartości PLL wygeneruj na wyjściach F0 i F1 si5351 żądaną częstotliwość roboczą F
4. Ustaw rejestr przesunięcia fazy dla wyjścia F0 lub F1 na obliczoną wartość N
5. Zresetuj pętlę PLL
W takich warunkach zmiana wstęgi będzie się odbywać przez wykonanie przesunięcia w fazie dla częstotliwości F0 lub F1 si5351.
Odpowiedni kod może wyglądać następująco zakładając, że niskie pll używane będzie poniżej 6.8MHz:
// jeśli częstotliwość robocza jest mniejsza niż 6.8M to pll = 400000 a jeśli wyższa to pll = 700000
long long pll_lim;
if (F1 < 680000000ULL) { //Tu F1 jest częstotliwością roboczą urządzenia
pll_lim = 40000000000ULL;
} else {
pll_lim = 70000000000ULL;
}
//obliczenie współczynnika podziału pll_div
pll_div = int(pll_lim / F1);
if (pll_div & 1 == 1) { //jeśli podzielnik nieparzysty zwiększ go o 1
pll_div++;
}
//sprawdzenie czy obliczony podzielnik daje minimalną wartość przyjętą dla pll oraz ustalenie, że pll_div będzie parzyste a w końcu wyliczenie ostatecznej wartości pll_tmp = pll_div * częstotliwość pracy (w kodzie Waleta to F1)
pll_tmp = pll_div * F1;
while (pll_tmp < pll_lim) {
pll_div++;
if (pll_div & 1 == 1) {
pll_div++;
}
pll_tmp = pll_div * F1;
}
//ustawienie na obu wyjściach (F0 i F1) si5351 częstotliwości roboczej (w kodzie Waleta to F1)
si5351->set_freq_manual(F1, pll_tmp, SI5351_CLK0);
si5351->set_freq_manual(F1, pll_tmp, SI5351_CLK1);
//wybór przesunięcia w fazie dla F0 lub F1 w zależności od wybranej wstęgi pracy
if (UpDn_state == true) {
si5351->set_phase(SI5351_CLK0, 0);
si5351->set_phase(SI5351_CLK1, pll_div);
//si5351->pll_reset(SI5351_PLLB);
} else {
si5351->set_phase(SI5351_CLK0, pll_div);
si5351->set_phase(SI5351_CLK1, 0);
//si5351->pll_reset(SI5351_PLLA);
}
//reset pętli PLL w celu wprowadzenia zmiam fazy w życie
si5351->pll_reset(SI5351_PLLA);
Jak pisałem, początkowo stosowałem taki system generowania heterodyny dla mieszacza Tayloe ale konieczność resetowania pętli PLL objawiała się stukotem podczas strojenia dlatego obecnie używam układu formowania na układach 7474 oraz 7486. Planuję jednak dla przyszłej wersji płytki ha zastosować zwory w połączeniach tak aby częstotliwości F0 i F1 dla mieszacza mogły pochodzić zarówno z układu formowania lub wprost z si5351. Zajrzę do kodu resetowania pętli PLL w Etherkit bo może autor zastosował tam jakieś opóźnienia i da się działanie w tej formie poprawić.
O ile ktoś chciałby się zdecydować na wykonanie urządzenia w obudowie podobnej do mojej z wyprowadzeniem gniazd na przedni panel jak to pokazałem nieco wcześniej to należy wykonać w płytce h0 podpiłowania na spodzie płytek tak aby mogły przedostać się te przewody na drugą stronę tej płytki gdzie są złącza.
[Obrazek: http://lx-net.pl/walet/image/otwory01.jpg] [Obrazek: http://lx-net.pl/walet/image/otwory02.jpg]
Widać to na pierwszym zdjęciu. Kolejne płytki: ha,hb i hc mają już z obu stron wykonane otwory jak to pokazałem na kolejnym zdjęciu, które po lekkim podpiłowaniu cieńszej krawędzi pozwalają na prowadzenie przewodów do tyłu urządzenia (o ile będzie to potrzebne). O ile wykonam kolejne płytki to będą one już posiadać odpowiednie otwory w płytce h0.
cdn. lj
Github

