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



Teraz jest 29 mar 2024, o 13:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 19 sty 2019, o 18:03 
Offline
Użytkownik

Dołączył(a): 10 paź 2014
Posty: 55
Pomógł: 0

Cześć,

Po dość długiej przerwie chciałem wrócić do programowania. A powód to wykonanie urządzenia, które będzie generowało sygnał prostokątny o określonej częstotliwości. I tak zaczołem robić testy i coś mi się nie zgadza, ale miałem już zbyt długą przerwę.

Powołałem timer 0:

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


oraz w wektorze przerwania:

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


I teraz pytanie do was. Procesor taktuję 16 Mhz kwarcem. Chcę uzyskać częstotliwość 100Hz zmiany sygnału na PD0.

Zgodnie z obliczeniami: 16 000 000 / 1024 / 156 = 100,16

A gdy podpinam oscyloskop na wyjście częstotliwość ta jest 49,76 Hz.

No i jeszcze przy okazji jak najlepiej płynnie regulować taka częstotliwość ??

------------------------ [ Dodano po: 16 minutach ]

Dlaczego na wyjściu jest 50Hz a nie 100Hz ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2019, o 18:36 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Tak pod skórą czuję że wywołujesz przerwanie sto razy na sekundę
Czyli częstotliwość będzie 50 Hz
Zobacz że musisz mieć dwa "pyknięcia" przerwania żeby mieć jeden cykl


Autor postu otrzymał pochwałę

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2019, o 18:53 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

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


W ten sposób zmieniasz stan pinu na przeciwny po każdym odliczeniu zadanej wartości, więc okres przebiegu będzie dwukrotnie dłuższy, niż okres zliczania, stąd dwukrotnie niższa częstotliwość.

Druga sprawa - częstotliwość wyjściową w trybie CTC oblicza się według wzoru:
f = F_CPU / ( 2 * N * (OCR0+1) )
gdzie:
  • F_CPU to częstotliwość taktowania mikrokontrolera
  • N to wartość preskalera
Od tej swoje skalkulowanej wartości 156 musisz odjąć 1, a uzyskasz częstotliwość bardziej zbliżoną do połowy częstotliwości, której oczekiwałeś.

Trzecia sprawa - lepiej użyć sprzętowego generowania ustawiając odpowiednio bity COM01:COM00, niż zmieniać stan pinu w przerwaniu.

Mateo napisał(a):
No i jeszcze przy okazji jak najlepiej płynnie regulować taka częstotliwość ??


Płynnie się nie da z założenia. Mało tego zależność częstotliwości od wartości wprowadzonej do rejestru OCR0 jest nieliniowa. W celu uzyskania częstotliwości bardziej zbliżonych do Twoich oczekiwań użyj timera o większej rozdzielczości, czyli 16-bitowego.

EDIT:
Widzę, że kolega JarekB mnie wyprzedził ;) Mój post może jednak zostawię, bo zawiera nieco dokładniejsze wyjaśnienie..


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2019, o 11:35 
Offline
Użytkownik

Dołączył(a): 26 cze 2016
Posty: 186
Pomógł: 7

Coś podobnego rzeźbie z myślą o zrobieniu kamertonu i przy okazji dodam gniazdo BNC i będzie generator w szerszym zakresie. Wersja jeszcze w powijakach i pewnie z błędami, na arduino nano, ale można by już używać.
https://github.com/czarekgr/generator
Uwaga: branch develop !!!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2019, o 12:36 
Offline
Użytkownik

Dołączył(a): 10 paź 2014
Posty: 55
Pomógł: 0

Faktycznie po przeliczeniu wszystko się zgadza. Dzięki za podpowiedzi Panowie.
Podpowiedzielibyście mi jeszcze jak skonfigurować Timer1 w atmedze32.

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


Ale jak zmieniam wartość OCR1A to częstotliwość na wyjściu jakoś słabo się zmienia :/

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2019, o 12:42 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

Możesz sobie również przeanalizować kod. Wprawdzie pod Arduino, ale korzystając z poradnika Mirka jak odpalić Arduino na ATB, będziesz mógł sobie poćwiczyć/potestować na innych procesorach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2019, o 13:14 
Offline
Użytkownik

Dołączył(a): 10 paź 2014
Posty: 55
Pomógł: 0

