Результат ADC в AVR зависит от выхода ни другом пине?! Нужен совет.

Volante24

После замены ATTINY26L в SOIC корпусе (rcopen.com/forum/f8/topic127972) появилась странная проблема: похоже, результат измерения ADC внешнего напряжения на пинах 18 и 19 [PortA Pins 1 и 2] (возможно, и на пине 20 – трудно проверить) зависит от состояния пина 11 [Port A Bit 7] (он работает на выход и управляет LED, ток не более 2.5ma). В одном из режимов программы LED горит постоянно, в другом мигает с периодом около 1сек. Во втором случае измерения совпадают с прежним в моменты, когда LED горит, и отличаются, когда LED погашен. Различие, похоже, составляет процентов 5 от полного интервала (3V).

Что это может быть? Только неисправность микроконтроллера (мультиплексор ADC или еще что), или он в порядке, но существует какая-нибудь тонкость в этих AVRах? Кто-нибудь с чем-нибудь подобным сталкивался? Сам процессор, похоже, работает, исправно выполняя довольно непростую программу с кучей разных функций.

Как он сконфигурирован: питание 5V от стабилизатора, Vcc соединен с AVcc, эти же 5V подаются на еще один стабилизатор, дающий 3V, с его выхода напряжение подается на AREF (PA3) и на верхнюю точку двух потенциометров. Их нижние точки на земле, а средние измеряются каналами 1 и 2 ADC с пинов 18 и 19 (PortA Pins 1 и 2). Основная конфигурация REFS1, REFS0 = 0,1 [AREF (PA3), Internal Vref is turned off]. Пробовал и другие комбинации, либо очень плохо работает, либо тот же результат.

Что делать? Замена самого микроконтроллера возможна, но рассматривается только как последняя возможность из-за проблем с выпаиванием и впаиванием в схему.

Очень хотелось бы выслушать мнение людей с опытом и получить дельный совет.

Chekhov

То есть всё было прекрасно перед заменой МК при такой-же прошивке и фузах.

Если есть доступ к прошивке, тогда могут быть варианты :

ADC довольно чувствительная вещ. В функции считывания значения обычно делают паузу ( 10 мксек ).
Если потенциометры не доходят до верхнего положения, то можно потерять 15% значений, но питать ARef от внутреннего источника.
Т.е всё зависит от того, ваша это разработка или нет.

Алксандр
Volante24:

похоже, результат измерения ADC внешнего напряжения на пинах 18 и 19

Наблюдал такое же перекрестное влияние между входами АЦП на атмеге16, в проекте зарядного устройства, которое делали совместно с VAD64. Снизил сопротивление в цепи измерения напряжения (уменьшил номиналы резисторного делителя). При изменении напряжения на соседнем порту значение АЦП менялось на несколько единиц.
Но влияние было не на всех портах и не на всех входах АЦП, а только на каких-то. Видимо, зависит от того какая периферия и как шарится. В общем снижайте сопротивление источника.

AlexN

Платку еще отмыть как следует в СБС не помешает…

Chekhov

В дополнении к тому, что сказал Алксандр можно попробовать конденсатор поставить между входом АЦП и землёй.
Также, если вы используете 10 бит, то может хватит и 8 ?

Volante24

Спасибо всем откликнувшимся!

Chekhov:

То есть всё было прекрасно перед заменой МК при такой-же прошивке и фузах…

Выглядит так, однако гарантировать трудно, поскольку 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 режиме, списалось бы на что иное…

А теперь что? Перед впаиванием в схему делать каждому новому чипу полную проверку – так как? Что проверять-то заранее неизвестно!

Chekhov

Также, если вы используете 10 бит, то может хватит и 8 ?

Да мне, наверное, хватило бы и 6 бит, да при этом нужно программу видоизменять. Но сдвиг-то чтения, похоже, приличный, процента 4-5 от Vref, а то и побольше!

