Не работает PWM на D3 при частоте 980 Гц и выше

AlexeyL
Offline
Зарегистрирован: 26.01.2021

Всем привет.

Есть 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 или нет?

Всем заранее спасибо!

sadman41
Offline
Зарегистрирован: 19.10.2016

Даже представить не могу, как может PWM частично умереть. Половина байта счётчика отгорела?

b707
Offline
Зарегистрирован: 26.05.2017

AlexeyL - это какая-то ненаучная фантастика. PWM - исключительно логичесткий механизм, в нем не может ничего "сгореть". Если он работает на частоте 490 - будет и на 980.

А то что вы рассказываете - это что-то из области "протирки оптических осей" :)

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Схема и программа. Где-то накосячили. Не вижу ни одного, ни другого.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AlexeyL, возьмите другую плату и не пудрите мозги ни себе, ни окружающим.

Это не тот вопрос, ради которого стоило бы создавать тему.

AlexeyL
Offline
Зарегистрирован: 26.01.2021

mykaida пишет:

Схема и программа. Где-то накосячили. Не вижу ни одного, ни другого.

Справедливо :)

Схема:

Код:

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);
}

 

andriano пишет:

Это не тот вопрос, ради которого стоило бы создавать тему.

Если для вас это не стоящая тема, зачем вы вообще сюда пришли? Вас тут никто не держит. Была бы другая плата, использовал бы ее. Мне интересно разобраться. Частичное подтверждение моей гипотезы подтверждают нормально работающие другие выходы PWM. Однако, как и многие другие, я не верю, что PWM может сломаться лишь частично.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AlexeyL пишет:

 

Если для вас это не стоящая тема, зачем вы вообще сюда пришли?

Да потому, что автор (вот негодяй!) не пометил эту тему как нестоящую, чтобы я заранее, не заходя в нее, смог это понять.

AlexeyL
Offline
Зарегистрирован: 26.01.2021

andriano пишет:

Да потому, что автор (вот негодяй!) не пометил эту тему как нестоящую, чтобы я заранее, не заходя в нее, смог это понять.

Теперь вы знаете, что тема для вас не стоящая. Будьте добры, не тратьте ваше время. До свидания.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Выяснение, что именно сгорело в микроконтроллере - интерес подростка, как лапки косиножке обрывать. ;))) Скорее всего что-то сгорело (--Спасибо, Кэп!).

Если на высоких частотах почти не работает, то возникла паразитная емкость на землю. Но какая, в 3.14зду, разница? Если очень интересно - выложи осциллограмму на разных частотах и скважностях. Скорее всего там будет характерная "пила" емкости.

Надо добавить: а если нет осциллографа - твой интерес еще более инфантилен. Выбрось каку и возьми другую плату. 170 рублей, включая доставку. По поводу такой суммы даже у бомжа не хватит наглости сказать: "Не считай чужие деньги!" ;)))

AlexeyL
Offline
Зарегистрирован: 26.01.2021

wdrakula пишет:

Но какая, в 3.14зду, разница? Если очень интересно - выложи осциллограмму на разных частотах и скважностях. Скорее всего там будет характерная "пила" емкости.

Ну вот такой мозг пытливый, вот и интересно :) Плюс все еще есть вероятность, что я где-то накосячил. Если здесь скажут, что косяка в коде нет (лишняя пара глаз никогда не помешает), то с большой вероятностью и правда проблема в железе. Просто никогда не мог подумать, что убить ножку может не полностью, а вот таким хитрым образом, будто действительно возникла емкость. Раньше если они выгорали, то выгорали насовсем.

Если бы у меня был осциллограф, то я бы не стал отвлекать людей по пустякам и сам бы во всем разобрался :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Если на эквивалентном МК все нормально, то какой вывод из этого следует?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Если на эквивалентном МК все нормально, то какой вывод из этого следует?

что Дракула прав и нужен осциллограф )))

Green
Offline
Зарегистрирован: 01.10.2015

А это что значит:
 

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 какие изначально значения? И какие получаются?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Green пишет:

А это что значит:
 

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 какие изначально значения? И какие получаются?

Малацца! А я и  не обратил внимание! ;)))) Забавно выходит.

AlexeyL
Offline
Зарегистрирован: 26.01.2021

Green пишет:

А это что значит:
 

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(). Сейчас попробую поиграться. Спасибо за мысль :)

AlexeyL
Offline
Зарегистрирован: 26.01.2021

Green пишет:

В TCCR0B и 2B какие изначально значения? И какие получаются?

