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

ATMEGA644P - PWM synchronizowane do 50/60Hz sieciowej

WikS 13 Lut 2013 18:22 675 0
  • #1
    WikS
    Poziom 10  
    Witam,
    na wstępie poszukiwania Google nic nie dały...

    Jaki mam problem - sterowanie jasnością dwóch żarówek (niezależnie) poprzez opto i triak z TIMER1 (OCRA/OCRB) Atmega.
    Programuję w Assemblerze.
    Wykonałem to jako fastPWM dla TIMER1 z wartością TOP w ICR1 i wartościami dla jasności w OCRA i B. Wykrywanie narastających i opadających oblicza czas połówki -> wpis do ICR, a następnie synchronizacja tak, aby zliczanie kończyło się przed opadającym. Działa, jednak widoczne jest delikatne migotanie żarówek -zmiany jasności.

    Postanowiłem zrobić to inaczej i prościej. I mam problem.

    Robię to tak - ustawiam TMER1 z prescalerem clk/8 (mam 16MHz /8), co dla połówki daje mi około 20 tys. zliczeń - skala regulacji jasności.
    Wykrywam zbocze narastające połówki (sinusoida przepuszczona przez Graetza) i


    ;_|^^ teraz zbocze narastające (w sensie przewodzenia transoptora detektora 50Hz) bo teraz jest =0 czyli Aktywny;
    ;- zapamiętaj wartość licznika TCNT (dla późniejszych skalowań i pomiaru częstotliwości)
    ;-wpis 0000 do licznika TCNT ;
    ;-wpis wartości dla A i B ;
    ;-podłącz piny A i B

    lds zl,TCNT1l ;\odczyt licznika
    lds zh,TCNT1h ;/
    sts DsfPWM_WartoscTCNT1normalAcUP,zl ;\
    sts DsfPWM_WartoscTCNT1normalAcUP+1,zh ;/

    ldi zh,0x00 ;\
    ldi zl,0x00 ;\licznik =0000 wyzerujemy, aby startowal od początku
    sts tcnt1h,zh ;/ potrzebne, bo jeśli by wielka wartość to dłużej trwa synchronizacja
    sts tcnt1l,zl ;/ chyba że jest zerowany po RESET i nie potrzeba w innym momencie resetować synchronizacji


    lds zl,DsfPWM_TMPdla_AiB ;
    lds zh,DsfPWM_TMPdla_AiB+1 ;
    sts OCR1Ah,zh ;\
    sts OCR1Al,zl ; \to wyeliminuje bum przy pierwszym
    sts OCR1Bh,zh ; /zapaleniu
    sts OCR1Bl,zl ;/

    ;TCCR1A = COM1A1=0,COM1A0=0,COM1B1=0,COM1B0=0,0,0,WGM11=0,WGM10=0 ;WGM=&0=NORMAL
    ldi r16,(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0) ;\podłączenie PINów
    sts tccr1A,r16 ; /

    zaś przed zakończeniem połówki

    ;^^|_ teraz zbocze opadajęce bo teraz jest =1 czyli Nieaktywny;
    ;- zapamiętaj wartość licznika TCNT (dla późniejszych skalowań i pomiaru częstotliwości)
    ;- odłącz piny A i B od TIMERa ;
    ;- wpisz wielkie wartości dla A i B ;
    ;- dla bezpieczeństwa -zeruj piny 'ręcznie' ;


    ldi r16,0;(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0) ;\odłączenie PINów
    sts tccr1A,r16 ; /





    in r16,EtfPWM_PORTsterowaniaLIGHT ;
    andi r16,~((1<<EtfPWM_bitOC1A_NS)|(1<<EtfPWM_bitOC1B_EW)) ;zeruj -odłączone już PINy A i B
    out EtfPWM_PORTsterowaniaLIGHT,r16 ;


    i kicha.

    Wkład zachowuje się tak
    po załączeniu lampy wygaszone.
    Po wpisaniu wartości do "DsfPWM_TMPdla_AiB" mniejszej niż górna granica zapala lampy i świecą ciągle. Wpisanie innych wartości -powyżej granicy nie powoduje już zmian. Lampy świecą do końca świata...

    Pytanie - jak ręcznie skasować wystąpienie zdarzeń A i B? Jakimiś bitami?
    Proszę o litość i pozytywną energię w odpowiedzi.
    Pozdrawiam, WikS

    [size=9]Dodano po 50 [minuty][/size]

    Czyli właściwie nie wiem, jak skasować wartości bitów OCRA1 i OCRB1 po zboczu opadającym, bo ponowne podłączenie po zboczu narastającym wykazuje, że wartość =1 jest tam nadal (odłączenie po opadającym było)...

    Narastająca wartość licznika TCNT w momencie zrównania z OCRA/B powoduje generację 1 n wyjściu. Jak ją wyzerować?

    [size=9]Dodano po 3 [godziny] 13 [minuty]:[/size]

    [...] ufff
    rozwiązałem problem.
    Przy przerwaniu opadającym zapisuję do liczników OCA i B wartośc odczytana z TCNT +np. 5 i równocześnie ustawiam bity da OCA i B wywołujace ich skasowanie przy zrównaniu. Działa!