arduino uno fast pwm pin5 / 6 - PullRequest
       53

arduino uno fast pwm pin5 / 6

0 голосов
/ 17 февраля 2020

Я использую timer0 для создания быстрого ШИМ на цифровом штырьке 5/6.

Мне удалось получить статистику c ШИМ.

Следующая задача - переключаться между значениями от 50 до 200 и обратно 50 и так далее.

Здесь возникает проблема. Если я наблюдаю за значениями, сгенерированными на выводе, pwm часто имеет размер 50, а затем меняется на 200. Если я печатаю значения на последовательном мониторе, я получаю нужные значения обратно.

ВОПРОС

Как мне изменить код, чтобы получить ШИМ 50 --> 200 --> 50?

Код

#include <avr/io.h>           // this header is necessary to adress the registers
#include <avr/interrupt.h>    // this header is necessary for the ISR 

int pin5 = 5;
int pin6 = 6;

bool changestate = true;

int state1 = 50;
int state2 = 200;

void setup() 
{
    Serial.begin(9600);
    pinMode(pin5, OUTPUT);
    pinMode(pin6, OUTPUT);

    noInterrupts();
    TCCR0A = 0b10000011;  //2^7: non inverting mode. 2^0,2^1: for wgm--> fast pwm 
    TCCR0B = 0b00000001;  //2^3=0: wgm02 off. 2^0: no prescaler
    OCR0A = state1;          //statische Pulsweite
    TIMSK0 = 0b00000010;   //TOV0 is set when overflow occurs. 
    interrupts();
}

void loop() 
{
// put your main code here, to run repeatedly:
}

ISR(TIMER0_COMPA_vect)
{
    Serial.println(OCR0A);
    if(changestate == true)
    {
        OCR0A = state2;
    } 
    else
    {
        OCR0A = state1;
    }
    changestate = !changestate;
} 

Oszi values at pin serial monitor output

...