Результат ADC в AVR зависит от выхода ни другом пине?! Нужен совет.
похоже, результат измерения ADC внешнего напряжения на пинах 18 и 19
Наблюдал такое же перекрестное влияние между входами АЦП на атмеге16, в проекте зарядного устройства, которое делали совместно с VAD64. Снизил сопротивление в цепи измерения напряжения (уменьшил номиналы резисторного делителя). При изменении напряжения на соседнем порту значение АЦП менялось на несколько единиц.
Но влияние было не на всех портах и не на всех входах АЦП, а только на каких-то. Видимо, зависит от того какая периферия и как шарится. В общем снижайте сопротивление источника.
Платку еще отмыть как следует в СБС не помешает…
В дополнении к тому, что сказал Алксандр можно попробовать конденсатор поставить между входом АЦП и землёй.
Также, если вы используете 10 бит, то может хватит и 8 ?
Спасибо всем откликнувшимся!
То есть всё было прекрасно перед заменой МК при такой-же прошивке и фузах…
Выглядит так, однако гарантировать трудно, поскольку LED мигает или до начала работы, когда значения АЦП не используются, либо при потере сигнала (а я обычно старался его не терять). В нормальном режиме он горит постоянно. Но все-таки думаю, что если б оно раньше было, то обратил бы внимание. Что точно – это загружая прежнюю программу в плату с новым чипом этот эффект 100% воспризводится. Фьюзы, конечно, те же – иначе бы ничего не работало. Перед самой заменой МК неизвестно, поскольку заменил как раз из-за того, что он перестал отзываться (и работать). Но до попыток перепрограммирования, как сказал, похоже, работал нормально.
В общем, еще поэкспериментировал, и, похоже, это проблема именно 11-го пина (PA7). Вроде переключая PB0 или PA5 с PA6 (одновременно) этого не наблюдается, хотя экспериментировать со впаянном в серьезную схему процом очень непросто. Похоже также, что если этот PA7 сконфигурировать на вход, эффект тоже пропадает, хотя pullup его по-прежнему перетягивает (и LED мигает, хотя и слабо).
Что меня настораживает, это даташит, на стр. 50, в начале описания Alternative Functions of Port A, написано следующее:
… If some Port A pins are configured as outputs, it is essential
that these do not switch when a conversion is in progress. This
might corrupt the result of conversion.
Они что, всерьез это пишут? Обсуждаемая программа делает конверсию постоянно, в фоновом режиме. Что же получается, при этом ни один из пинов порта А нельзя использовать на выход?! Какая-то ерунда… В любом случае, наблюдаемый эффект не связан с переключением пина, а именно с его состоянием, ON или OFF.
Наблюдал такое же перекрестное влияние между входами АЦП на атмеге16, в проекте зарядного устройства, которое делали совместно с VAD64. Снизил сопротивление в цепи измерения напряжения (уменьшил номиналы резисторного делителя). При изменении напряжения на соседнем порту значение АЦП менялось на несколько единиц.
Но влияние было не на всех портах и не на всех входах АЦП, а только на каких-то. Видимо, зависит от того какая периферия и как шарится. В общем снижайте сопротивление источника.
Входы АЦП подсоединены к средним точкам 10ком потенциометров, так что входное сопротивление во всяком случае меньше 2.5ком – уж куда меньше! И там действительно стоят конденсаторы, только я не знаю их емкость.
В итоге, как-то все смахивает на проблему железа (точнее, кремния). Но тогда непонятно, как же они вообще работают, ну, то есть, не они, а все устройства, что на них делаются. Понятно, если совсем редко случается, что контроллер совсем не пашет. Но если он может запросто так подглючивать, как же на них рассчитывать? Ведь я мог бы это даже не заметить, если бы сервы были в сборе (а сейчас потенциометры сняты с осей редукторов), ну, вибрировали бы сервы в fail-safe режиме, списалось бы на что иное…
А теперь что? Перед впаиванием в схему делать каждому новому чипу полную проверку – так как? Что проверять-то заранее неизвестно!
Также, если вы используете 10 бит, то может хватит и 8 ?
Да мне, наверное, хватило бы и 6 бит, да при этом нужно программу видоизменять. Но сдвиг-то чтения, похоже, приличный, процента 4-5 от Vref, а то и побольше!
Доступ к прошивке в какой-то форме имеется, я, собственно, и делаю небольшие модификации кода. Без этого новый чип вообще бы не работал, у него на 8МГц частота сбита процентов на 10 и без подгонки OSCCALа он просто PPM сигнал не признавал за правильный… После правки мозгов теперь признает, но, гад, не сдается…
Платку еще отмыть как следует в СБС не помешает…
Дак хорошо бы знать, что такое это СБС, с чем его едят и чем закусывают… А вообще-то там в схеме нет высокоомных цепей…
Т.е всё зависит от того, ваша это разработка или нет.
Нет, это не моя разработка – Валкеры (см. old.rcdesign.ru/index.php?showtopic=23532). Переделано следуя уже упоминавшемуся здесь Vad64, программа именно его (с небольшими изменениями). Соответственно, что-то можно изменить в железе, но не радикально, платка компактная и свободного места без лишку.
Пока решил попробовать паллиатив: перевесил LED на PA4 проводком, а PA7 сконфигурирую на вход. Надо загрузить программу и посмотреть, что выйдет.
СБС - спирто-бензиновая смесь 😃
Но раз нет высокоомных цепей - значит не нать.
Наблюдал такое же перекрестное влияние между входами АЦП на атмеге16, в проекте зарядного устройства, которое делали совместно с VAD64.
…
При изменении напряжения на соседнем порту значение АЦП менялось на несколько единиц.
Но влияние было не на всех портах и не на всех входах АЦП, а только на каких-то. Видимо, зависит от того какая периферия и как шарится.
На PA4 у меня ни хрена не вышло, все точно также, как и на PA7, если еще не хуже. А вот на PB0, вроде, все в порядке (да и порт другой). При этом вроде вчера проверил, что PA5 и PA6 не оказывают влияния. Ну и дела…
И ведь это не разные входы АЦП смешиваются, а цифровой выход влияет на АЦП! Ладно, пока попробую этот вариант, а как-нибудь в другой раз, наверное, нужно будет заменить микроконтроллер. Как-то не по себе, что на такое вот можно легко напороться с этими Атмелями. Интересно, часто такие интересные экземпляры попадаются?
Я по ссылке пройти не могу.
Может выложите хотя-бы кусок кода, где идёт обработка ( считывание ) ADC.
Т.е. что-то типа
interrupt [ADC_INT] void adc_isr(void)
{
// Read the AD conversion result …
Т.е. Есть ли там
**************************
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
**************************
И не забудьте, что ATtiny26 - довольно старый МК
Я по ссылке пройти не могу.
Может выложите хотя-бы кусок кода, где идёт обработка ( считывание ) ADC.Есть ли там
**************************
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);**************************
На новом форуме ссылка rcopen.com/forum/f59/topic23532, но кода там нет.
Сама программа на ассемблере, не в С. Никакого Delayя там нет, да и чего его вводить, когда потенциометр вообще не трогается, одно и тоже напряжение в течение минуты (в моих тестах сейчас); gain не меняется, только канал. Просто ADC постоянно делает конверсию в фоновом режиме. По прерыванию ADC complete он входит в ISR, где читает полученное значение, записывает в SRAM, меняет канал по кругу из трех, инициирует следующую конверсию и выходит из ISR. Да, каждая новая конверсия extended типа, которая занимает 25 ADC клоков.
Delay как раз и делается для того, чтобы на время отключить всё, что оказывает помехи и на короткое время, чтобы не нарушать остальную работу.
Ну тогда или опять перепаивать, или спросите у Vad64
Delay как раз и делается для того, чтобы на время отключить всё, что оказывает помехи и на короткое время, чтобы не нарушать остальную работу.
Ну тогда или опять перепаивать, или спросите у Vad64
Что спросить? Что-то я уже спрашивал. А программа у меня перед глазами…
Delay программой тут делать нельзя, иначе остальное не будет вовремя сделано. И какие тут помехи? Я понимаю, если бы речь шла о последнем десятом бите. Так ведь проблема в 5%!
И не забудьте, что ATtiny26 - довольно старый МК
Да я и сам не очень молодой…
Вполне возможно что просто брак. Применяем их по паре тыс. в год. Бывает что и reset не работает 😃 . Вроде ты говорил что у него частота на 10 процентов не та, то тогда точно брак. или фича? Надо проверить…
А в какую сторону изменяется значение(т.е. постоянно в одну или в разные).
Это , я думаю, один из ключевых моментов.
Вроде ты говорил что у него частота на 10 процентов не та, то тогда точно брак. или фича?
Он всегда загружает калибровочный байт частоты на 1МГц, а я работяю на 8МГц. Так что формально криминала нет, по идее я должен сам загружать нужную калибровку на других частотах. Но до сих пор всегда работало без какой-либо перекалибровки (во всяком случае, жалоб и от других любителей, вроде, не поступало). А вот именно этот экземпляр подложил мне такого поросеночка. Для экпертов это, наверное, раз плюнуть, а я-то о таких тонкостях понятия не имел – не работает, и все! Да еще плюс к тому другие глюки. Мне вообще нужно памятник при жизни, что я расчухал, что к чему…
А в какую сторону изменяется значение(т.е. постоянно в одну или в разные).
Это , я думаю, один из ключевых моментов.
Значение, выдаваемое АЦП, меняется в одну сторону (и для канала 1, и для канала 2 – что для канала 0, сказать не могу – это не так наглядно проявляется). Это в зависимости от состояния PA7. В какую сторону его тягал PA4, я как-то не засекал. Но тоже в одну сторону для обоих каналов.
А какой примерно процент брака по вашей статистике?
Простов этом случае этот ваш процент можно поменять программно ( не самый плохой вариант ).
А светодиод на землю посажен ?
И есть ли ёмкости на 18 и 19 пинах вообще ?
К стабилизатору на 3V прицеплены только МК и потенциометры ?
в этом случае этот ваш процент можно поменять программно.
Именно так я его и смог запустить. Так что само по себе сейчас это уже не проблема.
А светодиод на землю посажен ?
И есть ли ёмкости на 18 и 19 пинах вообще ?
К стабилизатору на 3V прицеплены только МК и потенциометры ?
На нее, родную, через 820 ом. Емкости есть, но какие – на них не написано.
К стабилизатору на 3V прицеплены потенциометры, гироскоп и AREF самого ATTINY26L.
Ну значит просто МК фиговый попался.
Хотя я бы попробовал Delay на 10 микросекунд поставить.
Через недельку-другую буду делать один из вариантов регулятора для Speed400 на ATtiny45 - посмотрю, помогает ли этот Delay на самом деле или нет. Просто автогенератор кода в CVAvr его обычно ставит.
После замены ATTINY26L в SOIC корпусе (rcopen.com/forum/f8/topic127972) появилась странная проблема: похоже, результат измерения ADC внешнего напряжения на пинах 18 и 19 [PortA Pins 1 и 2] (возможно, и на пине 20 – трудно проверить) зависит от состояния пина 11 [Port A Bit 7] (он работает на выход и управляет LED, ток не более 2.5ma).
В даташите указано черным по белому: во время измерения АЦП ноги порта АЦП не должны переключаться, от себя добавлю что и грузить этот порт нельзя. Связано со схемотехникой кристалла, как собраны входные цепи АЦП (УВХ и мультиплексор)
Volante24 Тут есть еще одна фича, что после переключения канала, в первом преобразовании получаешь почти всегда хрень, поэтому оно должно быть холостым, тока второе дает правильный результат. Но твою проблему проверю и отпишусь.
Но у него же значения зависят от того горит светодиод или нет, А за это время происходит множество преобразований и если бы там действительно каждый раз хрень получалась, то ваще ничего бы не работало, или я не совсем прав ?
Но у него же значения зависят от того горит светодиод или нет, А за это время происходит множество преобразований и если бы там действительно каждый раз хрень получалась, то ваще ничего бы не работало, или я не совсем прав ?
По-моему так. За каждые полсекунды горения или негорения LEDа происходит около 2.5 тысяч преобразований, каждый раз по другому каналу. Но если бы проблема происходила только в момент переключения LEDа, этого бы было 100% не заметить. На практике результат читается один раз в 2мс (АЦП значение по каждому каналу обновляется каждые 0.6мс).
Вероятность неправильного прочтения из-за переключения составляет 0.2мс/.5сек=1/250 (по каждому каналу). Единичное же неправильное входное значение приводит к импульсу на мотор сервы 2мс. Такой короткий пульс, если он единичный, был бы незаметен, а среднее значение 1/250 не может заставить мотор вращаться. Так что дело точно не в переключении, а в состоянии пина!
Volante24 Тут есть еще одна фича, что после переключения канала, в первом преобразовании получаешь почти всегда хрень, поэтому оно должно быть холостым, тока второе дает правильный результат. Но твою проблему проверю и отпишусь.
Наверное, так. Но я, следуя Vad64, делаю “extended conversion”, которое занимает почти вдвое больше времени (25 циклов АЦП таймера). Наверное, оно для того и придумано, чтобы ждать нужное время? Эти 12 лишних циклов дают примерно 100мкс задержку…
В даташите указано черным по белому: во время измерения АЦП ноги порта АЦП не должны переключаться, от себя добавлю что и грузить этот порт нельзя. Связано со схемотехникой кристалла, как собраны входные цепи АЦП (УВХ и мультиплексор)
Так я это заметил, именно потому и спрашиваю людей с практическим опытом. Я не обращал на это внимания, поскольку в любом случае последняя пара битов меня здесь нисколько не волнует. Народ, вроде, это обычно игнорирует, и проблем не наблюдает… А главное, у меня собрана тестовая плата с панелькой для того же ATTINY26 в DIPе, и там все работает без фокусов. Да и у других вроде таких проблем не наблюдалось.
И вот еще: на этом же порте А еще два пина (PA5 и PA6) используются на выход, причем серьезно – переключаются (потенциально) два раза в 2 мс, если есть сигнал на серво мотор. Поскольку тут, таким образом, есть обратная связь (сигнал на этот мотор зависит от показаний АЦП), предсказать поведение затруднительно, но я думаю, был бы бардак и мотор вряд ли бы спокойно остановился, раз начав работать. А как раз с этим, похоже, в порядке…
А главное, у меня собрана тестовая плата с панелькой для того же ATTINY26 в DIPе, и там все работает без фокусов.
Меняй камень. Благо он 20 рупий стоит. Проверить фичу седня не получилось, завтра 100% проверю и отпишусь.