Всегда HIGH линия на осциллографе, когда UNO Fast PWM TOP ICR1
Я уже 2 дня пытаюсь получить ответ на свой вопрос. Это хорошо для сбора знаний и игры с разными вещами, но до сих пор не было решения.
Я пытаюсь использовать сервопривод HXT500 с
быстрым ШИМ с ВЕРХНИМ ICR1
Я использую DFRobot DFRduino UNO v3.0 (R3)
аналог Arduino UNO
. На базе Atmega 328P-PU
У меня есть осциллограф до 5 МГц
в качестве дополнительного инструмента
Вопрос
- Почему
быстрый ШИМ, TOP ISC1
всегда имеет ВЫСОТУ только на осциллографе - Почему
прескалер часов
не работает
Мои исследования и наблюдения
Я активировал ШИМ с помощью TOP ICR1
, но на осциллографе была только прямая линия 5
В, я проверил разные диапазоны (горизонтальные основания) (1a)
. Подключается к контактам 10 или 9
. Я предположил, что мой UNO работает на частоте 1 МГц
(источник часов по умолчанию 9.2.1 на стр. 37) и рассчитал ICR1, OCR1A: B для 0 и 180 градусов.
void setup() {
// все порты as (для выходов)
DDRB=0xFF;
DDRC=0xFF;
DDRD=0xFF;
// Таблица 16-4 на стр. 141
// Fast PWM TOP is ICR1
TCCR1A|=(0<<WGM10)|(1<<WGM11);
TCCR1B|=(1<<WGM13)|(1<<WGM12);
ICR1=2499;
// Таблица 16-2 на странице 140
// Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at BOTTOM (неинвертирующий режим)
TCCR1A|=(1<<COM1A1)|(1<<COM1B1);
// Таблица 16-5 на стр. 143
// clkI/O/8
TCCR1B|=(0<<CS12)|(1<<CS11)|(0<<CS10); // (2a)
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
// 90 градусов
OCR1A=299;
OCR1B=299;
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
// 0 градусов
OCR1A=49;
OCR1B=49;
delay(1000);
}
Там я заметил следующие проблемы:
- Я пробовал разные
Prescale
s - никаких различий небыло (2a).
- Я попробовал 1 МГц, 8 МГц, 16 МГц - прямая линия ВЫСОТЫ
Что я попробовал дальше:
- Чтобы использовать пример для использования сервопривода из Arduino IDE. Это работало, но, как я понял, работало через прерывания, а не аппаратное решение
- Для использования быстрых ШИМ, 9 и 10 бит.
(2a) Прескейл
s не сработал - у меня было движение - Использовать быстрый ШИМ, 8-битный (с регулировкой кода и неправильными углами).
(2a) Прескалер
s не работал - у меня было движение
@Ivan, 👍0
Обсуждение1 ответ
Лучший ответ:
Возможно, вы захотите установить регистры TCR1A
и TCR1B равными 0
перед вашим кодом, поскольку библиотека Arduino устанавливает битWGM10. Или измените первое |=
на a =
. Оставив бит WGM10 установленным, вы получаете быстрый ШИМ-режим с верхним значением OCR1A. В сочетании с вашим другим кодом это приведет к тому, что оба контакта будут иметь 100% рабочий цикл.
Так что используйте
TCCR1A=(0<<WGM10)|(1<<WGM11);
TCCR1B=(1<<WGM13)|(1<<WGM12);
или
TCCR1A=0;
TCCR1B=0;
TCCR1A|=(0<<WGM10)|(1<<WGM11);
TCCR1B|=(1<<WGM13)|(1<<WGM12);
Кроме того, ваш код выглядит нормально и должен давать вам сигнал 800 Гц.
PS "Я предположил, что мой UNO работает на частоте 1 МГц"
; нет, UNO работает на частоте 16 МГц.
Спасибо. Я очень ценю время, которое вы провели здесь.
Я попробовал, и он начал работать, но с некоторым сдвигом, потому что было то неправильное предположение, о котором вы упомянули, о Тактовой частоте системы
В настоящее время fast PWM TOP ICR1
, "Prescaler" работают, и математика соответствует, @Ivan
- Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых выводов ШИМ?
- Контакты ШИМ серводвигателей, Arduino Uno
- Проектирование роботизированной руки с помощью Arduino Uno
- Почему задержка более 64 миллисекунд останавливает вращение серводвигателя? Я не использую «Servo.h», вместо этого я просто управляю длиной импульса.
- Вращающийся серводвигатель с использованием Arduino
- 16-канальный 12-битный PWM/Servo Shield проверьте, питается ли он от адаптера
- Могу ли я управлять функциями Arduino с помощью ШИМ?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
Осциллограф 5 МГц, вероятно, не может разрешить квадратную волну 5 МГц. То, что вы можете увидеть, - это искаженная волна, более близкая к волне греха, чем квадратная волна. Вы можете не видеть ничего, кроме постоянной составляющей высокочастотных сигналов. Я не знаю, почему вы видите только 5 вольт, когда ожидаете волновую форму или напряжение менее 5 вольт. Возможно, что-то не так с кодом, оборудованием, соединениями или у вас может быть подключен осциллограф переменного тока., @st2000
@st2000, спасибо за внимание и комментарий Волновое объяснение - да, это имеет смысл, я так не думал, спасибо Рассматривая возможные проблемы: соединения - это нормально, потому что в других режимах он работает без изменения этих соединений аппаратно - возможно, но я не знаю, как это проверить, но с Быстрым AWM 9-битным он работает Интересно: есть такая же / похожая проблема с обычными режимами CTC Код - это была бы самая простая причина ), @Ivan