Использование таймеров Arduino

Я использую этот код Arduino для генерации импульса 5 В, 200 кГц с шириной импульса 50%.

void setup() {
  // put your setup code here, to run once:
  pinMode(pwmpin, OUTPUT);
  pinMode(FBo, INPUT);
  pinMode(FBi, INPUT);
  noInterrupts(); // disable all interrupts 
  TCCR0A = 0;
  TCCR0B = 0;
  TCNT0  = 0;
  OCR0A = 40; // compare match register Duty Cycle *   16MHz/200kHz
  OCR0B = 40; // compare match register 1 - Duty Cycle * 16MHz/200kHz
  TIMSK0 |= (1 << OCIE0A); // enable timer compare interrupt
  digitalWrite(pwmpin,HIGH);
  TCCR0B |= (1 << CS00);
  interrupts(); // enable all interrupts
}

ISR(TIMER0_COMPA_vect) {
  digitalWrite(pwmpin, digitalRead(pwmpin) ^ 1);
  //TIMSK0 |= (1 << OCIE0B);  // enable timer compare interrupt
  //TIMSK0 &= ~(1 << OCIE0A);  // disable timer compare interrupt
}

Вместо импульса 5 В 200 кГц он показывает примерно сигнал 2 В 30 кГц. Кто-нибудь может сказать мне, в чем проблема?


person Atal Khattak    schedule 06.01.2016    source источник


Ответы (1)


Проблема в том, что вы используете Timer/Counter0 в обычном режиме, а не в режиме CTC.

Попробуйте добавить

TCCR0A |=  (1 << WGM01);

к процедуре настройки, чтобы включить сброс счетчика при совпадении сравнения.


Обычный режим позволяет таймеру вести отсчет от BOTTOM (0) до MAX (255) независимо от того, какое значение вы установили для OCR0A. Это вызовет прерывание каждые 256 тактовых циклов (62,5 кГц при тактовой частоте 16 МГц). Ваш ISR должен дважды переключать выходной контакт, чтобы выполнить один полный цикл ШИМ, что дает наблюдаемую частоту ШИМ около 30 кГц.

Из Техническое описание ATmega:

15.7.1 Обычный режим

[...] В этом режиме направление счета всегда вверх (приращение), и сброс счетчика не выполняется. Счетчик просто выходит за пределы своего максимального 8-битного значения (TOP = 0xFF), а затем перезапускается с нуля (0x00).

а также

15.7.2 Очистить таймер в режиме сравнения совпадений (CTC)

В режиме Clear Timer on Compare или CTC (WGM02:0 = 2) регистр OCR0A используется для управления разрешением счетчика. В режиме CTC счетчик обнуляется, когда значение счетчика (TCNT0) соответствует OCR0A. [...]

Я предполагаю, что для 2 В вы измеряете среднее напряжение (4,5 В при рабочем цикле 50%) вместо пикового напряжения ШИМ.

person vega8    schedule 06.01.2016
comment
Спасибо за помощь. - person Atal Khattak; 06.01.2016