سؤال

أحاول استخدام PWM على الصمام على ATmega8 أي دبوس ميناء B.إعداد توقيت كان مزعج و أنا لا أعرف ما يجب القيام به مع بلدي OCR1A.هنا هو بلدي رمز وأحب بعض ردود الفعل.

أنا فقط أحاول معرفة كيفية استخدام PWM.أنا أعرف مفهوم ، OCR1A هو من المفترض أن يكون جزء من كل عداد الوقت أريد نبض على.

#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;
}
هل كانت مفيدة؟

المحلول 2

تحتاج إلى تهيئة OCR1A الخاص بك مع هذين السطرين: giveacodicetagpre.

ثم استخدم هذا: giveacodicetagpre.

ومعرفة أن النطاق هو 0-255.عد النسب المئوية الخاصة بك، وهناك لديك! giveacodicetagpre.

نصائح أخرى

لا, هذا هو لا كيف السبيل يجب أن تفعل PWM.على سبيل المثال, كيف يمكنك وضع PWM معدل ، على سبيل المثال ، 42% مع ذلك ؟ أيضا رمز حجم كبير ، ويمكن أن يتم ذلك بطريقة أكثر كفاءة.أيضا, أنت تضيع 16 بت توقيت للقيام 8 بت العمليات.لديك 2x 8 بت أجهزة ضبط الوقت (الموقت/عداد 0 و 2) و واحد 16 بت الموقت ، Timer/Counter 1.

كما أنها فكرة سيئة مجموعة غير المستخدمة portpins إلى الإخراج.كل portpins التي لا ترتبط بأي شيء ، ينبغي أن تترك كما المدخلات.

على ATmega8 لديه المدمج في PWM مولد على توقيت 1 و 2 ، هناك حاجة في محاكاة ذلك من خلال البرنامج.أنت لا تملك حتى أن تعيين المنافذ يدويا (لديك فقط لتحديد المقابلة portpin إلى إخراج)

حتى أنك لا تحتاج إلى أي يقطع.

#define fillrate OCR2A 


 //...

 // main()

PORTB=0x00;
DDRB=0x08;  //We use PORTB.3 as output, for OC2A, see the atmega8 reference manual

// Mode: Phase correct PWM top=0xFF
// OC2A output: Non-Inverted PWM
TCCR2A=0x81;
// Set the speed here, it will depend on your clock rate.
TCCR2B=0x02;

// for example, this will alternate between 75% and 42% PWM
while(1)
{
    fillrate = 191; // ca. 75% PWM
    delay_ms(2000);

    fillrate = 107; // ca. 42% PWM
    delay_ms(2000);
}

لاحظ أنه يمكنك استخدام آخر LED مع آخر PWM, باستخدام نفس توقيت الإعداد OCR2B بدلا من OCR2A.لا تنسى أن تعيين TCCR2A لتمكين OCR2B كما الإخراج الخاص بك PWM, كما في هذا المثال فقط OCR2A هو مسموح به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top