Проблемы с АЦП на Atmega8

Все прочитали, вроде даже поняли, взяли паяльник - а нифига не получается? Скорее сюда! Поможем. Чем можем...
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 329
Зарегистрирован: Пн фев 18, 2008 17:48:40

Сообщение Stass48 »

Доброй ночи, господа коты!
Раньше приходилось использовать лишь одну ногу АЦП и в общем то, все работало сносно.
Но сейчас мне пришлось задействовать три входа АЦП! Вот тут началась полная хрень! :evil:
Должно работать! Работает! Но криво!
С соседних входов лезут помехи на другой! Что я только не пробовал: настраивал неиспользуемые ноги (adc3, 4, 5) как выходы, без настройки на выходы — садил их все на землю...
Да, в том и том случае ситуация улучшалась значительно!
Однако вот сейчас у меня на adc0 и adc1 висят потенциометры по 10 кОм, а на adc2 — 50 кОм подстроечник, которым меряю напряжение на 12 вольтовом акуме.
На первые два входа, на выход из делителя — вешал rc-цепь 0,1м-10к. Но как выяснилось позже, резистор в этой цепи только делал хуже и я его убрал, оставив только конденсатор на 0,1 между входами ацп и землей.
Конкретно сейчас у меня лишние входы ацп накоротко посажены на землю (естественно конфиг этих ног как на выходы я убрал). Но осталась проблема: когда ручки первых двух резюков примерно выкручены на половину, то на третьем входе АЦП происходит аномальное увеличение значения! У меня делитель на третьем входе настроен чтобы мерять напряжение от 0 до 15 Вольт! В итоге когда выкручуешь те две ручки на половину, то у меня финальное показание скачет с 12.5 аж до 12.7! На каждом резисторе, который выкручивается на половину, вольтметр мой дает погрешность на 0.1 вольта! В принципе, можно на это забить, так как у меня в принципе напруга в акуме меряется лишь для справки и эти 0.2 вольта там что зайцу стоп-сигнал... Но все же хотелось бы разобраться с корнем самой проблемы!
Ацп работает в 10-битном режиме (0-1023), режим измерений Single.
В Баскоме есть функция для снятия измерений с конкретного входа ацп — getadc(0) или вместо нуля другой вход...

Что я делаю не так?
The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

флюс отмыть для начала
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 329
Зарегистрирован: Пн фев 18, 2008 17:48:40

Сообщение Stass48 »

Ну, я не флюсом паяю, а канифолью. И, да, с платы я ее не смывал. Смою окей. Но лично мне слабо верится, что проблема в этом. Когда делал конфиг АЦП не Single, a Free — творилась полная лажа! У меня значения вообще скакали в несоответствующем диапазоне!
Но в Баскоме есть рекомендация что нужно ставить Single режим и тогда пользовать функцию getadc(). Я так и поступил. Начало выдавать норм показания.
Короче, канифоль ща смою ацетоном. Есть еще какие-то варианты кроме канифоли?
И кстати, лишние входы хоть действительно правильно садить накоротко на землю или это нужно делать как-то по-другому? Или их лучше на + питания садить?
И можно их вообще между собой замыкать?
The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Друг Кота
Аватара пользователя
Сообщения: 16548
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

[uquote="Stass48",url="/forum/viewtopic.php?p=3129993#p3129993"]Короче, канифоль ща смою ацетоном. Есть еще какие-то варианты кроме канифоли?[/uquote]Конечно, есть. Первое, что приходит в голову - криво написанный софт.
[uquote="Stass48",url="/forum/viewtopic.php?p=3129993#p3129993"]И кстати, лишние входы хоть действительно правильно садить накоротко на землю или это нужно делать как-то по-другому? Или их лучше на + питания садить?
И можно их вообще между собой замыкать?[/uquote]Можно ничего с ними (аппаратно) не делать, но сконфигурить на вход с подтяжкой. Или на выход с выдачей нуля. Замыкать на питание или общий не есть хорошо: если нога окажется сконфигурённой на выход с выдачей неправильного уровня, то здоровенный ток будет циркулировать зря. А сконфигурить ногу случается и случайно.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 329
Зарегистрирован: Пн фев 18, 2008 17:48:40

Сообщение Stass48 »

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

Код: Выделить всё

$regfile = "m8adef.dat"
$crystal = 4000000

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim A As Word , B As Word , C As Word

Start Adc

Do
   A = GetAdc(0)
   B = GetAdc(1)
   C = GetAdc(2)
   
   Waitms 100
Loop

End
Пробовал вносить задержки между измерениями – до лампочки.
Если можете предложить вариант этого кода лучше – милости прошу. Только не предлагайте мне тот код, где контроллер уходит в сплячку во время замера :)
mickbell писал(а):Можно ничего с ними (аппаратно) не делать, но сконфигурить на вход с подтяжкой.
Сами себе противоречите что-ли? :))
Так делать аппаратно или не делать? Для меня "не делать" значит – оставить висеть в воздухе!
О какой "подтяжке" идет речь? Резистор?
Тогда:
1) Номинал
2) Куда подтягивать, на Vcc? На Gnd?
The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

это значит ни к чему его не припаивать, а сделать DDRx=0, а PORTx=1, и нога "x" уже не будет просто болтаться, собирая помехи, а будет как вход ненажатой кнопки (подтяжка внутри МК).
от себя: попробуй использовать результат второго - третьего замера, то есть сначала замерять с этого же входа "вхолостую", а уже потом как надо.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 16548
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

[uquote="Stass48",url="/forum/viewtopic.php?p=3130070#p3130070"]Я не представляю, как можно НЕ правильно написать две строчки кода...

Код: Выделить всё

$regfile = "m8adef.dat"
$crystal = 4000000

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim A As Word , B As Word , C As Word

Start Adc

Do
   A = GetAdc(0)
   B = GetAdc(1)
   C = GetAdc(2)
   
   Waitms 100
Loop

End
Пробовал вносить задержки между измерениями – до лампочки.
Если можете предложить вариант этого кода лучше – милости прошу. Только не предлагайте мне тот код, где контроллер уходит в сплячку во время замера :)[/uquote]Это что ещё за птичий язык? Что такое Start Adc? Что такое GetAdc(x)? Где внутреннее содержимое этого чего-то? На этом, хмм, языке я ничего предлагать не буду. Сам пишу для МК только на Си, и - главное - всегда пользуюсь только теми функциями, которые писал сам. Может быть, поэтому и проблем с "перекрытием" каналов АЦП у меня не бывает.
[uquote="Stass48",url="/forum/viewtopic.php?p=3130070#p3130070"]
mickbell писал(а):Можно ничего с ними (аппаратно) не делать, но сконфигурить на вход с подтяжкой.
Сами себе противоречите что-ли? :))[/uquote]Перед тем, как делать выводы по чьему-то сообщению, сначала рекомендую его понять. Не получается - тогда спросить. Конфигурирование ноги есть чисто программная манипуляция.
[uquote="Stass48",url="/forum/viewtopic.php?p=3130070#p3130070"]Так делать аппаратно или не делать? Для меня "не делать" значит – оставить висеть в воздухе!
О какой "подтяжке" идет речь? Резистор?
Тогда:
1) Номинал
2) Куда подтягивать, на Vcc? На Gnd?[/uquote]Подтяжка - это внутренний резистор, включаемый прописыванием едининцы в соответствующий бит регистра PORTx при сброшенном аналогичном бите в регистре DDRx. Подтяжка в AVRках делается только на плюс питания. Внешне нога действительно оказывается висящей, никуда не подключенной.

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3130086#p3130086"]от себя: попробуй использовать результат второго - третьего замера, то есть сначала замерять с этого же входа "вхолостую", а уже потом как надо.[/uquote]Боюсь, не поможет. Подозреваю, что там функция GetADC(x) написана криво, отсюда и проблема. Хотя может и помочь. Но всё равно это неправильно - пользоваться чем-то кривым.
Последний раз редактировалось mickbell Вт июн 20, 2017 23:48:25, всего редактировалось 1 раз.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 329
Зарегистрирован: Пн фев 18, 2008 17:48:40

Сообщение Stass48 »

Bascom AVR достаточно распространенный язык... Да, в нем есть некоторые недостатки, но все же чтобы прямо функция чтения данных с АЦП это врядли... Если бы что-то и было, то уже пофиксили бы... Больше 10 лет язык существует все таки.

Start ADC - это включение модуля АЦП.
Так же его можно физически отключить командой Stop ADC.

Про внутренние подтяжки я в курсе.
Делается это при помощи команды Set <нужная нога>, то есть:

Config Pinc.3 = Input
Config Pinc.4 = Input
Config Pinc.5 = Input

Set portc.3
Set portc.4
Set portc.5

Странно, что "перекрытие" сказывается только на третьем входе, где делитель сделан от +12В - АЦП - Общий.
Однако проблема отсутствует с делителями: +5В - АЦП - Общий.

Пять вольт из двенадцати получаю при помощи 7805.
Не может ли как-то получиться, что при изменении параметров первых двух делителей, меняются параметры третьего и контроллер тут не причем?
The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

тогда - схему в студию!
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 329
Зарегистрирован: Пн фев 18, 2008 17:48:40

Сообщение Stass48 »

Схема – три сосны...
Вот чем питается контроллер и делители:
Изображение

А вот питание модуля АЦП:
Изображение
The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Друг Кота
Аватара пользователя
Сообщения: 16548
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

