Puls-weiten-modulation (PWM), die auf AVR-Studio
Ich versuche, PWM eine LED an einen ATmega8, einen pin von port B. einrichten der Timer wurde ärgerlich, und ich weiß nicht, was zu tun mit meiner OCR1A. Hier ist mein code, und ich würde gerne etwas feedback.
Ich versuche nur, um herauszufinden, wie die Verwendung von PWM. Ich weiß, das Konzept, und OCR1A soll der Bruchteil des gesamten Zähler wollt ich mal den Puls auf.
#define F_CPU 1000000 //1 MHz
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
int main(void){
TCCR1A |= (1 << CS10) | (1 << CS12) | (1 << CS11);
OCR1A = 0x0000;
TCCR1A |= ( 0 << WGM11 ) | ( 1 << WGM10 ) | (WGM12 << 1) | (WGM13 << 0);
TCCR1A |= ( 1 << COM1A0 ) | ( 0 << COM1A1 );
TIMSK |= (1 << TOIE1); //Enable timer interrupt
DDRB = 0xFF;
sei(); //Enable global interrupts
PORTB = 0b00000000;
while(1)
{
OCR1A = 0x00FF; //I'm trying to get the timer to alternate being on for 100% of the time,
_delay_ms(200);
OCR1A = 0x0066; //Then 50%
_delay_ms(200);
OCR1A = 0x0000; //Then 0%
_delay_ms(200);
}
}
ISR (TIMER1_COMA_vect) //timer0 overflow interrupt
{
PORTB =~ PORTB;
}
- Beantwortet, poste es morgen (nach 8 Stunden).
- Für ein tieferes Verständnis empfehle ich die Lektüre des Datenblattes: atmel.com/Images/doc2486.pdf
- Habe nicht viel hinzuzufügen, um die Diskussion nur ein kleiner Hinweis, dass das Umschalten eine pin ist schneller, wenn Sie tun
PINB = 0xff
stattPORTB = ~PORTB
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, das ist nicht die Art und Weise, wie Sie tun sollten, eine PWM. Zum Beispiel, wie legen Sie eine PWM-rate von beispielsweise 42% mit ihm? Auch die code-Größe ist groß, es kann getan werden, in einer viel effizienteren Art und Weise. Auch, verschwenden Sie ein 16-bit timer 8-bit-Operationen. Hast du 2x 8 bit Timer (Timer/Counter 0 und 2), und ein 16 bit timer,
Timer/Counter 1
.Es ist auch eine schlechte Idee, unbenutzte portpins auf Ausgang. Alle portpins, die mit nichts verbunden, sollte wie Eingänge.
Der ATmega8 hat einen built-in-PWM-generator auf Timer 1 und 2, gibt es keine Notwendigkeit in der Simulation durch software. Sie haben nicht einmal Ihre ports manuell (Sie müssen nur das entsprechende portpin auf Ausgang)
Sie brauchen nicht einmal unterbrechen.
Beachten Sie, dass Sie verwenden können, eine weitere LED mit einem anderen PWM mit den gleichen timer und Einstellung OCR2B statt OCR2A. Vergessen Sie nicht die TCCR2A zu aktivieren OCR2B als Ausgang für deine PWM, wie in diesem Beispiel nur OCR2A ist erlaubt.
TCCR2 = (1 << FOC2) | (1 << CS20);
das ist das gleiche wie tunTCCR2 = 0x81;
aber jetzt können Sie eigentlich Lesen, welche bits gesetzt sindMüssen Sie initialisieren Ihre OCR1A mit diesen beiden Zeilen:
Und dann dieses:
Sind und wissen, dass der Bereich ist 0 bis 255. Zählen Sie Ihre Prozente, und dort haben Sie es!