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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 12 kwi 2025, o 08:07


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