можно ли использовать библиотеки таймеров в ардуино Мега для PWM 40kHz ( f > 25 kHz)? Как работать , если нужна паралельная и независимая работа таймера0 ( по прерыванию с наибольшим приорететом) 40kHz? Другие таймеры (с меньшим приорететом) заняты
тот самый случай изучить и освоить честный С. Потому что решение этой задачи с помощью arduino ide будет весьма похоже на суп из топора. На таймере 0 в arduino ide вроде как millis() уже висит? А вообще если нужно получить с таймера выход шим, то приоритет тут ни при чем - таймер генерит шим хардварно в фоне, наше дело только задать параметры, т.е таймер через привязанные к нему ноги будете выдавать на-гора шим независимо от того, что молотит alu cpu.
Приоритет тут при чем, потому что остальные таймеры тоже работают по прерыванию, а я хочу получить чистый PWM, поэтому использую таймер с самым большим приорететом. С Си у меня нет проблем, поэтому и вопрос , что плохо в библиотеке для Т0, что она не дает больше 25 kHz PWM
Извините Я имел ввиду библиотека Таймера Т1 . Для Т0 нет библиотеки и я его или не буду использовать, или напишу сам код с прерываниями. Без прерывания я получаю 40кГц и на Т0, и на Т1
тогда непонятен вопрос, и , более того, неоднозначен. О какой библиотеке Т0 речь? Библиотеки - это обычно часть ide, а не таймеров.
Что это для ардуино Мега , я написал с самого начала. Повторяю вопрос: Как получить чистый PWM (меандер) 40кhz . Не чистым его делают : другие прерывания, проверки условий (if,case...). До 25 кhz нет проблем.
Мега - это плата, я например их обычно программирую на честном С ,ide arduino - это интегрированная среда разработки. Библиотека упомянутая вами - она для arduino Ide. Если вы владеете С, так и пишите на С, в чем вопрос? ide, c помощью которых можно запрограммировать мегу, много - от Code Vision до iar. если вы установите режим pwm в таймере, какие проверки условий на него подействуют? Прерывания они чем хороши - можно их запретить.
На Си без прерываний я получаю хороший PWM 40 Khz , ( есть только setup, loop пустаю) что и требуется. Начинаю подклютать другие таймеры с прерываниями (библиотеки аналогичные ) в setup . PWM перестает работать. Таймеры отрабатывают только интервалы врмени (до 2 милисек). С прерываниями все таймеры работают , но PWM до 25Khz , поэтому вопрос: что плохого в коде библиотек (в прерываниях), что есть ограничение на длительность обработки прерываний? Как это обойти? Для меня важен чистый PWM. С погрешностью в интервалах времени других таймеров я могу примериться. tone дает PWM дрожащий ,не чистый
моя твоя не понимай. В С нет ни setup, ни loop. Если сомневаетесь - освежите в памяти Кернигана/Ричи. Но они (setup и loop, конечно) есть в arduino ide. Так что берите какой-нибудь честный С ( Code Vision, Keil uVision, iar), у них у всех есть бесплатная версия (но вам ее хватит) и пишите pwm хоть до мегагерца, ну не помню сколько там делитель дает.
Я пишу в ардуиновскои среде ( arduino-nightly-windows) взятой из сайта ардуино. Вообще-то это CPP. Во всех исходных файлов есть уже setup, loop. Без этого не работает. Если скажите, что другая среда или язык помогут, я перейду нет проблем. Вопрос: почему там лучше?
Не знаю. Вы хотите получить ШИМ с частотой 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. Плюс возможно проблема не в библиотеки, а в Вашем коде и т.д.
Я паботаю с процессором Мега2560 Вот короткий код для тайера Т0 и Т3 (библиотека аналогична тому что прислал ранее). Отдельно таймеры работают . Вместе обработчики прерываний конфликтуют
Разницы для 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 таймера?