Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 13 sty 2026, o 12:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 19 sie 2015, o 22:05 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Mam kolejny i chyba raczej mniej typowy problem natury matematyczno-informatycznej ...
Potrzebuję obliczać wartość X, którą należy wpisać w 32 bitowy rejestr (4 bajty) aby aby urządzenie generowało precyzyjnie częstotliwość jaką chcę uzyskać.
Wartość X jaką trzeba wpisać żeby urządzenie generowało wymaganą częstotliwość f liczy się z wzoru :
X= ( f * 2do32 ) / 125000000
przy czym f może zawierać wartości od 1 do 40000000 max.

Pierwsze co przychodzi na myśl to 2do32 podzielić przez 125000000 i tą stałą mnożyć przez f ....
Ale pojawia się problem precyzji i ograniczeń wielkości liczb w 8-mio bitowcach ...
2do32 / 125000000 = 34,35673815 a więc mamy kilka cyferek po przecinku .....
Jeśli obetniemy to co po przecinku będziemy mieli błąd około 1 % więc będzie to błąd zauważalny .....
Co robić w przypadkach ?
Z zapisem 32 bitowej liczby problemu nie ma, ale jak to policzyć praktycznie żeby było bez błędu ...
Teoretycznie żeby błąd był minimalny powinno się wyliczyć X i dopiero po wyliczeniu odrzucić część po przecinku jeśli taka się pojawi.
Czyli dla max wartości X to będzie:
34,35673815 x 40000000 = 1374269526 natomiast :
34 x 40000000 = 1360000000 a więc różnica dość spora .......

Jak sobie z takimi problemami radzą lepsi od mnie ? :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2015, o 22:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2013
Posty: 426
Pomógł: 36

Widzę, że budujesz DDS na AD9850 :) Tutaj masz funkcję to obliczania słowa potrzebnego do działania układu :

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


U mnie działa elegancko :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2015, o 22:52 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Tak, na AD9850 który już leży i leży :D
To co opisałeś jest z grubsza tym co mi się nasunęło na logikę ...ale nie sprawdziłem tego wpisując do Atmegi jeszcze.
Mam wątpliwości tego typu, czy podczas mnożenia frequency * 4294967296 przy freq= 40 milionów
nie "zatkam" kontrolera .... bo tymczasowa wartość będzie dość astronomiczna jak dla 8mio bitowca ....
Tak sobie wykombinowałem że wpisywanie f będzie się odbywało za pomocą klawiatury numerycznej ( bo taką akurat mam :lol: )
W taki sposób, że cyfra która będzie ustawiana będzie "migała kursorem" i od razu po wpisaniu będzie się aktualizowała częstotliwość.
Transmisję do AD9850 robię równolegle bo działa szybciej.
W pdf od AD9850 producent podaje że zapis do bufora, rejestrów czy też strobe musi trwać 3,5ns więc 8Mhz w ATmelu to żółw i nie trzeba robić opóźnień, jednak zależy mi na jak
najszybszym sterowaniu zmianami f, bo być może będę miał ciekawe zastosowanie ..... ale "pochwalę" się jak mi wyjdzie :D
Skoro mówisz że ta funkcja działa to powiedz jeszcze na jakim kontrolerze masz zrobione ?
Jak mi starczy cierpliwości i wiedzy to może przeanalizuję kod maszynowy tego fragmentu z mnożeniem ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2015, o 23:03 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27446
Lokalizacja: Szczecin
Pomógł: 1045

tomek napisał(a):
Mam wątpliwości tego typu, czy podczas mnożenia frequency * 4294967296 przy freq= 40 milionów
nie "zatkam" kontrolera .... bo tymczasowa wartość będzie dość astronomiczna jak dla 8mio bitowca ....

O żesz w mordkę, to można "zatykać" 8-bitowce ? ;) .... o jej a jak takie zjawisko wygląda ?

A na poważnie, to może kolega jednak sięgnie tak jak się należy do typów danych w avr gcc (masz to też w bluebooku) i gdziekolwiek w internecie i sprawdź sobie jakie zakresy masz do dyspozycji, a jeśli będą to ( a będą - zapewniam ) ... uint32_t albo i uint64_t ... to co ? jak myślisz po co one są ? po to żeby procka jak to nazwałeś "zatykać" ;) ? czy może po to aby wykorzystywać je w praktyce ?

Nie wymyślaj więc ... tylko czytaj ... ok?

Od razu z góry podpowiem - poczytaj też o czymś takim jak promocja do int w języku C - żebyś przy działaniu na takich liczbach po kilku próbach nie mówił, zaraz, że jednak procek ci się "zatkał" ;)

http://atnel.pl/domyslna-promocja-do-typu-int.html

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2015, o 23:26 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Ty mnie zawsze zmobilizujesz skutecznie do działania Mirek :D A mówiąc o "zatkaniu" mam na myśli coś co kiedyś mi się zdarzało nie raz kiedy uczyłem się asemblera na 8051 parę dobrych lat temu .... Pisałem po amatorsku i stos mi się rozrastał i .... nadpisywał dane .... więc "potrafię zatkać" hihi :D Zaraz poczytam o "promocji" bo nie słyszałem jeszcze o promocji ,,,, :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2015, o 01:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2013
Posty: 426
Pomógł: 36

tomek napisał(a):
Skoro mówisz że ta funkcja działa to powiedz jeszcze na jakim kontrolerze masz zrobione ?


Robiłem to na atmedze 644 16MHz, ale to były testy :) W planach mam zrobienie czegoś powiedzmy bardziej zaawansowanego na tym układzie. Widziałem także, u SunRivera, że on w swoim generatorze na tychże układach uzyskał trójkąt. Pisałem do niego wielokrotnie, ale nigdy nie uzyskałem odpowiedzi :( A możliwość generowania trójkąta byłaby naprawdę fajna :)

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2015, o 08:10 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Tak się dopytuję o doświadczenia bo ja to traktuję hobbystycznie, sam wszystko piszę. Nie zależy mi tu na pomocy w postaci gotowych rozwiązań a bardziej na ideach czy pomysłach "jak się za coś zabrać" ....
Co do generowania trójkąta nie widziałem niestety tego co zrobił Andrzej więc nie wiem w jaki sposób on z sinusoidy robi trójkąt ale proste rozwiązanie nasuwa mi się już w oparciu o budowę wzmacniacza ( komparatora ) jaki masz w strukturze AD9850 i za pomocą którego z sinusoidy robiony jest prostokąt .... W dużym uproszczeniu wyjście z wejściem wzmacniacza operacyjnego łączysz kondensatorem i już masz "piłę" ... Klasyka techniki analogowej :D
Jakby zacząć się "czepiać" sinusoida wytworzona przez DDS z kształtu próbek zapisanych w pamięci nawet nie leżała koło takiej klasycznej matematycznej sin x bo to tylko twór aproksymujący w jakimś tam stopniu sinusoidę. Jej właściwości zmieniają się skrajnie w zależności czy generujesz małą czy dużą częstotliwość. Dla amatorskich zastosowań może być ale trzeba popracować nad filtrem za przetwornikiem C/A jaki masz w AD9850. W naszym AD9850 mamy "tylko" 10 bitowy przetwornik C/A więc też z nóg nie zwala. Jak mi czas pozwoli i wiedzy wystarczy spróbuję pokombinować też w tym kierunku żeby zbudować programowy wobulator do testowania charakterystyk przenoszenia pasma różnych urządzeń .....a dla zakresu od 1Hz do 40MHz parę zastosowań by się znalazło ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO