Я использую 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;
}