Страница 1 из 2
Проблемы с АЦП на Atmega8
Добавлено: Пн июн 19, 2017 23:01:31
Stass48
Доброй ночи, господа коты!
Раньше приходилось использовать лишь одну ногу АЦП и в общем то, все работало сносно.
Но сейчас мне пришлось задействовать три входа АЦП! Вот тут началась полная хрень!
Должно работать! Работает! Но криво!
С соседних входов лезут помехи на другой! Что я только не пробовал: настраивал неиспользуемые ноги (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) или вместо нуля другой вход...
Что я делаю не так?
Re: Проблемы с АЦП на Atmega8
Добавлено: Вт июн 20, 2017 07:27:48
Mishany
флюс отмыть для начала
Re: Проблемы с АЦП на Atmega8
Добавлено: Вт июн 20, 2017 16:40:24
Stass48
Ну, я не флюсом паяю, а канифолью. И, да, с платы я ее не смывал. Смою окей. Но лично мне слабо верится, что проблема в этом. Когда делал конфиг АЦП не Single, a Free — творилась полная лажа! У меня значения вообще скакали в несоответствующем диапазоне!
Но в Баскоме есть рекомендация что нужно ставить Single режим и тогда пользовать функцию getadc(). Я так и поступил. Начало выдавать норм показания.
Короче, канифоль ща смою ацетоном. Есть еще какие-то варианты кроме канифоли?
И кстати, лишние входы хоть действительно правильно садить накоротко на землю или это нужно делать как-то по-другому? Или их лучше на + питания садить?
И можно их вообще между собой замыкать?
Re: Проблемы с АЦП на Atmega8
Добавлено: Вт июн 20, 2017 19:46:32
mickbell
[uquote="Stass48",url="/forum/viewtopic.php?p=3129993#p3129993"]Короче, канифоль ща смою ацетоном. Есть еще какие-то варианты кроме канифоли?[/uquote]Конечно, есть. Первое, что приходит в голову - криво написанный софт.
[uquote="Stass48",url="/forum/viewtopic.php?p=3129993#p3129993"]И кстати, лишние входы хоть действительно правильно садить накоротко на землю или это нужно делать как-то по-другому? Или их лучше на + питания садить?
И можно их вообще между собой замыкать?[/uquote]Можно ничего с ними (аппаратно) не делать, но сконфигурить на вход с подтяжкой. Или на выход с выдачей нуля. Замыкать на питание или общий не есть хорошо: если нога окажется сконфигурённой на выход с выдачей неправильного уровня, то здоровенный ток будет циркулировать зря. А сконфигурить ногу случается и случайно.
Re: Проблемы с АЦП на Atmega8
Добавлено: Вт июн 20, 2017 20:10:59
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?
Re: Проблемы с АЦП на Atmega8
Добавлено: Вт июн 20, 2017 20:49:38
Ivanoff-iv
это значит ни к чему его не припаивать, а сделать DDRx=0, а PORTx=1, и нога "x" уже не будет просто болтаться, собирая помехи, а будет как вход ненажатой кнопки (подтяжка внутри МК).
от себя: попробуй использовать результат второго - третьего замера, то есть сначала замерять с этого же входа "вхолостую", а уже потом как надо.
Re: Проблемы с АЦП на Atmega8
Добавлено: Вт июн 20, 2017 21:11:57
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) написана криво, отсюда и проблема. Хотя может и помочь. Но всё равно это неправильно - пользоваться чем-то кривым.
Re: Проблемы с АЦП на Atmega8
Добавлено: Вт июн 20, 2017 22:15:37
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.
Не может ли как-то получиться, что при изменении параметров первых двух делителей, меняются параметры третьего и контроллер тут не причем?
Re: Проблемы с АЦП на Atmega8
Добавлено: Вт июн 20, 2017 22:21:58
Ivanoff-iv
тогда - схему в студию!
Re: Проблемы с АЦП на Atmega8
Добавлено: Вт июн 20, 2017 22:50:21
Stass48
Схема – три сосны...
Вот чем питается контроллер и делители:
А вот питание модуля АЦП:

Re: Проблемы с АЦП на Atmega8
Добавлено: Вт июн 20, 2017 23:56:49
mickbell
Всё-таки подозрение падает на некорректную реализацию функции GetAdc(). Предлагаю сделать так: оставить чтение только второго канала (12 В), убрав (закомментировав) чтение других, но физически входы не отключать, и проверить, сохранится ли влияние каналов 0 и 1 на показания канала 2. Конфигурирование ног оставить как было.
Re: Проблемы с АЦП на Atmega8
Добавлено: Ср июн 21, 2017 16:37:41
Stass48
Даже если не мерять в программе первые два входа (0 и 1), то на входе 2 все равно плавают показания при вращении ручек на входах 0 и 1, даже не смотря на то, что с них никаких замеров не берется, а берется только со входа 2.
В общем, ответ на ваше сообщение: влияние сохраняется.
Добавлено after 4 minutes 45 seconds:
Я вообще, честно говоря, не понимаю этот дебилизм с остальными ногами, которые я не использую! Ну висят они в воздухе, ну ловят помехи и что??? Я ж не с них показания меряю! А те, с которых меряю подтянуты к делителю и так...
Добавлено after 9 minutes 28 seconds:
Может проблема в резисторе на 50 кОм? Может заменить его на 10 кОм?
Мощность, рассеиваемая резюком-делителем вроде должна быть пустяковой:
При мощности маленьких резюков в 0.125 Вт, вполне себе юзабельно...
Re: Проблемы с АЦП на Atmega8
Добавлено: Ср июн 21, 2017 17:26:56
Барсик
А если соединить ногу 7 с ногой 20 напрямую (закоротить резистор R1) ? Может не тот номинал впаяли?
Re: Проблемы с АЦП на Atmega8
Добавлено: Ср июн 21, 2017 23:02:12
Stass48
[uquote="Барсик",url="/forum/viewtopic.php?p=3130610#p3130610"]Может не тот номинал впаяли?[/uquote]
Да ну как же не тот? На нем "101" написано, то есть, 100 Ω
Барсик писал(а):А если соединить ногу 7 с ногой 20 напрямую (закоротить резистор R1) ?
Давно пробовал. Ничего не меняет
Добавлено after 3 hours 48 minutes 19 seconds:
UPD!!!
Да!
Проблема крылась действительно в этом злополучном резисторе на 100 Ом!
Убрал из кода все вычисления и все стало видно на голых значениях.
Замкнул накоротко и все теперь работает

Re: Проблемы с АЦП на Atmega8
Добавлено: Чт июн 22, 2017 06:14:44
Барсик
Поставьте вместо резистора дросселек, как рекомендовано в даташите. Дроссель редко когда обрывается.
Re: Проблемы с АЦП на Atmega8
Добавлено: Чт июн 22, 2017 10:48:57
Flasher
Если мега 8 без буквы а в конце, то нужно просто замкнуть. На выходе кренки поставьте 47 мкф вместо 470
Re: Проблемы с АЦП на Atmega8
Добавлено: Чт июн 22, 2017 14:23:21
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, то есть с буквой А в конце.
Ниже емкость, чтобы сократить время КЗ на выходе кренки во время зарядки конденсатора? Или из каких-то других соображений?
Re: Проблемы с АЦП на Atmega8
Добавлено: Чт июн 22, 2017 15:05:12
Барсик
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" переводится как "должно быть".
Re: Проблемы с АЦП на Atmega8
Добавлено: Чт июн 22, 2017 21:04:05
Flasher
Ну если с А, то дроссель очень желателен. 10-33мкГн. EC36, например.
Конденсатор уменьшить из соображений увеличения устойчивости обратной связи в кренке.
Re: Проблемы с АЦП на Atmega8
Добавлено: Чт июн 29, 2017 17:06:32
YS
Когда делал конфиг АЦП не Single, a Free — творилась полная лажа! У меня значения вообще скакали в несоответствующем диапазоне!
Возможно, вы слишком быстро переключали каналы, конденсатор цепи выборки-хранения не успевал зарядиться до уровня напряжения, соответствующего входному. Вполне вероятно, что упомянутый вами резистор влиял на напряжение на AVCC в момент выборки и, соответственно, на сопротивление ключей мультиплексора.
Скорость АЦП должна выбираться с учетом выходного сопротивления источника сигнала.
Напоминаю, что "should be" переводится как "должно быть".
Скорее "рекомендуется". "Should" - мягкий совет.

А вот когда "must" - это значит, что без описанного просто работать не будет, ну или что-то сгорит.