A kojarzycie może w którymś poradniku u Mirka przedstawia on inicjalizację Timera1 ??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2019, o 13:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Mateo napisał(a):
Faktycznie po przeliczeniu wszystko się zgadza. Dzięki za podpowiedzi Panowie.
Podpowiedzielibyście mi jeszcze jak skonfigurować Timer1 w atmedze32.

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




Bit WGM12 masz w rejestrze TCCR1B. Reszta ok.

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2019, o 19:04 
Offline
Użytkownik

Dołączył(a): 10 paź 2014
Posty: 55
Pomógł: 0

O super teraz elegancko śmiga :) Dzięki :)

------------------------ [ Dodano po: 33 minutach ]

A mam jeszcze pytanko :)

Zmieniam rejestr OCR1A i spoko częstotliwość ładnie się zmienia :) a jak myślicie można by jakoś zrobić więcej niż jeden kanał takiego generatora ??

------------------------ [ Dodano po: 54 minutyach ]

Bo to co chcę osiągnąć to w zasadzie trzy kanałowy generator fali prostokątnej. W zasadzie 16 bitowy timer 1 spełnił w pełni moje oczekiwania. Przy odpowiednich obliczeniach da się zrobić regulację częstotliwości z krokiem 1Hz. Tylko jak teraz zrobić 3 kanały jak moja Atmega ma tylko jeden Timer 1 :/

Co myślicie o tym ?? Może jakiś inny sposób ??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sty 2019, o 11:29 
Offline
Użytkownik

Dołączył(a): 27 cze 2018
Posty: 116
Pomógł: 6

Innym sposobem może być osobny generator z 3 wyjściami. Nie wiem jakich parametrów potrzebujesz ale np taki układ jak SI5351A jest generatorem i ma 3 wyjścia i steruje się go i2c. Ale jak byś chciał mieć częstotliwość od 1 Hz to na wyjściu takiego układu trzeba dodać dzielnik bo minimum to 2.5 kHz.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sty 2019, o 11:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Mateo napisał(a):
O super teraz elegancko śmiga :) Dzięki :)


Bo to co chcę osiągnąć to w zasadzie trzy kanałowy generator fali prostokątnej. W zasadzie 16 bitowy timer 1 spełnił w pełni moje oczekiwania. Przy odpowiednich obliczeniach da się zrobić regulację częstotliwości z krokiem 1Hz. Tylko jak teraz zrobić 3 kanały jak moja Atmega ma tylko jeden Timer 1 :/

Co myślicie o tym ?? Może jakiś inny sposób ??


Jaki zakres częstotliwości chcesz uzyskać?

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sty 2019, o 16:34 
Offline
Użytkownik

Dołączył(a): 10 paź 2014
Posty: 55
Pomógł: 0

Zakres częstotliwości jaki chcę uzyskać to 1-100Hz, ale jak się da więcej to będzie super. Ważne dla mnie jest aby były to trzy niezależne wyjścia, których wartość widzę na ekranie LCD a same wartości zmieniam np. enkoderem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sty 2019, o 17:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Masz do dyspozycji trzy timery ale chcesz użyć 16-to bitowego jak sądzę ze względu na dokładność. Powołaj sobie do "życia" trzy timery programowe na podstawie timera sprzętowego który ustaw na generowanie przerwania dla maksymalnej zakładanej częstotliwości czyli 100Hz.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

w przerwaniu od Timera1 napędzasz swoje timery programowe
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

następnie w pętli głównej robisz coś takiego
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

gdzie zmienne "channel" ustawiasz np. za pomocą enkodera. Dla ćwiczeń możesz wpisać wartości na stałe i zobaczyć jak to działa. Dużej dokładności nie osiągniesz ale na początek może wystarczy. Trzeba poeksperymentować.

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sty 2019, o 21:01 
Offline
Użytkownik

Dołączył(a): 10 paź 2014
Posty: 55
Pomógł: 0

Ewentualnie zastosować nowość ATMELA :)

https://www.tme.eu/pl/details/atmega328 ... hip-atmel/

Posiada 3 Timery 16-bitowe :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sty 2019, o 21:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

Proszę Cię! To mają być 3 sygnały zależne, lub niezależne? W atmedze328 masz do dyspozycji 5 timerów. Możesz zrobić 5 sygnałów niezależnych(o różnych częstotliwościach).



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: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO