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



Teraz jest 4 maja 2025, o 18:22


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 15 lut 2015, o 18:31 
Offline
Nowy

Dołączył(a): 11 lut 2015
Posty: 7
Pomógł: 0

Witam

Tworzę program pod ATMEGA88 do falownika. Wykorzystuje sprzętowy PWM. Co 0,1ms generuje przerwanie na wykonanie którego mam jedynie 2000cykli (taktowanie 20MHZ). W każdym przerwaniu muszę wyliczyć wartość próbki przebiegu sinusoidalnego no i mam problem... Otóż, operując na zmiennych globalnych (PI, licznik, fpwm) przeliczenie i wygenerowanie wartości sinusa zajmuje ponad 3000cykli... Zauważyłem że jeśli będą to wartości zadeklarowane wewnątrz przerwania, jako lokalne, wyliczenie nowej próbki zajmuje ok. 100 cykli, jednakże jak wiadomo po wyjściu z przerwania tracę wartości tych zmiennych które są mi potrzebne w następnym wywołaniu tego przerwania.


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


UWAGA! funkcja "proba" jest tutaj w zastępstwie dla przerwania, gdyż symulator AVR Studio nie dawał rady inaczej. Proszę traktować jako przerwanie.

Nie mogę zmniejszać częstotliwości PWM dla otrzymania większej ilości cykli na obsługę przerwania gdyż to mija się z celem.

Proszę mi powiedzieć co zrobić? Już kombinowałem nad tym by co przerwanie wrzucać wartości zmiennych globalnych do lokalnych i operacje wyliczenia sinusa wykonać na lokalnych ale on wtedy znów robi to przez ok 3000 taktów. Próbowałem też na zmiennych static - zachowuje się tak jak na globalnych.

Pomożecie? ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2015, o 21:30 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Jak chcesz mieć szybko to nie licz sinusa tylko skorzystaj z tablicy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pozbądź się też liczb zmiennoprzecinkowych, bo w końcu wynik i tak jest liczbą całkowitą, którą wpisujesz do OCRx.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2015, o 22:29 
Offline
Nowy

Dołączył(a): 11 lut 2015
Posty: 7
Pomógł: 0

Nie mogę tutaj skorzystać z tablicy wartości dla jednego okresu sinusa dlatego że falownik ma regulowaną częstotliwość od 0 do 50Hz nie mówiąc że muszę uzyskać przesunięcie fazowe. Może i dało by się tak zrobić ale wymagałoby to bardzo dużej tablicy. Mój pomysł jest dobry tylko mam problem z tym pobraniem zmiennych...

Przed chwilą próbowałem użyć register variable ale to nie przyspiesza wcale wykonania operacji... Jak przechować lokalną zmienną utworzoną w przerwaniu by w następnym przerwaniu mógłbym ją odzyskać? Są jakieś sposoby chociaż na tzw "pałe"?

Jak to możliwe że dla przykładu mam 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.


i ten kod wykona się w zaledwie kilkadziesiąt cykli



a sama operacja wyliczenia sinusa w tym kodzie:...

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


...potrzebuje ponad 3000 cykli.

Być może gdzieś robię jakiś błąd... To mój pierwszy program w C no ale bez przesady ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lut 2015, o 00:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

modyfikator static
tylko ta zmienna i tak ląduje w zmiennych globalnych



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lut 2015, o 18:00 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Pierwszy z twoich kodów oblicza sinusa ze znanej liczby. Procesor nie będzie tego robił. Kompilator to obliczy i wstawi tam od razu wartość. W drugim przypadku argument nie jest znany na etapie kompilacji i procesor będzie musiał to wyliczać za każdym razem. Stąd dłuższy kod.
lukaszSZ999 napisał(a):
Nie mogę tutaj skorzystać z tablicy wartości dla jednego okresu sinusa dlatego że falownik ma regulowaną częstotliwość od 0 do 50Hz nie mówiąc że muszę uzyskać przesunięcie fazowe.

Nie wydaje mi się. Może czegoś nie wiem. Przykład 1:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lut 2015, o 20:31 
Offline
Nowy

Dołączył(a): 11 lut 2015
Posty: 7
Pomógł: 0

Dobrze, otworzyłem się jednak na koncepcje wykorzystania tablicy z wartościami sinusa ;D

Dziękuję Wam bardzo... ferie po sesji coraz krótsze więc mam nadzieję że zdążę ;)

Mam już zaprojektowaną płytkę drukowaną więc tylko polutować, załadować program i wiiioo ;)

Będziemy w kontakcie:)

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lut 2015, o 23:32 
Offline
Nowy

Dołączył(a): 11 lut 2015
Posty: 7
Pomógł: 0

To ostatecznie przy dużych ADCH mogłoby dojść do sytuacji że co przerwanie przeskakuje o tyle komórek że to już nie byłby sinus a jakaś pokraka... I tutaj lekarstwem byłaby bardzo duża tablica



Ostatnio edytowano 22 lut 2015, o 21:53 przez lukaszSZ999, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lut 2015, o 23:12 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

lukaszSZ999 napisał(a):
No i w 350 cykli się wyrabia ;D

A jakby ustawić timery na preskaler 1, tablicę zmniejszyć do 256 bajtów i zmienne i, faza1, faza2, faza3 zrobić 8-bitowe oraz wyrzucić oczekiwanie na zakończenie konwersji z przerwania.
Kąty można przeliczyć.
Wynik z ADCH przepisywać do bufora w przerwaniu od zakończenia konwersji.

lukaszSZ999 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.

To jest bez sensu, bo ADCH ma maksymalnie 255 i po podzieleniu całkowitym przez 256 wyjdzie 0.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 19:33 
Offline
Nowy

Dołączył(a): 11 lut 2015
Posty: 7
Pomógł: 0

No dobrze

Puściłem już ładnie przez filtr RC i mam sinusoide z regulacją czestotliwosci ale za chiny ludowe nie mogę regulować amplitudy. Wydawałoby się to proste.

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


Niestety za żadne skarby nie chce łykać liczb z przedziału 0>amplituda>1 mimo że robię rzutowanie. Pomóżcie proszę to ręce opadają. Nawet gdy zamiast "amplituda" pomnoże razy 0.5 też to nie przechodzi

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


Dziękuję;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 23:00 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

lukaszSZ999 napisał(a):
amplituda =ADCH/255;                        //amplituda jako float

Tak na pewno jest źle. Powinno być 255.0

Tak w ogóle to po co ci ten float? Wpisz po prostu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Najpierw wykona się mnożenie, a potem dzielenie i wynik będzie poprawny.

_________________
Dragonus Cracovus: Biomagia



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 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