Пытаюсь генерировать сигнал высокой частоты (не менее 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() {
}
1 ответ
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 МГц. Возможно, вам придется быть немного ниже, чтобы быть уверенным.
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
Возможно, в этом нет особой необходимости, но, вероятно, было бы неплохо сказать, что вы видите, вместо ожидаемого сигнала., @timemage