logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak uzyskać regulację częstotliwości 30kHz co 0.05Hz na AVR 16MHz?

autoservice 24 Lut 2008 16:27 1923 14
REKLAMA
  • #1 4841188
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    Witam
    Czy ma ktoś pomysł jak wygenerować przebieg prostokątny 30kHz w dowolny sposób... ale muszę mieć możliwość regulacji częstotliwości z dokładnością 0.1Hz lub lepiej 0.05Hz. Chciałem wykorzystać timer 16bitowy w trybie CTC i negacja pinu po osiągnięciu wartości wpisanej do rejestru OCR. Ale zwiększenie wartości tego rejestru o 1 zwiększa mi częstotliwość o kilka Hz... Ma ktoś jakiś pomysł... sposób... wszystko musi się opierać o rezonator, generacja częstotliwości musi być stabilna... metody analogowe nie wchodzę w grę.
    Pzdr.
  • REKLAMA
  • #2 4841403
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 573
    Oczywiście że się da ale kolega sobie poczyta co to jest preskaler. Nie ma tak łatwo proszę poczytać dokumentację atmela jest to wykonalne bez większego problemu
  • REKLAMA
  • #4 4841818
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ...a mozesz mi powiedziec do czego ten preskaler?? bo wygnerowac 30kHz prostokat to ja umie... sęk w tym, że ja chce zmieniać czestotliwość ze skokiem 0.1...0.05Hz... i tu pojawiają się schody.
    Pzdr.
  • REKLAMA
  • #5 4841969
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    autoservice napisał:
    ...a mozesz mi powiedziec do czego ten preskaler?? bo wygnerowac 30kHz prostokat to ja umie... sęk w tym, że ja chce zmieniać czestotliwość ze skokiem 0.1...0.05Hz... i tu pojawiają się schody.
    Pzdr.
    Użyj preskalera do taktowania licznika output-capture lub wolniejszego kwarcu. Wtedy jeden krok w liczniku będzie dłuższy. A nie możesz tego zrobić w postaci pętli opóźniającej? Okres powinien być bardzo stabilny przy napisaniu jej w asemblerze.
  • #6 4842131
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Czy wypełnienie ma być regulowane?
    Czy skok musi byc w całym zakresie 0.1hz?
    Jaka dokładność generowanego sygnału co do czestotliwosci (nie chodzi mi o stabilność)
    Nalezałoby zastosowac jak najszybszy kwarz najlepiej 18,432,000 lub cos podobnego
  • #7 4842220
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ...no właśnie, szybkość kwarcu określa rozdzielczość regulacji. Tj czas trwania jednego taktu timera1 16bitowego, czyli jedna próbka z 65535 musi trwać jak najkrócej co gwarantuje szybki zegar. Aby uzyskać 25kHz ładuje do OCR liczbe 320. Gdy licznik osiagnie 320 to zmienia stan nozki OCR1A. cos mi sie wydaje,ze sie nie da osiagnac tylko przy pomocy timera, zegara i samego avr... albo inna technika albo inny program...
    ...wypelnienie stale 50%, skok 0.1Hz moze byc w waskim zakresie... np w przedziale 100Hz
    dokładnosc bedzie determinowac sam kwarc...bo z niego taktowany jest timer1 a ile jest tam dokladnie Hz to nie musze wiedziec, wazne zeby bylo stabilne w czasie i mialo regulacje z tym skokiem w zakresie 100..200Hz.
    Pzdr.
  • #8 4842308
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    No to już mam jasnosc.

    Jezeli podzielimy 20hz- 30khz na podzakresy
    to w niskich czestotliwosciach mozna bedzie spokojnie osiągnąc skok 0.05
    natomiast w wysokim zakresie bedzie musiala byc o wiel wieksz czyli skok około 100hz
    Program bedzie banalny jezlie chodzi o samo wyliczanie.
    wystarczy dzielic czest zegara przez wymaganą czestotliwosc i ten wspołczynnik dzielic przez dwa i dodawac do rejestru OCRA1 w przerwaniu dzieki czemu zostanie ustawione nastepne przerwanie i tak w kółko. Gdzies mialem nawet gotowy program który w wersji okrojonej słuzy jako dodatek do urzadzen w celu generowania muzyczki lub potwierdzenia nacisneicia klawisza/
  • #9 4842537
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ....20Hz? mi chodzilo o 20kHz... ultradzwieki... np chce ustawiac czestotliwosc 26.000Hz w zakresie 25.900 do 26.100 ze skokiem 0.1 lub 0.05... normalnie na timerze1 sie nie da tego zrobic...kombinuje z timerem0 ktory jest 8bitowy i szybko sie przepelnia...moge zliczac jego przerwania w jakims liczniku np timer1 i za pomoca timer0 ustawiac czestotliwosc... mysle nad algorytmem.
    Pzdr.
  • #10 4842577
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Nie ma znaczenia czy zrobisz to na liczniku 1 czy 0. Raczej nie da sie uzyskać takiego skoku przynajmniej ja nie widze narazie takiej mozliwosci, jedyne co mi sie nasuwa to przestrajanie jakiegos zewnetrznego generatora np. za pomocą PWM a AVRerem zrealizowac pomiar tej czestotliwosci i ewentualnie tzw sprzezenie zwrotne
    Oczekujesz 200 000 skoków to 18 bitów troszkę dużo.
  • #11 4842690
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 573
    Nie da sie ? a jaką największą liczbę da sie zapisać w atmelu bo to że timer nie zapisze takiej liczby to nie oznacz że nie da sie tego zrobić wykorzystując pośrednio timer ...
  • #12 4842808
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    to ze sie da zapisac taka duzą liczbe nie oznacza ze da sie podzielic zegar 16Mhz wten sposób aby uzyskac skok 0.1 Hz wtedy czestotliwosc kwarzu musialaby wynosic pewnie z 16Ghz
    Policzmy
    16mhz/60000=266.6666
    16Mhz/60000,2=266,6657
    czyli róznica dopiero na 3 miejscu po przeciku.
    Poniewaz my mamy do dyspozycji tylko liczby naturalne to aby uzyskac taką dokładnosc zmian trzeba by podnies czestotliwosc wejsciową do podziału czyli jakies 1000razy. Chyba nei tedy droga do rozwiazanai tego problemu
  • #13 4843363
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    Przy tak niskiej częstotliwości (sygnałem jest prostokąt o stałym wypełnieniu 50%) to chyba prościej jest rozwiązać sprawę programowo.
    Zresztą kolega asembler sie nieco pomylił w obliczeniach. Wystarczy zmienić kwarc na 12MHz by obliczenia były całkowitymi liczbami.
    Obliczenia:
    20kHz|12Mhz=600 cykli zegarowych
    30kHz|12Mhz=400 cykli zegarowych
    czyli do dyspozycji mamy 200 część z 20kHz. Daje nam to rozdzielczość rzędu 100Hz. (tak na prawdę nie wykonasz pętli, która zostanie sprawdzona i wykonana w 1 cyklu zegarowym, więc musisz mieć odpowiednio szybszy zegar)
    Jeśli taka rozdzielczość Cię nie interesuje, to robisz co następuje:
    100Hz szerokości to będzie Twój podzakres i będziesz ich miał 200 w paśmie 20-30kHz.
    Następnie to już Ci nie pomogę bo musisz zbudować heterodynę i mieszać sygnały by uzyskiwać odpowiednie częstotliwości.

    Tyle odnośnie teorii, w praktyce to lepiej użyć czegoś gotowego.
    Pozdrawiam
  • #14 4843606
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Witam
    Wykorzystanie AVR do DDS uniemożliwia wykonywanie jakichkolwiek innych zadań i sygnał będzie miał już duży jitter. Zastosuj np. AD9851, to przy częstotliwości 30kHz będziesz miał idealny przebieg.
  • REKLAMA
  • #15 4848791
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Kolego Ch.M. nie ma żadnej pomyłki w moich obliczeniach. Nie zastanawialem sie czy to ma byc 12 czy 16 MHZ gdyż jak kolega zechce jeszcze raz przeczytać tytuł postu zmiany mają być co 0.1Hz 0.05 Hz
    wiec 1000 razy mniejsze niz 100Hz. Ja tez na początku sie nabrałem na ten tytuł ale przeczytawszy dokladniej wyszło mi no niech bedzie 12.Ghz:)

