Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega16 - FAST PWM i Timer 2

pawel_konin 03 Mar 2013 21:55 2133 12
  • #1 03 Mar 2013 21:55
    pawel_konin
    Poziom 20  

    Ad 1
    Chciałbym poprzez tranzystory IGBT przełączać 230VAC
    Myślalem nad zastosowaniem takiego rozwiązania
    OCRx--->driver IGBT--->para tranzystorów.
    To w ogóle ma szanse się powieść przy silniku o mocy max 1,5A największy ??
    Problem:
    Gdy przetwornik działa w trybie Free Running i wciśnięciu przycisku podłączonego pod PC4 w timerze 2 zmienia się drastycznie częstotliwość migania i chyba przechodzi w tryb asynchroniczny z którego nie można wyjść nawet poprzez inna konfiguracje timera2.
    Oraz gdy działa adc nie działa obsługa przycisków która wcześniej działała prawidłowo.
    Mam nadzieję że, teraz temat nie zostanie przeniesiony do kosza.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 12
  • #2 03 Mar 2013 22:18
    BlueDraco
    Specjalista - Mikrokontrolery

    Przy tak zaprogramowanym przetworniku ADC większość czasu spędzasz w procedurze przerwania przetwornika.

    Użyj timera do czytania ADC i wyzwalania następnego pomiaru, to będziesz wiedział przynajmniej jak często mierzysz.
    Ogólnie: mało jest projektów, w których korzystanie z przerwania ADC ma sens - to pułapka, na którą łapie się wielu początkujących.

    0
  • #3 03 Mar 2013 23:33
    pawel_konin
    Poziom 20  

    BlueDraco napisał:
    Przy tak zaprogramowanym przetworniku ADC większość czasu spędzasz w procedurze przerwania przetwornika.

    Użyj timera do czytania ADC i wyzwalania następnego pomiaru, to będziesz wiedział przynajmniej jak często mierzysz.
    Ogólnie: mało jest projektów, w których korzystanie z przerwania ADC ma sens - to pułapka, na którą łapie się wielu początkujących.


    A co w takim przypadku jest większym złem:

    - czekać w przerwaniu lecz moc wykorzystać tani czujnik np LM35(procedura obsługi przerwania przelicza staly przecinek na stopnie)
    - czy zaangażować procesor w zmienny przecinek ale zużyć dużo pamięci

    Do takiego mierzenia mogę jedynie użyć Timer 0 taki mi się został wolny.
    Co jakie interwały czasowe wyzwalać konwersje ADC czy może jako przerwanie od timera uruchamiać timer i w pętli np głównej while sprawdzać flagę zakończenia konwersji i przeliczać wynik??

    PS: ktoś zna odpowiedź na 1 pytanie??

    0
  • #4 04 Mar 2013 08:02
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie wiem po co Ci ten zmienny przecinek - chyba nie ma problemu z policzeniem wszystkiego na liczbach całkowitych. Nie wiem też, na co miałbyś czekać w przerwaniu. Możesz do wszystkiego używać jednego timera, np. tego od PWM - to zwykle lepsze rozwiązanie niż zgłaszanie przerwań z kilku timerów.

    Sam zadecyduj, jak często chcesz wykonywać pomiary - od tego zacznij.

    Napisałem wyżej: w przerwaniu timera czytasz poprzedni pomiar, przetwarzasz i startujesz następny. W ten sposób na nic nie czekasz, bo wynik jest zawsze gotowy po upłynięciu okresu pomiędzy przerwaniami.

    0
  • #5 04 Mar 2013 19:15
    pawel_konin
    Poziom 20  

    BlueDraco napisał:
    Nie wiem po co Ci ten zmienny przecinek - chyba nie ma problemu z policzeniem wszystkiego na liczbach całkowitych. Nie wiem też, na co miałbyś czekać w przerwaniu. Możesz do wszystkiego używać jednego timera, np. tego od PWM - to zwykle lepsze rozwiązanie niż zgłaszanie przerwań z kilku timerów.

    Sam zadecyduj, jak często chcesz wykonywać pomiary - od tego zacznij.

    Napisałem wyżej: w przerwaniu timera czytasz poprzedni pomiar, przetwarzasz i startujesz następny. W ten sposób na nic nie czekasz, bo wynik jest zawsze gotowy po upłynięciu okresu pomiędzy przerwaniami.


    Nie jestem pewny czy tak to powinno być. Jakby co to poproszę o korekcje, jeśli chciałbym wykorzystać więcej kanałów do pomiaru to za wynikiem przetwarzania wystarczy skasować poprzedni kanał i ustawić następny??
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 04 Mar 2013 19:26
    BlueDraco
    Specjalista - Mikrokontrolery

    Z grubsza tak.

    Czy w tym:
    wynik=(ADC*25600UL)/(1024UL);

    Chodziło Ci o to?:
    wynik = (unsigned long)ADC*25;

    0
  • #7 04 Mar 2013 19:33
    pawel_konin
    Poziom 20  

    BlueDraco napisał:
    Z grubsza tak.

    Czy w tym:
    wynik=(ADC*25600UL)/(1024UL);

    Chodziło Ci o to?:
    wynik = (unsigned long)ADC*25;


    Chodziło mi o wynik=(ADC*25600UL)/(1024UL)
    i po nim wystartowanie np ADC 2 uruchomienie konwersji.

    A uruchomienie przetwarzania powinno być zaraz w konfiguracji jeżeli chce się odczytać pierwszy pomiar?
    Taka konfiguracja adc nie będzie sie w zaden sposób kłócic z timer2??
    Bo doczytałem właśnie że bit ADATE ma właśnie jakiś wpływ na timer 2
    Z grubsza tzn co powinno się tam jeszcze znaleźć??

    0
  • #8 04 Mar 2013 19:40
    BlueDraco
    Specjalista - Mikrokontrolery

    Moim zdaniem jest dobrze, z dokładnością do bezsensownego mnożenia przez 25 * 1024 i dzielenia przez 1024.

    Pierwszy pomiar możesz wystartować przy inicjowaniu całości, wtedy w przerwaniu timera nie musisz sprawdzać gotowości ADC bo wiadomo, że zawsze będzie gotowy - zawsze to parę instrukcji mniej w przerwaniu.

    0
  • #9 04 Mar 2013 20:20
    pawel_konin
    Poziom 20  

    BlueDraco napisał:
    Moim zdaniem jest dobrze, z dokładnością do bezsensownego mnożenia przez 25 * 1024 i dzielenia przez 1024.

    Pierwszy pomiar możesz wystartować przy inicjowaniu całości, wtedy w przerwaniu timera nie musisz sprawdzać gotowości ADC bo wiadomo, że zawsze będzie gotowy - zawsze to parę instrukcji mniej w przerwaniu.


    Faktycznie dla LM35DZ(0-100°C) to mnożenie jest bez sensu bo tylko fałszuje odczyt. Chyba lepiej by było pomnożyć przez 100 ale jak tu teraz postawić przecinek żeby osiągnąć np 43.1° ??

    0
  • #10 04 Mar 2013 21:12
    BlueDraco
    Specjalista - Mikrokontrolery

    Możesz trzymać temperaturę w dziesiątych częściach stopnia - tak będzie dużo łatwiej i szybciej niż bawić się w ułamki.

    0
  • #11 05 Mar 2013 13:09
    pawel_konin
    Poziom 20  

    BlueDraco napisał:
    Możesz trzymać temperaturę w dziesiątych częściach stopnia - tak będzie dużo łatwiej i szybciej niż bawić się w ułamki.

    Tylko że, chciałbym potem to wyświetlić na wyświetlaczu w sposób przyjazny dla użytkownika. Czy aby na pewno dobrym sposobem jest użycie funkcji strlen i memmove może kolega w jakiś inny sposób to by zrobił??
    Na pierwsze pytanie jest ktoś w stanie odpowiedzieć??

    0
  • Pomocny post
    #12 05 Mar 2013 13:32
    BlueDraco
    Specjalista - Mikrokontrolery

    To wyświetl wartość podzieloną przez 10, przecinek i resztę z dzielenia przez 10. :)

    0
  • #13 05 Mar 2013 14:08
    pawel_konin
    Poziom 20  

    BlueDraco napisał:
    To wyświetl wartość podzieloną przez 10, przecinek i resztę z dzielenia przez 10. :)

    Podział na dekady jednostek i dekada dziesiątek?

    Odnośnie 1 pytania:
    pozwoliłem sobie znalezione wtedy rozwiązanie przelać na schemat jak ewentualnie mogło by to wyglądać bo bez schematu to nikt mi nie pomorze. Fajnie by było wiedzieć czy to wierutnie bzdury którymi nie warto zawracać głowy czy ma to jakiekolwiek zastosowanie. Z tamtego opisu wyglądało że, najpierw podaje się wypełnienie PWM na górne tranzystory które kluczują górną sinusoidę a w tym samym czasie dolne nie przewodzą, potem role się chyba odwracają tak to szło wywnioskować gdyż wypełnienie było również w dolnej części sinusa.Przed tranzystorami i na wyjściu też był chyba kondensator. Na owym schemacie był tylko mostek H z tranzystorów IGBT wiec myślę że, bez drivera nawet hipotetycznie to nie miało prawa działać.
    Może teraz po sprecyzowaniu ktoś odpowie
    Atmega16 - FAST PWM i Timer 2

    0