Всё-таки подозрение падает на некорректную реализацию функции GetAdc(). Предлагаю сделать так: оставить чтение только второго канала (12 В), убрав (закомментировав) чтение других, но физически входы не отключать, и проверить, сохранится ли влияние каналов 0 и 1 на показания канала 2. Конфигурирование ног оставить как было.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 329
Зарегистрирован: Пн фев 18, 2008 17:48:40

Сообщение Stass48 »

Даже если не мерять в программе первые два входа (0 и 1), то на входе 2 все равно плавают показания при вращении ручек на входах 0 и 1, даже не смотря на то, что с них никаких замеров не берется, а берется только со входа 2.
В общем, ответ на ваше сообщение: влияние сохраняется.

Добавлено after 4 minutes 45 seconds:
Я вообще, честно говоря, не понимаю этот дебилизм с остальными ногами, которые я не использую! Ну висят они в воздухе, ну ловят помехи и что??? Я ж не с них показания меряю! А те, с которых меряю подтянуты к делителю и так...

Добавлено after 9 minutes 28 seconds:
Может проблема в резисторе на 50 кОм? Может заменить его на 10 кОм?
Мощность, рассеиваемая резюком-делителем вроде должна быть пустяковой:
Изображение

При мощности маленьких резюков в 0.125 Вт, вполне себе юзабельно...
The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

А если соединить ногу 7 с ногой 20 напрямую (закоротить резистор R1) ? Может не тот номинал впаяли?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 329
Зарегистрирован: Пн фев 18, 2008 17:48:40

Сообщение Stass48 »

[uquote="Барсик",url="/forum/viewtopic.php?p=3130610#p3130610"]Может не тот номинал впаяли?[/uquote]
Да ну как же не тот? На нем "101" написано, то есть, 100 Ω :)
Барсик писал(а):А если соединить ногу 7 с ногой 20 напрямую (закоротить резистор R1) ?
Давно пробовал. Ничего не меняет :(

Добавлено after 3 hours 48 minutes 19 seconds:
UPD!!!

Да! Проблема крылась действительно в этом злополучном резисторе на 100 Ом!
Убрал из кода все вычисления и все стало видно на голых значениях.

Замкнул накоротко и все теперь работает :)
The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Поставьте вместо резистора дросселек, как рекомендовано в даташите. Дроссель редко когда обрывается.
Мудрый кот
Аватара пользователя
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Сообщение Flasher »

Если мега 8 без буквы а в конце, то нужно просто замкнуть. На выходе кренки поставьте 47 мкф вместо 470
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 329
Зарегистрирован: Пн фев 18, 2008 17:48:40

Сообщение Stass48 »

Барсик писал(а):Поставьте вместо резистора дросселек, как рекомендовано в даташите. Дроссель редко когда обрывается.
Что за дроссель? С каким номиналом? Стоит ли его ставить вообще (специально ехать за ним в магазин)? В даташите нашел про фильтр низких частот (полагаю, rc-цепь):
If the ADC is used, it should be connected to VCC through a low-pass filter.

Добавлено after 3 minutes 57 seconds:
[uquote="Flasher",url="/forum/viewtopic.php?p=3130998#p3130998"]Если мега 8 без буквы а в конце, то нужно просто замкнуть. На выходе кренки поставьте 47 мкф вместо 470[/uquote]

Контроллер Atmega8A, то есть с буквой А в конце.

Ниже емкость, чтобы сократить время КЗ на выходе кренки во время зарядки конденсатора? Или из каких-то других соображений?
The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Stass48 писал(а):Что за дроссель? С каким номиналом? Стоит ли его ставить вообще
В даташите написано: "2. The AVCC pin on the device should be connected to the digital VCC supply voltage via an LC network as shown in Figure 96." А на рисунке 96 показана идуктивность 10 микрогенри и 0,1 микрофарад на землю.
Напоминаю, что "should be" переводится как "должно быть".
Мудрый кот
Аватара пользователя
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Сообщение Flasher »

Ну если с А, то дроссель очень желателен. 10-33мкГн. EC36, например.
Конденсатор уменьшить из соображений увеличения устойчивости обратной связи в кренке.
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Когда делал конфиг АЦП не Single, a Free — творилась полная лажа! У меня значения вообще скакали в несоответствующем диапазоне!
Возможно, вы слишком быстро переключали каналы, конденсатор цепи выборки-хранения не успевал зарядиться до уровня напряжения, соответствующего входному. Вполне вероятно, что упомянутый вами резистор влиял на напряжение на AVCC в момент выборки и, соответственно, на сопротивление ключей мультиплексора.

Скорость АЦП должна выбираться с учетом выходного сопротивления источника сигнала.
Напоминаю, что "should be" переводится как "должно быть".
Скорее "рекомендуется". "Should" - мягкий совет. :) А вот когда "must" - это значит, что без описанного просто работать не будет, ну или что-то сгорит.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Ответить

Вернуться в «Практика»