Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Погрешность результата преобразования ADC.


Погрешность результата преобразования ADC.

Сообщений 1 страница 29 из 29

1

Изначально ставилась задача измерения сопротивления в диапазоне от 1 до 100 ом.
В итоге столкнулся с проблемой неравномерности результата измерения во всем диапазоне - чем больше номинал сопротивления, тем выше погрешность.
Подскажите пожалуйста, это результат 10-bit преобразования или мой косяк в вычислении ?

Код:
 $regfile = "m16def.dat"
  $crystal = 16000000
  $hwstack = 40
  $swstack = 16
  $framesize = 32
'============================= КОНФИГУРАЦИЯ АЦП ================================
  Config Adc = Single , Prescaler = 2 , Reference = Internal
  Start Adc
'=============================КОНФИГУРАЦИЯ ДИСПЛЕЯ==============================
  Config Lcd = 20 * 4
  Config Lcdpin = Pin , Rs = Portd.6 , E = Portd.5 , Db4 = Portd.4 , Db5 = Portd.3 , Db6 = Portd.2 , Db7 = Portd.1
  Cursor Off
  Cls
'============================= ОБЪЯВЛЯЕМ ПЕРЕМЕННЫЕ ============================
  Dim A As Integer
  Dim B As Single
  Dim C As Single
  Dim D As String * 4
'============================ ИЗМЕРЕНИЕ СОПРОТИВЛЕНИЯ ==========================
Do
  A = Getadc(0)                                             ' считываем результат
  B = A * 2.56 : B = B / 1024                               ' работаем по формуле - U2 = Результат ADC x  2.56  /  1024
  C = 12 / B : C = C - 1 : C = C * 0.3                      ' работаем по формуле - R1=R2*(U1/U2-1)
  D = Fusing(c , "00.0")                                    ' преобразуем для вывода на экран в удобном виде
  Locate 1 , 1 : Lcd D
Loop

http://sh.uploads.ru/t/KsVyT.jpg
Исходник и Proteus прилагаю

0

2

Но первое у тебя неравномерность напряжения, надо стабильный ток. Чем выше будет опорное тем точнее и меньше погрешности АЦП.
Так же я сталкивался с проблемой что у АЦП есть погрешность в зависимости от напруги, точнее на всех АЦП я такое замечаю это совсем фигня но когда счёт на 1 LSB то чувствуется.
Надо сделать в твоём случае как миним 10 измерений но симуляции ты не заметишь разницы. А так же ты посчитай шаг и 10бит это ясно дело мало.
Ты для чего такое делаешь клавиатура или мультиметр? Для мультиметра используй источник тока, для клавиатуры это похер. Я для клавиатуры не какого преобразоваия ни делаю просто диапазон значений АЦП скажем 100-125, 135-160, и алгоритм с фильтрацией.
При 10бит и источнике тока у тебя будет 0.1 погрешность, то есть +/- 0.1 макс отклонение, хотя на практике может быть больше из-за шумов и прочих аппаратных отклонений которых в симуляторе нет. С делителем у тебя погрешность будет в разы больше по краям. Хотя разрядность при большом количестве измерений возрастёт, точность тут хз конечно предсказывать не возьмусь, но учти что в получить в реальность точность в 0.1Ом сомневаюсь, контакт плавает на те же 0.2-0.4Ом если резюки звонить мультиметром. Можно разрядность повысить за счёт переключения диапазона, до 40Ом, 40-80, 80-120.
Так же рекомендую замыкать на землю резюки.

Отредактировано RadioHAM-433 (2016-05-30 10:19:31)

0

3

В железе все выглядит еще плачевней. Вполне бы устроила погрешность в  5 едениц младшего разряда, но пока не получается добится такого результата.
Приглянулась вот эта тема : Программное повышение разрядности АЦП Попробую таким образом поработать с ADC.

0

4

В железе всё всегда по другому. Я ни когда не ограничивался 1 измерением в таких вещах, у меня в настройках вольтметра настраивается количество измерений прямо не лету.
Я скажу что АЦП на 5 единиц не шумит у меня при 10 измерених порядка 1 LSB погрешность. Ты так и не сказал что за железка, но попробуй щупами создать стабильный контакт до 0.1Ом я такого не видел, 0.2-0.3, если хорошо прижать то до 0.1 падает стабильней.

0

5

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

Отредактировано angald (2016-05-30 10:34:12)

0

6

Prescaler = 2 - это очень мало, измеряет очень быстро, но точность километровая, ставь "авто" или макс значение, если хочешь чтобы точно мерил (одни шумы иначе будут).

0

7

Выставил Prescaler = 128, стало поинтересней, но не совсем чего хотелось - примерно до 35~40 ом в пределах разумного, а вот выше погрешность растет.
Все таки склоняюсь к методу нескольких измерений с последующим усреднением.
Вот только не врублюсь как это реализовать . Может кто поделиться кусочком кода ?

0

8

Ну так это обязательная процедура (с накоплением результатов), работать будет всё равно быстрее мультиметра в разы.
А если делать всё по феншую (с измерением в спячке МК и режиме фри), то результат будет ещё лучше.

На счет накопления результата, алгоритм примитивный:

- берем переменную word (16-бит);
- т.к. у нас всего 10-бит, то у нас есть ещё в запасе 6 бит - это 63 свободных измерения;
- просто измеряем/берём показания АЦП, складываем с word переменной 63 раза, а потом делим на это число (63), получаем среднюю арифметическую.

Отредактировано RDW (2016-05-30 12:14:25)

0

9

Спасибо за направление. Нашел на форуме несколько тем, буду читать.

0

10

Какое нафиг "направление", я вам точный алгоритм описал. :)
Кстати у вас в коде переменная A - Integer, АЦП в вашем использовании имеет только положительное значение (знак не нужен).
Если слабо разбираетесь в написание своего кода и пользуетесь копипастами, то вот пример:

Код:
Dim S as Word
Dim K as Byte

Это добавляем в общую область объявления переменных.

Далее:

Код:
If K = 0 Then 
     S = 0
     K = 63
Else
     A = Getadc(0)
     S = S + A
     Decr K
End If

Это вставляем вместо "A = Getadc(0)".
Итоговое значения берём из S.

Отредактировано RDW (2016-05-30 12:43:18)

0

11

Вот тут Ссылкаребята усредняли показания АЦП другим способом

0

12

RDW написал(а):

Какое нафиг "направление", я вам точный алгоритм описал.
Кстати у вас в коде переменная A - Integer, АЦП в вашем использовании имеет только положительное значение (знак не нужен).
Если слабо разбираетесь в написание своего кода и пользуетесь копипастами, то вот пример:


Попробовал в железе - стабильность измерения возросла, то есть если прежде при каждом измерении одного и того-же сопротивления
показания плавали до 8 единиц после запятой, то в данный момент 1 / 2 единицы.
А вот проблема с погрешностью при измерении свыше 35~40 ом осталась.
По поводу переменной A-Integer, это просто не доглядел, раньше она по другому назначению использовалась.
Еще раз спасибо за помощь.

0

13

Sergik07 написал(а):

Вот тут Ссылкаребята усредняли показания АЦП другим способом

Интересное решение, надо попробовать в железе.

0

14

angald написал(а):

А вот проблема с погрешностью при измерении свыше 35~40 ом осталась.

Как у вас выглядит схема? Хоть это и резистор (линейная хар-ка), но всё зависит от делителя, его нужно грамотно подобрать/рассчитать, иначе может получится, что динамический диапазон АЦП будет не равномерно использоваться и придется делать/рассчитывать таблицу измерений внутри МК. АЦП же не ток мерит, а напряжение...
Да и главное, как вы проверяете эталонность самого резистора? Может изначально там ошибка кроется.)

0

15

Весь диапазон АЦП получился от 14 до 1023. Схема есть, но только силовая часть. Для наглядности скину фото:
http://s8.uploads.ru/t/8tWOL.jpg
По поводу эталонности резисторов с вами полностью согласен - померить не чем, так-что здесь тоже может сидеть косяк.

