Всегда HIGH линия на осциллографе, когда UNO Fast PWM TOP ICR1

Я уже 2 дня пытаюсь получить ответ на свой вопрос. Это хорошо для сбора знаний и игры с разными вещами, но до сих пор не было решения.

Я пытаюсь использовать сервопривод HXT500 с быстрым ШИМ с ВЕРХНИМ ICR1

Я использую DFRobot DFRduino UNO v3.0 (R3) аналог Arduino UNO. На базе Atmega 328P-PU

У меня есть осциллограф до 5 МГц в качестве дополнительного инструмента

Вопрос

  1. Почему быстрый ШИМ, TOP ISC1 всегда имеет ВЫСОТУ только на осциллографе
  2. Почему прескалер часов не работает

Мои исследования и наблюдения

Я активировал ШИМ с помощью 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);                      
    }

Там я заметил следующие проблемы:

  • Я пробовал разные Prescales - никаких различий не было (2a).
  • Я попробовал 1 МГц, 8 МГц, 16 МГц - прямая линия ВЫСОТЫ

Что я попробовал дальше:

  • Чтобы использовать пример для использования сервопривода из Arduino IDE. Это работало, но, как я понял, работало через прерывания, а не аппаратное решение
  • Для использования быстрых ШИМ, 9 и 10 бит. (2a) Прескейлs не сработал - у меня было движение
  • Использовать быстрый ШИМ, 8-битный (с регулировкой кода и неправильными углами). (2a) Прескалерs не работал - у меня было движение

, 👍0

Обсуждение

Осциллограф 5 МГц, вероятно, не может разрешить квадратную волну 5 МГц. То, что вы можете увидеть, - это искаженная волна, более близкая к волне греха, чем квадратная волна. Вы можете не видеть ничего, кроме постоянной составляющей высокочастотных сигналов. Я не знаю, почему вы видите только 5 вольт, когда ожидаете волновую форму или напряжение менее 5 вольт. Возможно, что-то не так с кодом, оборудованием, соединениями или у вас может быть подключен осциллограф переменного тока., @st2000

@st2000, спасибо за внимание и комментарий Волновое объяснение - да, это имеет смысл, я так не думал, спасибо Рассматривая возможные проблемы: соединения - это нормально, потому что в других режимах он работает без изменения этих соединений аппаратно - возможно, но я не знаю, как это проверить, но с Быстрым AWM 9-битным он работает Интересно: есть такая же / похожая проблема с обычными режимами CTC Код - это была бы самая простая причина ), @Ivan


1 ответ


Лучший ответ:

0

Возможно, вы захотите установить регистры 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