Доступ к прошивке в какой-то форме имеется, я, собственно, и делаю небольшие модификации кода. Без этого новый чип вообще бы не работал, у него на 8МГц частота сбита процентов на 10 и без подгонки OSCCALа он просто PPM сигнал не признавал за правильный… После правки мозгов теперь признает, но, гад, не сдается…

AlexN

Платку еще отмыть как следует в СБС не помешает…

Дак хорошо бы знать, что такое это СБС, с чем его едят и чем закусывают… А вообще-то там в схеме нет высокоомных цепей…

Chekhov

Т.е всё зависит от того, ваша это разработка или нет.

Нет, это не моя разработка – Валкеры (см. old.rcdesign.ru/index.php?showtopic=23532). Переделано следуя уже упоминавшемуся здесь Vad64, программа именно его (с небольшими изменениями). Соответственно, что-то можно изменить в железе, но не радикально, платка компактная и свободного места без лишку.

Пока решил попробовать паллиатив: перевесил LED на PA4 проводком, а PA7 сконфигурирую на вход. Надо загрузить программу и посмотреть, что выйдет.

AlexN

СБС - спирто-бензиновая смесь 😃
Но раз нет высокоомных цепей - значит не нать.

Volante24
Алксандр:

Наблюдал такое же перекрестное влияние между входами АЦП на атмеге16, в проекте зарядного устройства, которое делали совместно с VAD64.

При изменении напряжения на соседнем порту значение АЦП менялось на несколько единиц.
Но влияние было не на всех портах и не на всех входах АЦП, а только на каких-то. Видимо, зависит от того какая периферия и как шарится.

На PA4 у меня ни хрена не вышло, все точно также, как и на PA7, если еще не хуже. А вот на PB0, вроде, все в порядке (да и порт другой). При этом вроде вчера проверил, что PA5 и PA6 не оказывают влияния. Ну и дела…

И ведь это не разные входы АЦП смешиваются, а цифровой выход влияет на АЦП! Ладно, пока попробую этот вариант, а как-нибудь в другой раз, наверное, нужно будет заменить микроконтроллер. Как-то не по себе, что на такое вот можно легко напороться с этими Атмелями. Интересно, часто такие интересные экземпляры попадаются?

Chekhov

Я по ссылке пройти не могу.
Может выложите хотя-бы кусок кода, где идёт обработка ( считывание ) 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 - довольно старый МК

Volante24
Chekhov:

Я по ссылке пройти не могу.
Может выложите хотя-бы кусок кода, где идёт обработка ( считывание ) 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 клоков.

Chekhov

Delay как раз и делается для того, чтобы на время отключить всё, что оказывает помехи и на короткое время, чтобы не нарушать остальную работу.

Ну тогда или опять перепаивать, или спросите у Vad64

Volante24
Chekhov:

Delay как раз и делается для того, чтобы на время отключить всё, что оказывает помехи и на короткое время, чтобы не нарушать остальную работу.

Ну тогда или опять перепаивать, или спросите у Vad64

Что спросить? Что-то я уже спрашивал. А программа у меня перед глазами…

Delay программой тут делать нельзя, иначе остальное не будет вовремя сделано. И какие тут помехи? Я понимаю, если бы речь шла о последнем десятом бите. Так ведь проблема в 5%!

Chekhov:

И не забудьте, что ATtiny26 - довольно старый МК

Да я и сам не очень молодой…

serg111

Вполне возможно что просто брак. Применяем их по паре тыс. в год. Бывает что и reset не работает 😃 . Вроде ты говорил что у него частота на 10 процентов не та, то тогда точно брак. или фича? Надо проверить…

Chekhov

А в какую сторону изменяется значение(т.е. постоянно в одну или в разные).

Это , я думаю, один из ключевых моментов.

Volante24
serg111:

Вроде ты говорил что у него частота на 10 процентов не та, то тогда точно брак. или фича?

