Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega8 Przetwornik A/C i BASCOM

tabi7 26 Nov 2007 20:31 3009 4
  • #1
    tabi7
    Level 11  
    Witam
    Bardzo proszę o pomoc w obsłudze przetwornika A/C. Proszę o przykładowe lub gotowe programy spełniające określone funkcje. Program pisany jest w BASCOM.
    Chce by mikrokontroler spełniał dwa (3) zadania:
    1.) Przy pomocy potencjometru sterować wypełnieniem sygnału PWM. (0V=ok. 30% PWM, 5V=ok. 90% PWM)
    2.)

    a) Przy pomocy potencjometru zmieniać częstotliwość załączania i wyłączać wyj. w zakresie 50-150Hz. (0V=50Hz, 5V=150Hz)

    lub

    b) Przy pomocy przycisków "+" i "-" zmieniać częstotliwość Załączania i Wyłączania wyj. w zakresie 50-150Hz o skoku co 10Hz z wartością początkową 50Hz.

    To są moje pierwsze kroki w programowaniu i w związku z tym bardzo proszę o pomoc (jakieś przykładowe programy na których mógłbym się nauczyć obsługi przetwornika A/C w Atmega) w zrealizowaniu tych funkcji.

    Pozdrawiam...
  • #2
    tabi7
    Level 11  
    Macie moze jakies podobne programy na ktorych moglbym sie oprzec.
    Moze jakies ciekawe pomysly na zmiane czestotliwosci np timera0 lub timera1 potencjometrem w zakresie od 50-150Hz
    Prosze o jakies podpowiedzi...
    Pozdrawiam...
  • #3
    Sind
    Level 16  
    Witam

    Obsluga ADC w Bascom jest banalna polecam polski help Bascom Basic, napewno sie zorientujesz o co chodzi...

    Jezeli chodzi o wypelnienie PWM to na potencjometrze mozna to zrobic bez wiekszego problemu... podlacz potencjometr pomiedzy +5V i GND, nastepnie do ADC uP, a pozniej odczytaj wartosc napiecia przez getADC(), ustaw odpowiednie granice i przypisz do zmiennej, ktora to w nastepnej kolejnosci wpisz do PWM'a

    Jezeli chodzi o czestotliwosci sterowania to zrob to na Timerze. Np tak, podam przykald:

    gdybys stosowal kwarc 8Mhz i ustawil prescaler na 1 wowczas orzymasz czas rowny 128ns , wiec jak potrzebujesz min czestotliwosc 50 Hz co daje 20ms i 150 Hz co daje okolo 6,6 ms powiedzmy 6ms to bedzie okolo 166,6 Hz wiec nalezy ustalic odpowiednie wartosci przepelnienia timera.

    Mozesz to zrobic np w taki sposob ze ustawic wartosc timera poczatkowa na 250 wowczas odmierzy on czas 128ns*250 = 31,25us wstawiajac to w petle, np aby inkrementowal dopoki nie osiagnie zadanego progu u nas 150Hz czyli okolo 208 razy, bo 31,25us *208 daje nam czas okolo 150Hz... a dla 50 Hz musi inkrementowac okolo 650 razy dajac 20,3ms... (oczywiscie dobirze tak aby ten czas byl rowny lub nieco nizszy niz 20ms)

    wiec dla Ciebie zostaje tylko odczyt z portu ADC i odpowiednie przeskalowanie tego i zrobisz albo zmiane skokowa co 10Hz lub plynna co okolo 1,65Hz

    Oczywisicie pokazalem Ci tutaj jak mozna to policzyc... mozesz to sobie sam policzyc kozystajac z prostego wzoru

    czestotliwosc kwarca [Hz]/prescaler/ilosc taktow zegara/ilosc inkrementacji = wynik w [Hz]

    dodam jeszcze ze uzywajac preskalera rownego 8 dostajesz 1us, przy kwarcu 8Mhz, bo 125ns*8 a to ladna liczba i masz wowczas mozliwosc rownego dobrania czasu...

    Pozdrawiam
  • #4
    fantasta
    Level 29  
    Witam.

    Jak ustawić te granice aby przy 0 na ADC było 30% na PMW a przy 1023 na ADC było 100% na PWM.
    Chcę zrobić prosty regulator obrotów 3 silniczków DC. Podłączyć silniki do 3 wyjść PWM poprzez MOSFETy i 3 potencjometry na ADC. uC to Atmega8, chyba powinna podołać.
  • #5
    SylwekK
    Level 32  
    To już jest banalne - czysta matematyka :)

    Ja robię to w swoich projektach w ten sposób:

    Dim A As Single ' WAŻNE!
    Dim Pwm As Word 
    Dim Odczyt As Word
    '--
    ' tu konfiguracja adc i pwm
    '
    '
    '--
    Do
    Odczyt = Getadc(1)
    A = 1023 / 716                '716 bo 30% z 1023 to 307 czyli 1023-307=716
    A = Odczyt / A
    Pwm = A + 307                 'dodajemy te 30% czyli 307
    .
    .
    .
    Loop
    


    Co w efekcie dla 16-o bitowego ADC i PWM daje zmienną PWM w zakresie od 30%-100%
    W ten sposób można tworzyć dowolne granice wartości.
    Ot wszystko... ;)