Не работает PWM на D3 при частоте 980 Гц и выше
- Войдите на сайт для отправки комментариев
Всем привет.
Есть Arduino, есть платка с Mosfet-ключом, у которой на входе стоит светодиод и оптрон. Раньше настраивал PWM на 3м выходе (D3) на разных частотах (60, 122, 245, 490, 980, 3921, 31372) - все работало, яркость входного светодиода менялась в зависимости от скважности.
Купил другую платку с Mosfet-ключом. Она очень простая, даже без опторазвязки. С ней при запуске были проблемы - почему-то на затворе полевика болталось какое-то напряжение даже если она ко входу Arduino не подключена. Проблем я не нашел, решил, что может где-то сопля висит или через пыль/грязь каким-то образом питание 12В доходит до затвора. Почистил щеткой - ключ перестал открываться без сигнала с Ардуино.
Но, видимо, обнаружил проблему я поздно. Сейчас по непонятной причине выход D3 работает просто как выход, также на него можно подавать PWM, но сигнал при PWM он выдает только если частота 490 Гц и менее. При 980 на выходе пусто. Та же история с D11. Проверял как на новой платке с ключом, так и на старой. Все остальные выходы PWM работают нормально как со старой платкой, так и с новой.
Предполагаю, что имевшаяся до чистки сопля привела к повышению напряжения на D3 до значений выше 5В, что могло повредить (частично?) PWM. Почему тогда нога вообще еще работает - не понятно.
Вопросы:
1. Мог ли PWM умереть "частично", т.е. на частотах 980 Гц и выше? Как-то сомнительно. Если не мог, то как думаете, в чем может быть причина такого странного поведения?
2. Есть ли какая-то возможность узнать статус PWM? Сомневаюсь, но может все же есть какой-то способ считать регистры, которые бы показали, в рабочем ли состоянии PWM или нет?
Всем заранее спасибо!
Даже представить не могу, как может PWM частично умереть. Половина байта счётчика отгорела?
AlexeyL - это какая-то ненаучная фантастика. PWM - исключительно логичесткий механизм, в нем не может ничего "сгореть". Если он работает на частоте 490 - будет и на 980.
А то что вы рассказываете - это что-то из области "протирки оптических осей" :)
Схема и программа. Где-то накосячили. Не вижу ни одного, ни другого.
AlexeyL, возьмите другую плату и не пудрите мозги ни себе, ни окружающим.
Это не тот вопрос, ради которого стоило бы создавать тему.
Схема и программа. Где-то накосячили. Не вижу ни одного, ни другого.
Справедливо :)
Схема:
Код:
void loop() { } void setup() { pinMode(3, OUTPUT); pinMode(5, OUTPUT); // Работает //digitalWrite(3, HIGH); // 980 Гц TCCR2B &= B00000011; // Работает //analogWrite(3, 255); // Не работает analogWrite(3, 250); // 8 кГц TCCR0B &= B00000010; // Работает analogWrite(5, 128); }Это не тот вопрос, ради которого стоило бы создавать тему.
Если для вас это не стоящая тема, зачем вы вообще сюда пришли? Вас тут никто не держит. Была бы другая плата, использовал бы ее. Мне интересно разобраться. Частичное подтверждение моей гипотезы подтверждают нормально работающие другие выходы PWM. Однако, как и многие другие, я не верю, что PWM может сломаться лишь частично.
Если для вас это не стоящая тема, зачем вы вообще сюда пришли?
Да потому, что автор (вот негодяй!) не пометил эту тему как нестоящую, чтобы я заранее, не заходя в нее, смог это понять.
Теперь вы знаете, что тема для вас не стоящая. Будьте добры, не тратьте ваше время. До свидания.
Выяснение, что именно сгорело в микроконтроллере - интерес подростка, как лапки косиножке обрывать. ;))) Скорее всего что-то сгорело (--Спасибо, Кэп!).
Если на высоких частотах почти не работает, то возникла паразитная емкость на землю. Но какая, в 3.14зду, разница? Если очень интересно - выложи осциллограмму на разных частотах и скважностях. Скорее всего там будет характерная "пила" емкости.
Надо добавить: а если нет осциллографа - твой интерес еще более инфантилен. Выбрось каку и возьми другую плату. 170 рублей, включая доставку. По поводу такой суммы даже у бомжа не хватит наглости сказать: "Не считай чужие деньги!" ;)))
Но какая, в 3.14зду, разница? Если очень интересно - выложи осциллограмму на разных частотах и скважностях. Скорее всего там будет характерная "пила" емкости.
Ну вот такой мозг пытливый, вот и интересно :) Плюс все еще есть вероятность, что я где-то накосячил. Если здесь скажут, что косяка в коде нет (лишняя пара глаз никогда не помешает), то с большой вероятностью и правда проблема в железе. Просто никогда не мог подумать, что убить ножку может не полностью, а вот таким хитрым образом, будто действительно возникла емкость. Раньше если они выгорали, то выгорали насовсем.
Если бы у меня был осциллограф, то я бы не стал отвлекать людей по пустякам и сам бы во всем разобрался :)
Если на эквивалентном МК все нормально, то какой вывод из этого следует?
что Дракула прав и нужен осциллограф )))
А это что значит:
void loop() { } void setup() { pinMode(3, OUTPUT); pinMode(5, OUTPUT); // Работает //digitalWrite(3, HIGH); // 980 Гц TCCR2B &= B00000011; //? // Работает //analogWrite(3, 255); // Не работает analogWrite(3, 250); // 8 кГц TCCR0B &= B00000010; //? // Работает analogWrite(5, 128); }В TCCR0B и 2B какие изначально значения? И какие получаются?
А это что значит:
void loop() { } void setup() { pinMode(3, OUTPUT); pinMode(5, OUTPUT); // Работает //digitalWrite(3, HIGH); // 980 Гц TCCR2B &= B00000011; //? // Работает //analogWrite(3, 255); // Не работает analogWrite(3, 250); // 8 кГц TCCR0B &= B00000010; //? // Работает analogWrite(5, 128); }В TCCR0B и 2B какие изначально значения? И какие получаются?
Малацца! А я и не обратил внимание! ;)))) Забавно выходит.
А это что значит:
void loop() { } void setup() { pinMode(3, OUTPUT); pinMode(5, OUTPUT); // Работает //digitalWrite(3, HIGH); // 980 Гц TCCR2B &= B00000011; //? // Работает //analogWrite(3, 255); // Не работает analogWrite(3, 250); // 8 кГц TCCR0B &= B00000010; //? // Работает analogWrite(5, 128); }В TCCR0B и 2B какие изначально значения? И какие получаются?
Хм. Не знаю. Но Ардуиновский стартап-код не менялся. Какие-то значения он там прописывает перед вызовом setup(). Сейчас попробую поиграться. Спасибо за мысль :)
В TCCR0B и 2B какие изначально значения? И какие получаются?
ОГРОМНОЕ вам спасибо :) Проблема именно в дефолтных значениях и оказалась. D3 работает на всех частотах. Угораздило меня скопировать чужой код и не включить вовремя мозг :)
Теперь остается понять, как вообще этот код работал раньше. Ведь Ардуиновский стартап-код не менялся. Т.е. дефолтные значения поменяться не могли. Если только ардуиновская IDE не подтянула со временем апдейт, в котором уже новые дефолтные версии прописаны (в чем я очень сомневаюсь).
Ну да ладно, это уже офтоп. Проблема решена, ветку можно закрывать, Green'у еще раз огромное спасибо!
Теперь остается понять, как вообще этот код работал раньше. Ведь Ардуиновский стартап-код не менялся.
AlexeyL, IDE не при чём. Этот "код" никогда не работал, т.к. команда TCCR2B &= B00000011 лишена здравого смысла, по крайней мере задачу "разогнать PWM", т.е. установить делитель клоков на минимум, не трогая остальные биты эта команда выполняет с точностью до наоборот.
Все верно, лишена. Но PWM как-то работал. Ладно, это уже офтоп и не важно.
Все верно, лишена. Но PWM как-то работал. Ладно, это уже офтоп и не важно.
если DIMAX сказал не работал, значит не работал!!! )))
Как то у вас всё неконкретно. Что значит работал? У вас PWM на 3-м пине как раз и не работал. При analogWrite(3, 255) просто выставляется 1-ца без участия PWM. А когда ставите другое значение, тогда и видно что он не работает.
А вообще, конечно, это порнография. Если вы знаете какой установлен режим, так и перезаписывайте его полностью, через присвоение. Не знаете, прочтите и убедитесь, а потом уже изменяйте. Сами себе грабли делаете.
Че значить не знает какой установлен режим. В сетапе режим всегда один и тот же. TCCR2B=0х00. Так в описании приведено и если бутлодер не лазил туда то так и будет. Очевидно что в таком случае TCCR2B &= B00000011; и даст 0. А не то, что хотелось бы ТС. Все как с обычной переменной работает. Если по ходу программы в TCCR2B будет другое значение записано, то TCCR2B &= B00000011 вполне будет осмысленным. Рассматривайте TCCR2B как обычную переменную инициализированную нулем при ресете, но помните что не все регистры переферии инициализируются нулем, бывают и другие значения, см. даташит .
Да я прекрасно знаю, что такое регистры :) И вы совершенно правы. Проверил - везде в коде стоит &=, просто присваивания(=) нигде нет. И да, еще раз, вы правы, если стартап код обнуляет эти регистры, то в них всегда должно было быть 0 и PWM бы никогда не должен был работать. Но по факту сигнал шел. Возможно, не той частоты, которую я задавал, т.к. я не измерял осциллографом, но яркость светодиода перед оптроном менялась. Поэтому я и предположил, что такое могло бы объяснить, если стартап код по какой-то причине поменялся. И да, крайне маловероятно, что IDE бес спросу его поменяла в результате апдейта.
Как то у вас всё неконкретно. Что значит работал?
Прошу прощения за неточность. Имелось ввиду, что PWM на D3 работал до появления проблем. Т.е. до появления новой платки с ключом и до обнаружения, что из-за сопли на ножку Ардуино подавалось 12В. Светодиод на платке мигал и при PWM 1 кГц, и при 4 кГц. Как я писал выше, вполне вероятно, что не на той частоте, что я ожидал, т.к. я ее не мерял.
В общем, пока для меня наиболее вероятным видится, что в процессе борьбы с новой платкой я, возможно, поменял код, который раньше просто присваивал значение регистрам таймера, т.е. без &. Это могло бы обьяснить наличие каких-то данных в регистре до выполнения &= и могло бы обьяснить, почему PWM работал. Код не под сурс-контролем, поэтому хистори проверить я не могу.
Если вы знаете какой установлен режим, так и перезаписывайте его полностью, через присвоение. Не знаете, прочтите и убедитесь, а потом уже изменяйте. Сами себе грабли делаете.
Да все верно. Я уже признал свою ошибку :) Да, накосячил и наделал граблей :) Спасибо, что указали на проблему.