ОГРОМНОЕ вам спасибо :) Проблема именно в дефолтных значениях и оказалась. D3 работает на всех частотах. Угораздило меня скопировать чужой код и не включить вовремя мозг :)

Теперь остается понять, как вообще этот код работал раньше. Ведь Ардуиновский стартап-код не менялся. Т.е. дефолтные значения поменяться не могли. Если только ардуиновская IDE не подтянула со временем апдейт, в котором уже новые дефолтные версии прописаны (в чем я очень сомневаюсь).

Ну да ладно, это уже офтоп. Проблема решена, ветку можно закрывать, Green'у еще раз огромное спасибо!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AlexeyL пишет:

Теперь остается понять, как вообще этот код работал раньше. Ведь Ардуиновский стартап-код не менялся. 

AlexeyL, IDE не при чём. Этот "код" никогда не работал, т.к. команда TCCR2B &= B00000011 лишена здравого смысла, по крайней мере задачу "разогнать PWM", т.е. установить делитель клоков на минимум, не трогая остальные биты эта команда выполняет с точностью до наоборот. 

AlexeyL
Offline
Зарегистрирован: 26.01.2021

Все верно, лишена. Но PWM как-то работал. Ладно, это уже офтоп и не важно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexeyL пишет:

Все верно, лишена. Но PWM как-то работал. Ладно, это уже офтоп и не важно.

если DIMAX сказал не работал, значит не работал!!!  )))

Green
Offline
Зарегистрирован: 01.10.2015

Как то у вас всё неконкретно. Что значит работал?  У вас PWM на 3-м пине как раз и не работал. При analogWrite(3, 255) просто выставляется 1-ца без участия PWM. А когда ставите другое значение, тогда и видно что он не работает.
А вообще, конечно, это порнография. Если вы знаете какой установлен режим, так и перезаписывайте его полностью, через присвоение. Не знаете, прочтите и убедитесь, а потом уже изменяйте. Сами себе грабли делаете.

Logik
Offline
Зарегистрирован: 05.08.2014

Че значить не знает какой установлен режим. В сетапе режим всегда один и тот же. TCCR2B=0х00. Так в описании приведено и если бутлодер не лазил туда то так и будет. Очевидно что в таком случае TCCR2B &= B00000011;  и даст 0. А не то, что хотелось бы ТС. Все как с обычной переменной работает. Если по ходу программы в TCCR2B будет другое значение записано, то TCCR2B &= B00000011 вполне будет осмысленным. Рассматривайте TCCR2B как обычную переменную инициализированную нулем при ресете, но помните что не все регистры переферии инициализируются нулем, бывают и другие значения, см. даташит .

AlexeyL
Offline
Зарегистрирован: 26.01.2021

Да я прекрасно знаю, что такое регистры :) И вы совершенно правы. Проверил - везде в коде стоит &=, просто присваивания(=) нигде нет. И да, еще раз, вы правы, если стартап код обнуляет эти регистры, то в них всегда должно было быть 0 и PWM бы никогда не должен был работать. Но по факту сигнал шел. Возможно, не той частоты, которую я задавал, т.к. я не измерял осциллографом, но яркость светодиода перед оптроном менялась. Поэтому я и предположил, что такое могло бы объяснить, если стартап код по какой-то причине поменялся. И да, крайне маловероятно, что IDE бес спросу его поменяла в результате апдейта.

Green пишет:

Как то у вас всё неконкретно. Что значит работал?

Прошу прощения за неточность. Имелось ввиду, что PWM на D3 работал до появления проблем. Т.е. до появления новой платки с ключом и до обнаружения, что из-за сопли на ножку Ардуино подавалось 12В. Светодиод на платке мигал и при PWM 1 кГц, и при 4 кГц. Как я писал выше, вполне вероятно, что не на той частоте, что я ожидал, т.к. я ее не мерял.

В общем, пока для меня наиболее вероятным видится, что в процессе борьбы с новой платкой я, возможно, поменял код, который раньше просто присваивал значение регистрам таймера, т.е. без &. Это могло бы обьяснить наличие каких-то данных в регистре до выполнения &= и могло бы обьяснить, почему PWM работал. Код не под сурс-контролем, поэтому хистори проверить я не могу.

AlexeyL
Offline
Зарегистрирован: 26.01.2021

Green пишет:

Если вы знаете какой установлен режим, так и перезаписывайте его полностью, через присвоение. Не знаете, прочтите и убедитесь, а потом уже изменяйте. Сами себе грабли делаете.

Да все верно. Я уже признал свою ошибку :) Да, накосячил и наделал граблей :) Спасибо, что указали на проблему.