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 2190 12
REKLAMA
  • #1 12462247
    PJimi
    Poziom 13  
    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  
    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 ?
  • #3 12475440
    PJimi
    Poziom 13  
    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.
  • REKLAMA
  • #4 12475617
    cepelia
    Poziom 20  
    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  
    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  
    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ć...
  • #7 12492183
    BlueDraco
    Specjalista - Mikrokontrolery
    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.
  • REKLAMA
  • #8 12492423
    tmf
    VIP Zasłużony dla elektroda
    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.
  • #10 12496979
    archanoid
    Poziom 26  
    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
    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  
    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  
REKLAMA