Пытаюсь генерировать сигнал высокой частоты (не менее 150 кГц) с помощью Arduino Mega, режим CTC

void setup() {
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  TCCR2A = TCCR2A & B01010000 | B00000010 ; // CTC mode activated, Toggle OC2A
  TCCR2B = TCCR2B & B11110000 | B00000001;//Prescaller set
  TCNT2=0;//Start Counting ffrom 0
  OCR2A=127;//Set TOP value)
  
}

void loop() {

}

, 👍0

Обсуждение

Возможно, в этом нет особой необходимости, но, вероятно, было бы неплохо сказать, что вы видите, вместо ожидаемого сигнала., @timemage


1 ответ


4
TCCR2A = TCCR2A & B01010000 | B00000010 ; // Активирован режим CTC, Переключить OC2A

То, что у вас здесь, очищает COM2A1 TCR2A, но сохраняет его исходный COM2A0.

Когда я распечатываю TCR2A перед модификацией, я вижу значение 0x01 (COM2A равно 0; оба бита).

Распечатайте TCR2A после того, как вы обработали его 0x02. Итак, в TCR2Aвы заканчиваете с нулями для битов COM2A1 и COM2A0, что во всех случаях означает "Нормальная работа порта; OC2A отключен". То есть вы не увидите никакого сигнала, который вы могли бы в противном случае настроить для генерации, потому что он просто не был направлен на (вывод Arduino 10)/(gpio PB4)/OC2A

Обычно лучше не полагаться на загрузчик, стартовый код и ядро Arduino, чтобы оставить аппаратный регистр в определенном состоянии.

Следующее, вероятно, ближе к тому, что вы задумали:

TCCR2A = B01010000 | B00000010 ; // Активирован режим CTC, Переключить OC2A

Это все еще не совсем соответствует описанию проблемы (не правильная частота), но он посылает сигнал с цифрового вывода 10 Arduino MEGA. Он также настроен на переключение OC2B, поэтому, если вы этого не хотите:

TCCR2A = B01000000 | B00000010 ; // Активирован режим CTC, Переключить OC2A

Это можно сделать более читабельным, используя имена битовых полей для данного:

TCCR2A = 
      (1 << COM2A0)  // CTC mode activated (note COM2A1 is zero)
    | (2 <<  WGM20); // lower two bits of WGM value 2

Вы можете сделать то же самое для TCR2B. И точно так же лучше, чтобы вы не полагались на предыдущее значение TCR2B.

При OCR2A = 127;вы переключаетесь (достигаете полупериода) каждые 128/16 000 000 секунд или полупериода в 8 долларов в течение периода в 16 долларов. Генерирует 62,5 кГц, что ниже ваших целевых 150 кГц. Зная, что это полупериоды, OCR2A 63 позволяет достичь 125 кГц.

OCR2A 52 или менее позволяет вам работать в диапазоне более 150 кГц, по крайней мере, если мы очень серьезно относимся к вашей тактовой частоте 16 МГц. Возможно, вам придется быть немного ниже, чтобы быть уверенным.

,