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

[C++][Atmega16] - Jak wygenerować takie przebiegi?

PJimi 27 Cze 2013 15:15 2361 12
REKLAMA
  • #1 12462247
    PJimi
    Poziom 13  
    Posty: 115
    Ocena: 7
    Mam problem z wygenerowaniem takich przebiegów jak z załącznika.
    Do dyspozycji mam Atmega16. Tak jak widać na załączonym obrazku potrzebuję trzy PWMy o częstotliwości 10ms przesunięte o ok.6.7ms względem siebie.
    Do tego potrzebuje jeszcze mieć możliwość zadawania przesunięcia tego układu trzech sygnałów względem zera jednej z faz.
    Powiedzmy, że mam na przerwaniu zewnętrznym, programowo wykrywany jakiś konkretny moment (zero) - to względem tego momentu chciałbym przesuwać w czasie układ przebiegów jak z załącznika.
    Nie oczekuję gotowego kodu C++ a jedynie rozwiązania ideowego - propozycji co do algorytmu / oprogramowania.
    Bardzo dziękuję za pomoc.

    [C++][Atmega16] - Jak wygenerować takie przebiegi?
  • REKLAMA
  • #2 12475325
    Eagle
    Poziom 24  
    Posty: 536
    Pomógł: 57
    Ocena: 31
    Jest tak wiele zmiennych, że wybór optymalnego algorytmu zależy od środowiska którym dysponujesz:

    - czy uC będzie miał jeszcze jakieś zadania ?
    - jaki będzie gradient czasu pomiędzy zmianami w poszczególnych sygnałach.
    - jak będzie zadawana zmiana wypełnienia, bo okres jest stały 10ms ?

    Moja magiczna kula ze względu na ładną pogodę wywróżyła:
    - uC nie będzie nic innego robił
    - gradient będzie na poziomie 0,5 ms
    - zmiana będzie możliwa po interface szeregowym ISP/RS

    więc najprościej będzie uruchomić jeden timer z przerwaniem 0,5ms i programowo zrealizować 3 x PWM zależne od siebie, synchronizowany zerem z przerwania zewnętrznego.

    p.s.
    1)
    Cytat:
    o częstotliwości 10ms

    2) czy to nie powinno być w dziale uC ?
  • REKLAMA
  • #3 12475440
    PJimi
    Poziom 13  
    Posty: 115
    Ocena: 7
    Odpowiadając na Twoje pytania:
    1. Tak. Procesor ma jeszcze kilka zadań. Między innymi multipleksowany pomiar przetwornikiem ADC na 4 kanałach.
    2. Nie do końca rozumiem o co pytasz pisząc "jaki będzie gradient czasu pomiędzy zmianami w poszczególnych sygnałach." Sygnały powinny się zmieniać praktycznie jednocześnie (oczywiście cały czas ich wypełnienie jest takie samo a zmienia się jedynie ich przesunięcie względem pkt zera wykrywanego przerwaniem zewnetrznym).
    3. Tak - okres jest stały. 10ms to czas trwania połowy sinusoidy - czyli czas między dwoma przejściami napięcia przez zero.

    Procesor jest taktowany sygnałem wewnętrznego zegara 8MHz. Już zdążyłem się połapać, że przy tak szybkim zegarze taktującym pomiaru ADC na 4 kanałach nie mogę wykonywać zbyt często bo powstające pądy impulsowe zaśmiecają wynik pomiaru na poszczególnych kanałach (mam jakieś dziwne częściowe sumowanie i nakładanie się pomiarów). Dlatego dokonuje pomiaru sygnału napięcia sterowania 0-10 VDC we większych odstępach czasu. To właśnie poziom tego sygnału definiuje mi przesunięcie sygnałów PWM o stałym wypełnieniu względem zera. Skoro więc sam sygnał mierzę co jakiś dłuższy czas - to zmiany też mogą odbywać się rzadziej - nie ma to znaczenia dla działania urządzenia.

    Niestety nie do końca rozumiem Twoją propozycję rozwiązania problemu. Na tę chwilę mam uruchomione przerwanie zewnętrzne od zera i 3xPWM. Ale nie rozumiem koncepcji ze sterowaniem PWMów z jednego timera. Przecież z każdym PWM jest ściśle związany jeden timer oraz jedna z nóżek procesora.
  • #4 12475617
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    Propozycja kolegi jest jak najbardziej sensowna...

    W timerze0 (który ustawiasz na np 1ms) w środku dajesz 3 liczniki, które inkrementujesz co tyknięcie zegara, po czym sprawdzasz czy licznik przekroczył zadaną przez ciebie wartość i w zależności od tego albo resetujesz albo ustawiasz wartość na nodze która cię interesuje... co pozwala ci nawet na attiny 2313 ustawić 8 pwm'ów.

    Trzeba jeszcze ogarnąć czasowo adc ale zacznij od timera i pwm'ów...

    Zasadniczo pomogło by, gdybyś powiedział czy przypadkiem nie chcesz zrobić jakiegoś falownika czy innego urządzenia, bo bardzo często bywa tak, że różne problemy które tu koledzy przedstawiają, owijając je mgłą tajemnicy, już dawno zostały zrobione, lub może się okazać że trzeba zabrać się do tego zupełnie inaczej...
  • REKLAMA
  • #5 12478122
    PJimi
    Poziom 13  
    Posty: 115
    Ocena: 7
    No oczywiście, że buduje trójfazowy sterownik mocy na tyrystorach.
    Czyli rozumiem, że sugerujecie nie korzystanie ze sprzętowych PWM i przypisanych do nich pinów tylko stworzenie sobie swoich własnych przebiegów formowanych przy pomocy liczników iinkrementowanych i potem odpowiednio wyzwalających sygnały w timerze0 uruchamianym w przerwaniu od zera sieci, zgadza się?
  • #6 12492009
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    no zgadza się...

    zbudowanie falownika nie jest wcale takie proste... poza tym jakie są założenia projektu ??? czy tylko generowane przebiegi czy zmiana częstotliwości też ma być zaimplementowana ?? czy będzie softstart ?? czy badałeś kiedyś przebiegi prawdziwego falownika (prądy jakie występują podczas startu, zmiany prędkości stopu) ??

    poza tym ja bym raczej nie zastosował do tego Atmegi16... tylko jakiś procesorek FPGA (jeżeli to na studia to polecam Spartana3E) i wtedy w VHDL'u będzie to można wszystko ładnie opisać... jeżeli się mylę to proszę poprawić...
  • REKLAMA
  • #7 12492183
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Rozumiem, że rozwiązanie polegające na wyborze współczesnego mikrokontrolera z timerem, który bezproblemowo realizuje taką funkcję w sprzęcie, odpada ze względu na trywialność oraz zbyt niską cenę takiego mikrokontrolera (na ogół niższa od ATmega16)...

    To NIE jest procesor do takiego zastosowania. Weź coś, co się do tego nadaje - np. DSP albo jakiś Cortex.
  • #8 12492423
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2205
    BlueDraco napisał:
    Rozumiem, że rozwiązanie polegające na wyborze współczesnego mikrokontrolera z timerem, który bezproblemowo realizuje taką funkcję w sprzęcie, odpada ze względu na trywialność oraz zbyt niską cenę takiego mikrokontrolera (na ogół niższa od ATmega16)...

    To NIE jest procesor do takiego zastosowania. Weź coś, co się do tego nadaje - np. DSP albo jakiś Cortex.


    Przesadzasz. Są serie ATTiny posiadające peryferia służące do realizacji takich celów - właśnie falownikow, sterownikow silników itd.
  • #9 12495775
    blue_17
    Poziom 32  
    Posty: 2414
    Pomógł: 172
    Ocena: 472
    Jeśli chcesz bawić w taki sposób to zajrzyj do dsPic-ów one są do tego stworzone i mają już specjalne bloki sprzętowe to realizujące microchip podaje przykładowe kody sterowania silnikami bldc możesz podpatrzyć :)

    Pozdrawiam
  • #10 12496979
    archanoid
    Poziom 26  
    Posty: 867
    Pomógł: 76
    Ocena: 250
    Witam. A może tak jak zauważył kolega blue_17 w stronę Microchipa tylko nie od razu w dsPIC ale PIC18 . Przykładowo PIC18F26K22 ma 3 timery 16 bitowe , 3 timery 8 bitowe i jeden konfigurowalny jako 8 lub 16 bitowy. Posiada przetwornik ADC i 3 zewnętrzne przerwania . A i koszt jest porównywalny z ATmegą 16.
  • #11 12497091
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2205
    Ale po co, skoro to samo mają ATTiny, które mają tą zaletę, że są AVRami, więc, autor nie będzie miał problemu z przesiadką.
  • #12 12497222
    archanoid
    Poziom 26  
    Posty: 867
    Pomógł: 76
    Ocena: 250
    Witam. Oczywiście można zastosować ATTiny461 . Ale jeśli kolega buduje trójfazowy sterownik tyrystorowy to warto by synchronizację mieć z trzech faz a nie z jednej i obliczać przesunięcia .
  • #13 12511617
    Konto nie istnieje
    Konto nie istnieje  

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik ma problem z generowaniem trzech sygnałów PWM o częstotliwości 10 ms, przesuniętych o 6,7 ms względem siebie, na mikrokontrolerze Atmega16. W odpowiedziach zaproponowano użycie timerów do synchronizacji sygnałów oraz programowe generowanie PWM. Zasugerowano również, że Atmega16 może nie być najlepszym wyborem do tego zadania, a lepsze mogą być mikrokontrolery z bardziej zaawansowanymi funkcjami, takie jak dsPIC, PIC18 lub AT90PWM3B, które mają wbudowane funkcje PWM. Wskazano na potrzebę synchronizacji z trzema fazami oraz na wyzwania związane z pomiarami ADC.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA