Использование библиотеки таймеров в ардуино Мега для PWM 40kHz (f> 25 kHz)

Тема в разделе "Микроконтроллеры AVR", создана пользователем evgpod, 22 авг 2016.

  1. evgpod

    evgpod Нуб

    можно ли использовать библиотеки таймеров в ардуино Мега для PWM 40kHz ( f > 25 kHz)? Как работать , если нужна паралельная и независимая работа таймера0 ( по прерыванию с наибольшим приорететом) 40kHz? Другие таймеры (с меньшим приорететом) заняты
     
  2. Onkel

    Onkel Гуру

    тот самый случай изучить и освоить честный С. Потому что решение этой задачи с помощью arduino ide будет весьма похоже на суп из топора. На таймере 0 в arduino ide вроде как millis() уже висит? А вообще если нужно получить с таймера выход шим, то приоритет тут ни при чем - таймер генерит шим хардварно в фоне, наше дело только задать параметры, т.е таймер через привязанные к нему ноги будете выдавать на-гора шим независимо от того, что молотит alu cpu.
     
  3. evgpod

    evgpod Нуб

    Приоритет тут при чем, потому что остальные таймеры тоже работают по прерыванию, а я хочу получить чистый PWM, поэтому использую таймер с самым большим приорететом. С Си у меня нет проблем, поэтому и вопрос , что плохо в библиотеке для Т0, что она не дает больше 25 kHz PWM
     
  4. evgpod

    evgpod Нуб

    Извините Я имел ввиду библиотека Таймера Т1 . Для Т0 нет библиотеки и я его или не буду использовать, или напишу сам код с прерываниями. Без прерывания я получаю 40кГц и на Т0, и на Т1
     
  5. Onkel

    Onkel Гуру

    тогда непонятен вопрос, и , более того, неоднозначен. О какой библиотеке Т0 речь? Библиотеки - это обычно часть ide, а не таймеров.
     
  6. evgpod

    evgpod Нуб

    Библиотеки ТimerOne_r11,Т3,Т4,Т5,, которые есть в интернете , смотри аттачмент
     

    Вложения:

    • TimerOne.cpp
      Размер файла:
      7,8 КБ
      Просмотров:
      705
    • TimerOne.h
      Размер файла:
      2,9 КБ
      Просмотров:
      806
  7. Onkel

    Onkel Гуру

    так они для какого Ide библиотеки? Судя по detachInterrupt() для ардуины?
     
  8. evgpod

    evgpod Нуб

    Что это для ардуино Мега , я написал с самого начала.
    Повторяю вопрос: Как получить чистый PWM (меандер) 40кhz . Не чистым его делают :
    другие прерывания, проверки условий (if,case...). До 25 кhz нет проблем.
     
  9. Onkel

    Onkel Гуру

    Мега - это плата, я например их обычно программирую на честном С ,ide arduino - это интегрированная среда разработки. Библиотека упомянутая вами - она для arduino Ide.
    Если вы владеете С, так и пишите на С, в чем вопрос? ide, c помощью которых можно запрограммировать мегу, много - от Code Vision до iar.

    если вы установите режим pwm в таймере, какие проверки условий на него подействуют? Прерывания они чем хороши - можно их запретить.
     
  10. evgpod

    evgpod Нуб

    На Си без прерываний я получаю хороший PWM 40 Khz , ( есть только setup, loop пустаю) что и требуется.
    Начинаю подклютать другие таймеры с прерываниями (библиотеки аналогичные ) в setup . PWM перестает работать. Таймеры отрабатывают только интервалы врмени (до 2 милисек).
    С прерываниями все таймеры работают , но PWM до 25Khz , поэтому вопрос: что плохого в коде библиотек (в прерываниях), что есть ограничение на длительность обработки прерываний? Как это обойти?
    Для меня важен чистый PWM. С погрешностью в интервалах времени других таймеров я могу примериться.
    tone дает PWM дрожащий ,не чистый
     
  11. Onkel

    Onkel Гуру

    моя твоя не понимай. В С нет ни setup, ни loop. Если сомневаетесь - освежите в памяти Кернигана/Ричи. Но они (setup и loop, конечно) есть в arduino ide. Так что берите какой-нибудь честный С ( Code Vision, Keil uVision, iar), у них у всех есть бесплатная версия (но вам ее хватит) и пишите pwm хоть до мегагерца, ну не помню сколько там делитель дает.
     
  12. evgpod

    evgpod Нуб

    Я пишу в ардуиновскои среде ( arduino-nightly-windows) взятой из сайта ардуино. Вообще-то это CPP.
    Во всех исходных файлов есть уже setup, loop. Без этого не работает. Если скажите, что другая среда или язык помогут, я перейду нет проблем. Вопрос: почему там лучше?
     
  13. Alex19

    Alex19 Гуру

    Не знаю.

    Вы хотите получить ШИМ с частотой 40KHz на таймере 0?

    Вы заняли остальные 5 таймеров, любопытно.

    Какой режим для таймера 0 Вы используете - Ph. correct PWM Top=OCR0A?

    T1, это немного упрощает задачу, не требуется реализовывать свои micros(), millis() и т.д. (Вы ведь пишите код в том числе используя библиотеки от Arduino IDE, в которых могут потребоваться micros(), millis()).

    Да есть, сам не любитель таких библиотек, да и зачем, все просто:
    Код (C++):
    void setup()
    {
      cli();
     
      // Подключаем 9 пин ардуино, B1 для Atmega328p.
      DDRB |=(1<<PB1);    

      TCCR1A = 0;
      TCCR1B = 0;
     
      // 1110 - PWM (ICR1)
      TCCR1B |= (1 << WGM13);

      // ICR1 - регистр захвата (16 бит)
      ICR1 = 200;

      // OCR1A - регистр сравнения A (16 бит)
      OCR1A = 100;

      // 10 - сброс вывода OC1A в 0 при совпадении с A, установка  вывода OC1A в 1 если регистр TCNT1 принимает значение 0x00 (неинверсный режим)
      TCCR1A |= (1 << COM1A1);

      // 001 - тактовый генератор CLK
      TCCR1B |= (1 << CS10);

      sei();
    }

    void loop() {
      // put your main code here, to run repeatedly:

    }
    Любой ответ на этот вопрос без кода, подобен гаданию. Что делаю остальные таймеры, какие там обработчики прерывания и т.д.

    Бегло пробежался, что мне не нравиться, вызов функции в прерывании, если прерывание подключено. Зачем было трогать регистр GTCCR, тем более бит PSRSYNC. Плюс возможно проблема не в библиотеки, а в Вашем коде и т.д.
     
  14. evgpod

    evgpod Нуб

    Я паботаю с процессором Мега2560
    Вот короткий код для тайера Т0 и Т3 (библиотека аналогична тому что прислал ранее). Отдельно таймеры работают . Вместе обработчики прерываний конфликтуют
     

    Вложения:

  15. Alex19

    Alex19 Гуру

    Разницы для T1 нет, сравните описание из pdf, разница только в пинах.

    Почему для ШИМ на T0 используется режим таймера CTC?
    Код (C++):
    TCCR0A |= (1 << WGM01)|(1 << COM0A1)|(1 << COM0A0);
    Попробуйте PWM, Phase Correct или Fast PWM

    Зачем используются прерывания?
    Код (C++):
    ISR(TIMER0_COMPA_vect)          // timer compare interrupt service routine
    {
      digitalWrite(13, digitalRead(13) ^ 1);  
    }
    Контролер сам меняет значение на пинах, если его попросить. Отвечает за это режим работы таймера и регистр TCCR0A, конкретно его биты COM0A1 COM0A0 COM0B1 COM0B0.

    Мало того, что оно не нужно, так используется digitalWrite, вместо того, чтобы использовать регистры PORT.

    По 3 таймеру, похоже на ШИМ, зачем тогда там прерывание?
    Посмотрите внимательнее код библиотеки.

    И да зачем вообще использовать T0 и создавать себе проблемы в дальнейшем, когда не используется 4 таймера?
     
  16. evgpod

    evgpod Нуб

    Спасибо, все таймеры (Т1,Т3,Т4,Т5) одноврвменно дают "чистый"меандр (PWM) 40кгц