PWM Arduino MEGA vs Arduino Nano
- Войдите на сайт для отправки комментариев
Вс, 15/03/2020 - 20:30
analogWrite(2, 170); analogWrite(7, 200);
Запускаю ШИМ на ножках 2,7 Arduino MEGA2560 и наблюдаю следующие проблемы:
1. ШИМ модулированный частотно
2. Могу запустить ШИМ только на одной ножке
проверяю то же самое на Нано работает на всех PWM ножках одновременно и ШИМ нормальный, не модулированный.
Кто сталкивался, что за трабла и как починить?
1. ШИМ модулированный частотно
Что бы это могло значить
Это значит что высокий уровень заполнен меандром на более высокой частоте. Ща попробую картинки прилепить
Более важен второй вопрос, почему я не могу на нескольких ножках запускать ШИМ ? Проверял на разных ардуинах, есть пара оригинальных, есть купленные на али китайские клоны, на всех одинаково работает.
С ШИМ-ами не всё ток просто. Разберись сначала с железом а уж потом с софтом, ибо зависимо оно оч. сильно.
Железо сто пудово мега 2560, на нано просто проверил. А по поводу софта прошу уточнения, что имелось в виду ?
А по поводу софта прошу уточнения, что имелось в виду ?
Ноги таймера конкретно привязаны к PWM выводам процессора. В 2560 нет Mapping-а , впрочем как и у наны!
Софт ИСПОЛЬЗУЕТ таймеры по своему назначению и ЕСЛИ в какой-то момент ВДРУГ часть софта "украдёт" таймер у другой части софта - будут СОФТВАРНЫЕ проблемы!!!
Иными словами - нельзя вот так вот ПРОСТО взять любой таймер!!!
ЕСЛИ Я НАПИСАЛ НЕПОНЯТНЫМ ЯЗЫКОМ: с аппаратной (hardware) частью нужно работать ЗАРАНЕЕ , а уже потом всё это дело кодить на уровне СОФТА!!! Иначе будет вот так, как у тебя на осцилле.
Более важен второй вопрос, почему я не могу на нескольких ножках запускать ШИМ ?
ПаТаМуЧТО ардуина даже в ПУСТОМ скетче ИСПОЛЬЗУЕТ Timer0!!!
Есть библиотеки, которые используют ДРУГИЕ таймеры и могут КОНФЛИКТОВАТЬ между собой!!!
Так понятнее?????
Эксперимент проводился на пустом скетче без подключения каких либо библиотек
вот весь код эксперимента
Ноги 2 и 7 к какому таймеру относятся???
Это значит что высокий уровень заполнен меандром на более высокой частоте. Ща попробую картинки прилепить
Похоже на то, что ардуино перезагружается периодически, из-за этого пробелы в шиме. Помигай лампочкой, чтобы удостовериться.
Ноги 2 и 7 к какому таймеру относятся???
OC3B и OC4B соответственно
пробовал OC3B и OC3С соответственно ножки 2 и 3, вот в этом случае работает только один вывод, когда с разных таймеров то не работает ни один, при задании двух
Эксперимент проводился на пустом скетче без подключения каких либо библиотек
вот весь код эксперимента
Строку №18 сразу же в топку. Вам тут уже долго пытаются объяснить, что нулевой таймер в ардуино занят, нельзя на его ногах (4 и 13) ШИМ использовать.
Это значит что высокий уровень заполнен меандром на более высокой частоте. Ща попробую картинки прилепить
Очень интересно. Работаю с Мегой 2560, со всеми таймерами, в т.ч. и с Т0 с ШИМом .. ни разу такого не наблюдал.
Все таймеры в Ардуино (хоть Мега, хоть НАНО, и т.д.) инициализируются единообразно на ШИМ с частотой около 500гц, чуть ниже. То, что таймер 0 используется как "счетчик миллис" на ШИМ выходы не должно влиять от слова "никак", т.к. ШИМ - это выходы совсем иной части таймеров.
Подозреваю, что у Вас лезут какие-то наводки ВЧ из-за плохих контактов. Дуня тут скорее всего не при делах.
Все таймеры в Ардуино (хоть Мега, хоть НАНО, и т.д.) инициализируются единообразно на ШИМ с частотой около 500гц, чуть ниже.
У нулевого частота вдвое выше, чем у остальных.
Евгений, да что вам дался этот нулевой таймер. Пины 3-14 по умолчанию пины для вывода ШИМ стандартной функцией analogWrite
попробовал на Уно, на нем тоже все работает, так что глюк только на меге 2560
Работаю с Мегой 2560, со всеми таймерами, в т.ч. и с Т0 с ШИМом
А разве мы утверждали, что это невозможно???
Все таймеры в Ардуино (хоть Мега, хоть НАНО, и т.д.) инициализируются единообразно на ШИМ с частотой около 500гц, чуть ниже.
Не спорю, но апосля инита эти таймеры можно "настроить" вплоть до "поломки" дурдуины!
То, что таймер 0 используется как "счетчик миллис" на ШИМ выходы не должно влиять от слова "никак", т.к. ШИМ - это выходы совсем иной части таймеров.
Т.е. на коротком прескалере ШИМ Т0 будет ~62кГц и это не будет влиять "никак" ???
если кому интересно, то я разобрался с проблемой. На меге 2560 не так как на 328й с ШИМом. Подробности можно почитать по ссылке http://astro.neutral.org/arduino/arduino-pwm-pins-frequency.shtml . Достаточно просто задать генерацию на пинах
а далее уже задавать напрямую в регистр счетчика уровень ШИМ, вот список соответствия регистров пинам
если кому интересно, то я разобрался с проблемой. На меге 2560 не так как на 328й с ШИМом. Подробности можно почитать по ссылке http://astro.neutral.org/arduino/arduino-pwm-pins-frequency.shtml . Достаточно просто задать генерацию на пинах
а далее уже задавать напрямую в регистр счетчика уровень ШИМ, вот список соответствия регистров пинам
Как конкретно разобрались-то? У Вас на осцилограмме ШИМ заполнен ВЧ сигналом .. это "откуда", разобрались? Интересно что это было, все же. Ни разу с таким не сталкивался.
Работаю с Мегой 2560, со всеми таймерами, в т.ч. и с Т0 с ШИМом
А разве мы утверждали, что это невозможно???
Все таймеры в Ардуино (хоть Мега, хоть НАНО, и т.д.) инициализируются единообразно на ШИМ с частотой около 500гц, чуть ниже.
Не спорю, но апосля инита эти таймеры можно "настроить" вплоть до "поломки" дурдуины!
То, что таймер 0 используется как "счетчик миллис" на ШИМ выходы не должно влиять от слова "никак", т.к. ШИМ - это выходы совсем иной части таймеров.
Т.е. на коротком прескалере ШИМ Т0 будет ~62кГц и это не будет влиять "никак" ???
Ни чё не понял, переведите, если не трудно.
Все таймеры в Ардуино (хоть Мега, хоть НАНО, и т.д.) инициализируются единообразно на ШИМ с частотой около 500гц, чуть ниже.
У нулевого частота вдвое выше, чем у остальных.
Вот тут написано иначе, или я ошибаюсь? Буду признателен, если покажете в какой конкретно строке для 328 и 2560:
void init()
{
// this needs to be called before setup() or some functions won't
// work there
sei();
// on the ATmega168, timer 0 is also used for fast hardware pwm
// (using phase-correct PWM would mean that timer 0 overflowed half as often
// resulting in different millis() behavior on the ATmega8 and ATmega168)
#if defined(TCCR0A) && defined(WGM01)
sbi(TCCR0A, WGM01);
sbi(TCCR0A, WGM00);
#endif
// set timer 0 prescale factor to 64
#if defined(__AVR_ATmega128__)
// CPU specific: different values for the ATmega128
sbi(TCCR0, CS02);
#elif defined(TCCR0) && defined(CS01) && defined(CS00)
// this combination is for the standard atmega8
sbi(TCCR0, CS01);
sbi(TCCR0, CS00);
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
// this combination is for the standard 168/328/1280/2560
sbi(TCCR0B, CS01);
sbi(TCCR0B, CS00);
#elif defined(TCCR0A) && defined(CS01) && defined(CS00)
// this combination is for the __AVR_ATmega645__ series
sbi(TCCR0A, CS01);
sbi(TCCR0A, CS00);
#else
#error Timer 0 prescale factor 64 not set correctly
#endif
Это выдержка из init() Ардуины, версия 1.8.11
Вот про таймер2, он тоже 8-и битный:
// set timer 2 prescale factor to 64
#if defined(TCCR2) && defined(CS22)
sbi(TCCR2, CS22);
#elif defined(TCCR2B) && defined(CS22)
sbi(TCCR2B, CS22);
//#else
// Timer 2 not finished (may not be present on this CPU)
#endif
там же.
Вот тут написано иначе, или я ошибаюсь? Буду признателен, если покажете в какой конкретно строке для 328 и 2560:
Ошибаетесь. Вы зря не вставили код с номерами строк, чтобы я мог ссылаться.
Дело в том, что все три таймера конфигурируются на делитель частоты 64, тут Вы правы, но при этом 0-ой таймер конфигурируется на FastPWM (строки №№11-12 в коде ниже), а остальные на Phase correct PWM (строки №№ 65 и 81). Потому у нулевого частота вдвое выше.
Я пометил эти места в коде функции init комментариями
Понятна разница? Впрочем, Вы также можете замерить частоту.
Вот тут написано иначе, или я ошибаюсь? Буду признателен, если покажете в какой конкретно строке для 328 и 2560:
Ошибаетесь. Вы зря не вставили код с номерами строк, чтобы я мог ссылаться.
Дело в том, что все три таймера конфигурируются на делитель частоты 64, тут Вы правы, но при этом 0-ой таймер конфигурируется на FastPWM, а остальные на Phase correct PWM. Потому у нулевого частота вдвое выше.
Я пометил эти места в коде функции init
Понятна разница? Впрочем, Вы также можете замерить частоту.
Спасибо. Код вставлять тут не умею, это впервые.
Как вижу, этот режим ставится не только для таймера0, но и для таймера2 точно также. То есть режимы отличаются не для таймера0 исключительно (как у Вас выше), а для 8 и 16-и разрядных таймеров в целом. Кстати и для 328 это тоже также, одинаково получается.
То есть никакого исключения в части ШИМ у таймера0 нет из-за того, что он считает время и миллис. Или это не так? Меня в вашем ответе заинтересовал только этот момент. Вы написали, что только у него такое.
если кому интересно, то я разобрался с проблемой.
Достаточно просто задать генерацию на пинах
а далее уже задавать напрямую в регистр счетчика уровень ШИМ, вот список соответствия регистров пинам
хм, а зачем эти танцы с бубном? Если вы уже пользуетесь analogWrite(). то почему сразу не задать уровень ШИМ
То есть никакого исключения в части ШИМ у таймера0 нет из-за того, что он считает время и миллис.
нет.
Не знаю, откуда тут взялось это коллективное затмение, но подсчет миллис никак не влияет на возможность использовать Таймер0 для ШИМ
То есть никакого исключения в части ШИМ у таймера0 нет из-за того, что он считает время и миллис.
нет.
Не знаю, откуда тут взялось это коллективное затмение, но подсчет миллис никак не влияет на возможность использовать Таймер0 для ШИМ
Вот и мне непонятно откуда у автора такая осцилограмма, и тем более интересно КАК он разобрался.
Я не видел его кода. Судя по последнему "рецепту" мешать в одну кучу analogWrite() и прямую запись в регистры - он, видимо, понимает в этом мало, так что неизвестно. что он там наворотил
Эксперимент проводился на пустом скетче без подключения каких либо библиотек
вот весь код эксперимента
Эксперимент проводился на пустом скетче без подключения каких либо библиотек
вот весь код эксперимента
если взять мегу и залить в нее этот код - разве будет меандр на осциле? - значит или код или график не оттуда
Кстати. на графике не высокий уровень заполнен меандром, а низкий
Не знаю, откуда тут взялось это коллективное затмение, но подсчет миллис никак не влияет на возможность использовать Таймер0 для ШИМ
Базаришь!!! Конечно подсчёт никак не влияет на ШИМ, а вот ШИМ ещё как влияет на миллис. Вы читайте ВНИМАТЕЛЬНЕЕ посты, ибо ШИМ на 495Гц и на 62кГц мне кажется отличается, или нет???
А если эксперимент провести так - чего будет?
читайте ВНИМАТЕЛЬНЕЕ посты, ибо ШИМ на 495Гц и на 62кГц мне кажется отличается, или нет???
обратите этот совет к себе :) ТС ни разу не писал, что он меняет стандартные настройки ардуиновского ШИМ - и его код выше тоже ничего подобного не содержит.
обратите этот совет к себе :) ТС ни разу не писал, что он меняет стандартные настройки ардуиновского ШИМ - и его код выше тоже ничего подобного не содержит.
ТС вААще ничо не писал - всё что выше голимая копипаста, втч. и с "магическим решением" его якобы проблемы!!!
А на счёт миллсов и прочего - могу наспор ЗАПРОСТО "сломать" любой код прям вот парой-тройкой строчек!!!
Так шо НИНАДО пейсать того, чего не было!!!
Так шо НИНАДО пейсать того, чего не было!!!
вот именно :) - и не пиши
- и не пиши
ТОГДА возьми его скетч, компильни и прицепи к нему осцилл и запость СЮДОЙ картинко!!! Будем искать много отличий!!! Ну и заодно потом апсудим, кто да чё!!!
Вот тут написано иначе, или я ошибаюсь? Буду признателен, если покажете в какой конкретно строке для 328 и 2560:
Ошибаетесь. Вы зря не вставили код с номерами строк, чтобы я мог ссылаться.
Дело в том, что все три таймера конфигурируются на делитель частоты 64, тут Вы правы, но при этом 0-ой таймер конфигурируется на FastPWM (строки №№11-12 в коде ниже), а остальные на Phase correct PWM (строки №№ 65 и 81). Потому у нулевого частота вдвое выше.
Я пометил эти места в коде функции init комментариями
Понятна разница? Впрочем, Вы также можете замерить частоту.
Вернусь сюда ещё раз. Вы - правы, действительно таймер0 настраивается на FastPWM режим, в то время как все остальные таймеры 2,1,3,4,5 на Phase Correct PWM. Не обращал никогда внимание на такую странность, тем не менее, спасибо, она действительно есть. Буду знать, спасибо.
Посмотрел внимательно картинку с осцилографа и всё стало совсем непонятно. Там похоже на соотношение ШИМ для analogWrite(100). И правда, ВЧ заполнение как раз на 0, а не на единице ШИМ, и если там зубья хоть как-то отражают ВЧ заполнение, то он должно быть в районе 20-30кГц или даже выше, для частоты ШИМ в 488.3Гц (таймер3, нога2) .. вообще перестал понимать "что это"
Автор, отзовись, что и как ты решил?
Посмотрел внимательно картинку с осцилографа и всё стало совсем непонятно.
главное ТС не написал, с какой ноги эта осциллограмма. Может это вообще не ШИМ....
Ребята? Что, коронный вирус действует?
Это же чушь собачья, а ТС - просто дурак или тролль.
Вот, простите "код":
Вот осциллограмма:
-------------------------------
А теперь рассказываю, откуда у этого дурака "заполнение". Неужто никто еще такого не видел???? (риторический вопрос)
Осциллограф (говенный) питался от говенного импульсного БП. Это заполнение - частота преобразования в БП. Такое на DSO138 часто бывает, если накоромить его от шумного блока питания.
И щтоп вопросов не было это 2560, от Роботдина:
Спасибо. Не, не видел такого ни разу. Видимо не тем осцилом смотрю .. в доступе есть старый добрый С1-фигзнает какой, на ЭЛТ. Там такого не показывают.
Вот осциллограмма:
Граф, ты ж, вроде, линуксоид, чего там у тебя иконка MSIE делает? Неужели он и туда пролез?
Вот осциллограмма:
Граф, ты ж, вроде, линуксоид, чего там у тебя иконка MSIE делает? Неужели он и туда пролез?
под мой осциллограф нет программы под Линукс. Модуль под Sigrok еще не написан. Поэтому стоит виртуалка Вин10 ;)))). А ИЕ на ней - это не просто так. Чортова биржевая программа ВТБ умеет работать ТОЛЬКО под ИЕ, даже не под Эдж. ;))
т.с. писал что смотрел осциллографом на сигналы обеих плат ... думаете он разными приборами смотрел ?
т.с. писал что смотрел осциллографом на сигналы обеих плат ... думаете он разными приборами смотрел ?
Есть ли у тебя понимание, что никакого драного "заполнения" не бывает. Вообще и никогда?
Если есть, то чем ты интересуешься? Как ТС сумел добиться такой картинки, или откуда у него ошибка в ДНК?
Я не думаю про то, как, чем и в чьей заднице что-то измерял ТС. Картинка из поста с "заполнением" это шум очень плохого питания случающийся на DSO138 и похожих приборах.
Еще вопросы?
ребят, не думал что разовьется такая бурная обсуждаловка, но один холивар я закрою. Осцилограмма оказалас глюком моего осцилографа, то есть наложением картинки. Никто ведь не обратил внимание на 25мс в верхнем правом углу картинки, вот и я не обратил внимание на то какую злую шутку сыграла со мной автоподстройка моего аттена )))
ребят, не думал что разовьется такая бурная обсуждаловка, но один холивар я закрою. Осцилограмма оказалас глюком моего осцилографа, то есть наложением картинки. Никто ведь не обратил внимание на 25мс в верхнем правом углу картинки, вот и я не обратил внимание на то какую злую шутку сыграла со мной автоподстройка моего аттена ))). Буду теперь следить за развитием ситуации.
но один холивар я закрою.
Осцилограмма оказалас глюком моего осцилографа
Каков вопрос - таков и ответ, сам виноват!
А уотт здеся я не соглашуся! Списать неумение работать осциком на его глюки - стандартный ответ ламеров. Ибо твой осцик "умеет" считать и частоту и коэффициент заполнения ШИМ очень даже точно. Можешь прям инкрементный скетч наваять от 1 до 255 с секундным интервалом и посмотреть, что осцилл кажетъ. Будет 1-в-1. Проверено лично мной уже давным давно!!!
Это же чушь собачья, а ТС - просто дурак или тролль.
называя других дураками вы сами демонстрируете свою недалекость, а по сути попробуйте на вашем же макете запустить шим на 2 ножках, ради интереса на ножках одного таймера и двух таймеров.
Каков вопрос - таков и ответ, сам виноват!
А уотт здеся я не соглашуся! Списать неумение работать осциком на его глюки - стандартный ответ ламеров. Ибо твой осцик "умеет" считать и частоту и коэффициент заполнения ШИМ очень даже точно. Можешь прям инкрементный скетч наваять от 1 до 255 с секундным интервалом и посмотреть, что осцилл кажетъ. Будет 1-в-1. Проверено лично мной уже давным давно!!!
А тут соглашусь частично, осциллографом пользоваться умею, и да авто-настройка у него нормальная, и именно из-за этого я не сразу заметил подвоха. Авто-настройка редко, но залипает на каких то гармониках, и как заметил один возможно умный но не очень воспитанный форумчанин, она наткнулась на гармонику по питанию от USB ноутбука, или еще какую (особо не разбирался) и показала картинку в которую было легко поверить уставшему мозгу, а еще сбило то что на нано проверял и не увидел никаких подобных глюков. Но опять же замечу, основной вопрос был относительно запуска ШИМ на нескольких пинах, а картинка была как сопутствующий глюк, но на не как раз все и возбудились.