Не удается получить 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()
{ }
@Tomas Breit, 👍0
Обсуждение1 ответ
▲ 1
Вы используете Таймер/Счетчик 1 в режиме быстрой ШИМ с TOP, установленным на OCR1A:
OCR1A
описывает только число, которое он считает, поэтому в вашем случае 0…391.
Вы должны определить рабочий цикл с помощью OCR1B
. 50% будет 195.
,
@Kwasmich
Смотрите также:
- Генерация стабильной частоты
- 4-битный счетчик вверх и вниз
- Светодиод Arduino PWM с замиранием в сборке
- Изменчивая переменная не обновляется с таймера ISR
- ATmega328P - проблема с использованием таймера 2 для генерации тона
- Точность синхронизации Arduino nano
- Интервальный таймер на Arduino: Сомнения по поводу библиотеки TimerOne
- Как контролировать мигание светодиода во время работы таймера?
Гораздо удобнее настраивать регистры с помощью битовых операций, таких как
TCCR1A |= (1<<COM1A1);
. Контакт 10 относится к контакту 10 Arduino?, @Sim SonНе заглядывал в спецификацию, но, возможно, вы захотите попробовать установить OCR1AL = 0x87 и OCR1AH = 0x01 по отдельности., @Kwasmich