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

[atmega8] Jak zaimplementować programowy PWM dla płynnego migotania 16 diod na Atmega8?

_pablo_111 22 Mar 2013 15:10 2154 5
  • #1 12096066
    _pablo_111
    Poziom 1  
    Witam , jest początkującym więc wybaczcie ewentualny brak wiedzy elektronicznej :) Posiadam moduł AVT1622 z Atmega8 ,potrafię zaprogramować go tak aby diody zapalały się w różnych wariantach ( jedne gasną inne się zapalają ITD ) :) to jest dosyć proste :) Utknąłem jednak przy programowym PWM którego na ten czas w ogóle nie rozumiem , to znaczy rozumiem jego zasadę działania ale nie wiem jak to ugryźć programowo.
    Chcę zrobić prosty program który będzie zapalał po kolei diody podłączone do wszystkich wyjść Atmegi ( 16 sztuk, ale w jednym momencie będzie zapalona tylko jedna dioda) Problem w tym że chce aby zapalały się i gasły w sposób płynny właśnie za pomocą programowego PWM ( jeden cykl może trwać około 1-2 sek ). Chce uzyskać taki efekt migotania gwiazd :) Pozdrawiam
  • #2 12097058
    BlueDraco
    Specjalista - Mikrokontrolery
    Potrzebujesz przerwania timera zgłaszanego ze stałą częstotliwością ok. 300 * liczba_poziomow_jasnosci Hz. Poszukaj u Atmela noty aplikacyjnej nt. programowego PWM - jest to tam b. dobrze wyjaśnione.
  • #3 12105060
    zbyszek_kn
    Poziom 11  
    Jest to proste korzystasz z przerwań jakie generuje timer0 podobnie jak to opisał kolega z innego tematu tego fora w bascom napisał

    '************* Konfiguracja uC *****************
    '***********************************************
    $regfile = "attiny2313.dat"
    $crystal = 16000000

    Config Portb = &B11111111 : Portb = &B11111111
    Config Portd = &B11111111 : Portd = &B11111111

    Config Timer0 = Timer , Prescale = 8
    Enable Timer0 : On Timer0 Prztimer0
    Enable Interrupts
    '********** Konfiguracja uC Koniec ************

    '****************** Nazwy *******************
    '***********************************************
    Rd Alias Portb.0
    Gd Alias Portb.1
    Bd Alias Portb.2
    '************* Nazwy Koniec ****************

    '****************** Zmienne *******************
    '***********************************************
    Dim Licznik As Byte
    Dim Rled As Byte , Bled As Byte , Gled As Byte
    '************* Zmienne Koniec ****************

    '************ Warunki Poczatkowe ***************
    '***********************************************
    Rled = 80
    Gled = 0
    Bled = 90
    '******* Warunki Poczatkowe Koniec ***********

    '************** Petla glowna ******************
    '***********************************************
    Do

    Loop
    End
    '************ Petla glowna Koniec **************

    '************ Przerwanie timer 0 ***************
    '***********************************************
    Prztimer0:
    Incr Licznik
    If Licznik = 100 Then Licznik = 0

    If Licznik < Rled Then Set Rd Else Reset Rd
    If Licznik < Gled Then Set Gd Else Reset Gd
    If Licznik < Bled Then Set Bd Else Reset Bd
    Return
    '******** Przerwanie timer 0 Koniec ************

    TCCR2=_BV(WGM21)|_BV(CS22)|_BV(CS21)|_BV(CS20); //prescaler 1024


    //Kierunek portów
    DDRB=0b11111111;
    DDRC=0b11111111;
    DDRD=0b11111111;

    PORTB=0xff;
    PORTC=0xff;
    PORTD=0xff;

    while(1)
    {

    for(i=0;i<250;i++)
    {
    OCR2 = i;
    LED_0_ON;
    _delay_ms(2000);
    }
    for(i=250;i>0;i--)
    {
    OCR2 = i;
    LED_0_OFF;
    _delay_ms(2000);
    }

    }
    return 0;
    }


    tylko dane i odwołania w pętlach if then zmienić i masz gotowy program


    zastanawiam się czy nie zrobić stronki opisującej wiele możliwości programowania sygnałów PWM na mikrolontrolerach Atmega i Cortex czyli stm32
    la to będzie w ramach wolnego czasu realizowane
    Zbyszek

    Proszę poprawić treść wiadomości - regulamin p.3.1.13, a kod umieścić w tagach SYNTAX.
    [zumek]
  • #4 12105084
    BlueDraco
    Specjalista - Mikrokontrolery
    zbyszek: program, który pokazałeś jest błędny. Atmel w nocie aplikacyjnej zrobił to dobrze, więc już może lepiej nie kombinować.

    Zrobiłem softPWM na STM32F - pewnie gdzieś się ukaże...
  • #5 12105099
    zbyszek_kn
    Poziom 11  
    BlueDraco napisał:
    Potrzebujesz przerwania timera zgłaszanego ze stałą częstotliwością ok. 300 * liczba_poziomow_jasnosci Hz. Poszukaj u Atmela noty aplikacyjnej nt. programowego PWM - jest to tam b. dobrze wyjaśnione.

    Po angielsku niestety noty są objaśnione ale nie w prosty sposób tylko zawile
    Niestety mało jest stron gdzie objaśniono sposób używania PWM w procesorze Atmega
  • #6 12105247
    SylwekK
    Poziom 32  
    Jakby to miało być w BASCOM to tu masz gotowe rozwiązanie nawet dla 32 LED:BIEGNĄCE PWM

    Przykładowy efekt działania programu ilustruje film:



REKLAMA