0

16

возьмите переменный резистор и мультиметр, настройте на них и потом подключайте к вашей схеме

зы: про схему я спрашивал НЕ фото, а схему графическую :D чтобы номиналы делителя увидеть.

0

17

Примерно как-то так:
http://s7.uploads.ru/t/Qrbq8.jpg

0

18

А зачем для измерения сопротивления, вешать столько полевиков, может как раз в этом кроется проблема?

0

19

Это было сделано для реализации режима размагничивания инжекторов ( форсунок ) бензиновых двигателей.
Для создания переменного магнитного поля с плавно уменьшающейся амплитудой, пришлось городить мостовую схему включения.
В реалии после процедуры размагничивания производительность форсунок восстанавливается примерно в 35% случаев ( проверил на практике ).
Если же брать в расчет сопротивление переходов полевиков, то они не значительны - порядка 0.02-0.03 ом. Так-что этим можно пренебречь.

0

20

angald написал(а):

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

А банальный электромагнит использовать и управлять его питанием ШИМ ?

0

21

В режиме " Чистка " реализован метод с перемагничиванием во время процесса. Так что без моста здесь не обойтись.
Да и согласитесь, что подносить к каждой форсунке электромагнит ( а их на стенде до 8 штук ),
потом ждать порядка 2х минут ( время выполнения теста ) - на это уйдет не мало времени, не считая лишних телодвижений.

0

22

angald написал(а):

В режиме " Чистка " реализован метод с перемагничиванием во время процесса. Так что без моста здесь не обойтись.Да и согласитесь, что подносить к каждой форсунке электромагнит ( а их на стенде до 8 штук ), потом ждать порядка 2х минут ( время выполнения теста ) - на это уйдет не мало времени, не считая лишних телодвижений.

Дело, конечно, хозяйское, как говориться... ;)
Но раз уж все на стенде, то что мешает использовать набор из нужного количества электромагнитов ? ;)
Тем более, что размагничивание эффективнее при использовании стороннего источника магнитного поля, нежели собственного.

0

23

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

0

24

angald написал(а):

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

Затраты окупаются результатом. ;)

Примерно 300 рублей за катушку провода 200м - конские деньги ? ;)
Вполне соизмеримо с достойными мофсетами, коих потребуется не один...
Электромагнит выйдет размером со спичечный коробок...
От агрессивных жидкостей защититься тоже не проблема... ;)

Я же не навязываю вам свой вариант, а только предлагаю.
Оно понятно, что вы уже сложили конструктив и менять его нет желания... ;)

0

25

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

0

26

RDW написал(а):

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

В предидущей версии коммутировал через релюху - на самом деле таких проблем не было. Видимо придется обратно прикручивать реле.

Nord написал(а):

Затраты окупаются результатом.

Примерно 300 рублей за катушку провода 200м - конские деньги ?
Вполне соизмеримо с достойными мофсетами, коих потребуется не один...
Электромагнит выйдет размером со спичечный коробок...
От агрессивных жидкостей защититься тоже не проблема...

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

Да нет, я имел ввиду что готовых катух нет, а мотать да еще изолировать от агрессивной среды  будет совсем в лом :D

0

27

angald написал(а):

коммутировал через релюху - на самом деле таких проблем не было

Если ток маленький и смущает габариты с шумом переключения, можно подобрать герконовое реле (только конечно цена у него может не устроить).

0

28

RDW написал(а):

Если ток маленький и смущает габариты с шумом переключения, можно подобрать герконовое реле (только конечно цена у него может не устроить).

Герконовое слабовато будет...
Разве только штуки 3-4 контакта запараллелить...

0

29

angald написал(а):

Да нет, я имел ввиду что готовых катух нет, а мотать да еще изолировать от агрессивной среды  будет совсем в лом

Возьмите готовые катушки от телефонных реле (любых слаботочных с достаточно большим Uр) и закатайте в эпоксидку. ;)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Погрешность результата преобразования ADC.