Он всегда загружает калибровочный байт частоты на 1МГц, а я работяю на 8МГц. Так что формально криминала нет, по идее я должен сам загружать нужную калибровку на других частотах. Но до сих пор всегда работало без какой-либо перекалибровки (во всяком случае, жалоб и от других любителей, вроде, не поступало). А вот именно этот экземпляр подложил мне такого поросеночка. Для экпертов это, наверное, раз плюнуть, а я-то о таких тонкостях понятия не имел – не работает, и все! Да еще плюс к тому другие глюки. Мне вообще нужно памятник при жизни, что я расчухал, что к чему…

Chekhov:

А в какую сторону изменяется значение(т.е. постоянно в одну или в разные).

Это , я думаю, один из ключевых моментов.

Значение, выдаваемое АЦП, меняется в одну сторону (и для канала 1, и для канала 2 – что для канала 0, сказать не могу – это не так наглядно проявляется). Это в зависимости от состояния PA7. В какую сторону его тягал PA4, я как-то не засекал. Но тоже в одну сторону для обоих каналов.

А какой примерно процент брака по вашей статистике?

Chekhov

Простов этом случае этот ваш процент можно поменять программно ( не самый плохой вариант ).
А светодиод на землю посажен ?
И есть ли ёмкости на 18 и 19 пинах вообще ?
К стабилизатору на 3V прицеплены только МК и потенциометры ?

Volante24
Chekhov:

в этом случае этот ваш процент можно поменять программно.

Именно так я его и смог запустить. Так что само по себе сейчас это уже не проблема.

А светодиод на землю посажен ?
И есть ли ёмкости на 18 и 19 пинах вообще ?
К стабилизатору на 3V прицеплены только МК и потенциометры ?

На нее, родную, через 820 ом. Емкости есть, но какие – на них не написано.
К стабилизатору на 3V прицеплены потенциометры, гироскоп и AREF самого ATTINY26L.

Chekhov

Ну значит просто МК фиговый попался.
Хотя я бы попробовал Delay на 10 микросекунд поставить.

Через недельку-другую буду делать один из вариантов регулятора для Speed400 на ATtiny45 - посмотрю, помогает ли этот Delay на самом деле или нет. Просто автогенератор кода в CVAvr его обычно ставит.

serj
Volante24:

После замены ATTINY26L в SOIC корпусе (rcopen.com/forum/f8/topic127972) появилась странная проблема: похоже, результат измерения ADC внешнего напряжения на пинах 18 и 19 [PortA Pins 1 и 2] (возможно, и на пине 20 – трудно проверить) зависит от состояния пина 11 [Port A Bit 7] (он работает на выход и управляет LED, ток не более 2.5ma).

В даташите указано черным по белому: во время измерения АЦП ноги порта АЦП не должны переключаться, от себя добавлю что и грузить этот порт нельзя. Связано со схемотехникой кристалла, как собраны входные цепи АЦП (УВХ и мультиплексор)

serg111

Volante24 Тут есть еще одна фича, что после переключения канала, в первом преобразовании получаешь почти всегда хрень, поэтому оно должно быть холостым, тока второе дает правильный результат. Но твою проблему проверю и отпишусь.

Chekhov

Но у него же значения зависят от того горит светодиод или нет, А за это время происходит множество преобразований и если бы там действительно каждый раз хрень получалась, то ваще ничего бы не работало, или я не совсем прав ?

Volante24
Chekhov:

Но у него же значения зависят от того горит светодиод или нет, А за это время происходит множество преобразований и если бы там действительно каждый раз хрень получалась, то ваще ничего бы не работало, или я не совсем прав ?