Podsumowanie tematu

✨ Dyskusja dotyczy problemu generacji sygnału prostokątnego o częstotliwości około 30 kHz z regulacją co 0,05 Hz na mikrokontrolerze AVR taktowanym kwarcem 16 MHz, wykorzystując timer 16-bitowy w trybie CTC. Użytkownik zauważa, że zmiana wartości rejestru OCR o 1 powoduje skok częstotliwości o kilka Hz, co uniemożliwia precyzyjną regulację. W odpowiedziach sugerowano zastosowanie preskalera, jednak jego ograniczenia nie pozwalają na tak drobną regulację przy standardowym kwarcu 16 MHz. Proponowano także wykorzystanie techniki DDS (Direct Digital Synthesis) lub zewnętrznych generatorów, np. AD9851, które zapewniają stabilny i precyzyjny sygnał. Wskazano, że przy obecnych parametrach sprzętowych i częstotliwości kwarcu uzyskanie skoku 0,05 Hz jest praktycznie niemożliwe bez zwiększenia częstotliwości taktowania do rzędu GHz lub zastosowania bardziej zaawansowanych metod, takich jak heterodyna czy sprzężenie zwrotne z zewnętrznym generatorem. Dyskutowano również o ograniczeniach timerów AVR i konieczności kompromisów w zakresie rozdzielczości i stabilności sygnału. Wskazano, że programowa implementacja zliczania przerwań i dzielenia częstotliwości może pomóc, ale nie rozwiąże problemu dokładności na poziomie 0,05 Hz przy 30 kHz. Podsumowując, do precyzyjnej regulacji częstotliwości w tym zakresie lepiej zastosować dedykowane układy DDS lub zewnętrzne generatory sygnału.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA