Не удается получить OC1B (контакт 10) для вывода

Я пытаюсь заставить эту программу использовать канал B для формы выходного сигнала, используя фазово-правильный режим PWM и используя OCR1A в качестве верхнего. С коэффициентом заполнения 50% я пытаюсь получить частоту 10 Гц. Я могу настроить OC1A (вывод 9), если я установлю TCCR1A на 0x43; но с контакта 10 ничего не приходит. Код:

include "avr/io.h"

void setup()  
{  
 DDRB = 0x6; // устанавливаем контакты 9 и 10 в качестве выходных

 /*set operation Toggle mode; WGM13:0 = 1011 phase correct PWM  
CS12:0 = 101 prescaler = 1024*/
 TCCR1A = 0x23;  
 TCCR1B = 0x15;

 OCR1A = 0x187; //391 для 50% рабочего цикла
 TCNT1 = 0; //очистить счетчик и обновить OCR1A
}  
void loop()  
{ }

, 👍0

Обсуждение

Гораздо удобнее настраивать регистры с помощью битовых операций, таких как TCCR1A |= (1<<COM1A1);. Контакт 10 относится к контакту 10 Arduino?, @Sim Son

Не заглядывал в спецификацию, но, возможно, вы захотите попробовать установить OCR1AL = 0x87 и OCR1AH = 0x01 по отдельности., @Kwasmich


1 ответ


1

Вы используете Таймер/Счетчик 1 в режиме быстрой ШИМ с TOP, установленным на OCR1A:
OCR1Aописывает только число, которое он считает, поэтому в вашем случае 0…391.
Вы должны определить рабочий цикл с помощью OCR1B. 50% будет 195.

,