По-моему так. За каждые полсекунды горения или негорения LEDа происходит около 2.5 тысяч преобразований, каждый раз по другому каналу. Но если бы проблема происходила только в момент переключения LEDа, этого бы было 100% не заметить. На практике результат читается один раз в 2мс (АЦП значение по каждому каналу обновляется каждые 0.6мс).
Вероятность неправильного прочтения из-за переключения составляет 0.2мс/.5сек=1/250 (по каждому каналу). Единичное же неправильное входное значение приводит к импульсу на мотор сервы 2мс. Такой короткий пульс, если он единичный, был бы незаметен, а среднее значение 1/250 не может заставить мотор вращаться. Так что дело точно не в переключении, а в состоянии пина!

serg111:

Volante24 Тут есть еще одна фича, что после переключения канала, в первом преобразовании получаешь почти всегда хрень, поэтому оно должно быть холостым, тока второе дает правильный результат. Но твою проблему проверю и отпишусь.

Наверное, так. Но я, следуя Vad64, делаю “extended conversion”, которое занимает почти вдвое больше времени (25 циклов АЦП таймера). Наверное, оно для того и придумано, чтобы ждать нужное время? Эти 12 лишних циклов дают примерно 100мкс задержку…

serj:

В даташите указано черным по белому: во время измерения АЦП ноги порта АЦП не должны переключаться, от себя добавлю что и грузить этот порт нельзя. Связано со схемотехникой кристалла, как собраны входные цепи АЦП (УВХ и мультиплексор)

Так я это заметил, именно потому и спрашиваю людей с практическим опытом. Я не обращал на это внимания, поскольку в любом случае последняя пара битов меня здесь нисколько не волнует. Народ, вроде, это обычно игнорирует, и проблем не наблюдает… А главное, у меня собрана тестовая плата с панелькой для того же ATTINY26 в DIPе, и там все работает без фокусов. Да и у других вроде таких проблем не наблюдалось.

И вот еще: на этом же порте А еще два пина (PA5 и PA6) используются на выход, причем серьезно – переключаются (потенциально) два раза в 2 мс, если есть сигнал на серво мотор. Поскольку тут, таким образом, есть обратная связь (сигнал на этот мотор зависит от показаний АЦП), предсказать поведение затруднительно, но я думаю, был бы бардак и мотор вряд ли бы спокойно остановился, раз начав работать. А как раз с этим, похоже, в порядке…

serg111
Volante24:

А главное, у меня собрана тестовая плата с панелькой для того же ATTINY26 в DIPе, и там все работает без фокусов.

Меняй камень. Благо он 20 рупий стоит. Проверить фичу седня не получилось, завтра 100% проверю и отпишусь.

Volante24
serg111:

Меняй камень. Благо он 20 рупий стоит.

Где ж это так? Чтой-то я меньше, чем за 80, его не видел (за наличные, если меньше сотни штук!)

Да дело вообще не в сотне рублей (у меня теперь есть запасные – два мне просто подарили); проблема в их выпаивании и впаивании на плату! Это само по себе морока, плюс каждый раз при этом большой шанс повредить какую-нибудь дорожку, а вдобавок, каждый третий раз, когда эту плату берешь в руки, какой-нибудь из проводков (а их: шесть к серво потенциометрам, четыре – к серво моторам, шесть к ISP разъему, два питания, четыре на выход к двум бесколлекторным ESC, да еще антенна). Не говоря уже про вытаскивание из корпуса и втискивание обратно. С каждым обрывом при этом создается все более сильное впечатление, что процесс просто не сходится…

serg111

За нал хз по чем, по безналу брали и много. В ЭФО самые нормальные цены были.
Проверял седня ацп на порту А. Ниче криминального не заметил, ноги дергаеш ацп дрожит на 1-2 единицы счета, не дергаеш стоит мертво. камень …26-16SU + кварц на 5Мгц, на рефе тл431. Кстати, есть такой tiny261(пин в пин tiny26), у него есть аппаратное “мертвое время” и 3 канала шима, и компаратором можно рубить шим, делая тем самым защиту по току(поцикловку) с миркоскопическими задержками.