Измерение тока с помощью AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Сообщение wellcom »

а если использовать диф вход АЦП, то как его лучше подключить к имеющейся схеме/выходу ОУ?....плз рис
:solder: 32-х ядерный процессор из П213В
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

а зачем вам выход ОУ подключать на дифференциальный вход?
если для повышения точности, то имейте в виду, что при использовании АЦП в режиме диффвходов ожидаемая разрядность еще меньше!
Ставим плюсы: )
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Сообщение wellcom »

и все же, как лучше поступить......
есть резистор на 0,001 Ом, ОУ с 20 кратным усилением, атмега 32. Все уже запаяно в плату. Мерять ток нужно до 40 А и напряжение до 6 В, при Vref внутр 2,56В используя 10 битное разрешение используя однопорярные входы. Спасибо.
:solder: 32-х ядерный процессор из П213В
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

самое главное не написали: с какой точностью нужно измерять?
Ставим плюсы: )
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Сообщение wellcom »

напряжение как можно точнее а ток хотя бы +/-0,2-0,3А
:solder: 32-х ядерный процессор из П213В
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Давайте посчитаем:
(ИДЕАЛЬНЫЕ УСЛОВИЯ)
примем разрядность АЦП = 10; (2^10 = 1024)
тогда шаг дискретизации = 2,56В/1024 = 0,0025 В
учитывая ОУ, шаг дискретизации = 0,0025В/20 = 125мкВ (на стороне шунта)
шаг дискретизации измеряемого тока = 125мкВ/0,001 Ом = 0,125 А
Это означает, что мы можем получить показания с погрешностью +/- 0,125А
это САМЫЙ ИДЕАЛЬНЫЙ СЛУЧАЙ.
Теперь реальность:
1) Шунт + провода до шунта явно больше 0,001 Ом
Даже, если верить Ваши измерениям (2,1 А соответствовало падению напряжения 2,4 мВ), то сопротивление шунта равно = 2,4/2,1 = 1,143 мОм = 0,001143 Ом , а это уже 14% (!!!) вдумайтесь

2)АЦП меги без программных ухищрений даст от силы 9 разрядов при идеальном электромагнитном фоне + отсутствии помех по питанию.
В реальных условиях это уже 8 разрядов. отсюда шаг дискретизации увеличивается в 4 раза.

Исходя из Вашего описания схемы можно предположить, что лучшем случае точность ЕДИНИЧНОГО измерения тока будет не выше, чем +/-0,5А
wellcom писал(а):При токе в 2,1 А (меряю тестером), на резисторе падение 2,4мВ и соответственно после ОУ на входе АЦП = 48мВ.
Вы это измерили мультиметром или предположили исходя из коэффициента усиления?
wellcom писал(а):При чтении общего регистра ADCW (содержит ADCH и ADCL бит ADLAR =0) получаю непонятный мне результат, а именно 0х04h
Вот это крайне не похоже на то, что должно получаться.

ищите ошибку либо в программе (считывание данных) либо в цепях измерений (вход ОУ, вход АЦП)
Ставим плюсы: )
Реклама
Встал на лапы
Сообщения: 120
Зарегистрирован: Вт дек 12, 2006 07:46:53
Откуда: Пермь

Сообщение _Alex »

А, какой ОУ используется для измерения тока?.
Двухполярное питании ИУ или ОУ? иначе как на выходе, получить 0 В. Так, же важен параметр смещения напряжения, у некоторых ОУ может быть и 4мв, и тогда 4мв Х 20 = 80мВ смещения, причем может гулять, а нужно мерять микровольты.
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Сообщение eufs »

YS писал(а):
eufs писал(а):ДХ взял от ДПР привода диска CDROM
Скорее всего, он был цифровой. А то и вообще не простой ДХ, а совмещенный с переключателем обмоток.
Такое впечатление, что вы сидиромы никогда не разбирали... Сам элемент холла не может быть цифровым. В старых приводах использовались BLDC двигатели с ДПР на элементах Холла в SOT23-4 (SOT143-4) прямо в двигателе. Их токовые диагонали соеденены последовательно, а выходные - в микросхему драйвера двигателя шпинделя. Подобные схемы были в приводах барабанов видеоголовок и ведущих валов в видиках.
C0FFEE=‭12648430‬
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Ваша правда, я не специалист в схемотехнике CD-ROM-ов. Просто я работал с отдельными датчиками Холла - цифровыми (переключатели, по факту - замена геркона) и аналоговыми (пропорциональный выход), вот и подумал...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Сообщение wellcom »

ibiza11 писал(а):
wellcom писал(а):При токе в 2,1 А (меряю тестером), на резисторе падение 2,4мВ и соответственно после ОУ на входе АЦП = 48мВ.
Вы это измерили мультиметром или предположили исходя из коэффициента усиления?
wellcom писал(а): При чтении общего регистра ADCW (содержит ADCH и ADCL бит ADLAR =0) получаю непонятный мне результат, а именно 0х04h
Вот это крайне не похоже на то, что должно получаться.
ищите ошибку либо в программе (считывание данных) либо в цепях измерений (вход ОУ, вход АЦП)
на входе АЦП Меряю мультиметром (достаточно точным), операционник прецизионный с однополярным питанием AD8211.
...по программе считывания данных, по идее, должно быть все нормально, так как еще одним и тем же куском кода меряю напряжение на другом канале АЦП. Вот кусок процедуры чтения
Спойлер

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

#define ADPS 0x07
#define	MAX	100
#define true 1
#define false 0
....
	ADMUX=(0x03<<6)|(ucnChannel&0x07); //подключаем к ADC нужный канал и устанавливаем источник опорного напряжения (внутр 2,56В)
	ADCSRA=0x40|0x02; //первый раз стартуем преобразование на 64 (необходимо для инициализации)
        ADCSRA= (1<<ADEN)|(1<<ADSC)|ADPS; //ON ADC|| ON однокр преобраз || частота ацп=clk/128
	ucCounter=0;
	while((ucCounter<MAX)&&(!bReady))
	{
            Ready=((ADCSRA&0x40)==0x0); //(ADSC==0 после окончания преобразования в bReady будет записана истина)
            ucCounter++;
            delay_us(10);
	};
        ADCSRA|= 0x10; //сбросили флаг прерывания ADIF
	if(Ready) //если преобразование закончено
	{
            bResult=true; //указать что результат имеется
	}
         sprintf(Res,"\r\nADCW = %u",ADCW);UARSendStr(Res); //смотрим результат
         delay_ms(100);
	(*puiValue)=ADCW
Измерения делаю по 8 раз на каждом канале, и соответственно беру среднее значение.
Вот результаты измерений:
Спойлер=================Ток без подключеной нагрузки (8 измерений суммирую и делю на 8 для получения среднего значения)
ADCW = 1
ADCW = 0
ADCW = 0
ADCW = 0
ADCW = 0
ADCW = 0
ADCW = 0
ADCW = 0
ADC Summ=:0x1h = 1
ADC Summ/8=:0
ADC Srednee=:0x0h = 0
ADC=0.000000 V
I=0.000000 A

==================Измерение Напряжения (результат с учетом делителя)
ADCW = 770
ADCW = 770
ADCW = 771
ADCW = 771
ADCW = 772
ADCW = 772
ADCW = 771
ADCW = 771
ADC Summ=:0x1818h = 6168
ADC Summ/8=:771
ADC Srednee=:0x303h = 771
U=:5.78 V -------------------------(измеренное мультиметром =5,77В)

==================Ток С подключеной нагрузкой (измерял мультиметром на входе АЦП = 46,6мВ и соответственно ток тоже мультеметром = 2,05А)
ADCW = 4
ADCW = 2
ADCW = 3
ADCW = 4
ADCW = 5
ADCW = 3
ADCW = 3
ADCW = 2
ADC Summ=:0x1Ah = 26
ADC Summ/8=:3 ------------------здесь результат должен быть в раене 18-19 что соответствовало бы 46-47 мВ
ADC Srednee=:0x3h = 3
ADC=0.007500 V
I=0.375000 A
Ну никак не могу понять почему при измерении напряжения все верно, а при измерении тока туфта....может канал АЦП бракованный? или есть какие то ньюансы чтения ADCW? или лучше самому читать регистры по отдельности ADCL, ADCH?
И самое интерестное что в протеусе код измерения как тока так и напряжения работает правильно -
СпойлерНа вход АЦП подаю 0,02В
ADCW = 10
ADCW = 10
ADCW = 10
ADCW = 10
ADCW = 10
ADCW = 10
ADCW = 10
ADCW = 10
ADC Summ=:0x50h = 80
ADC Summ/8=:10
ADC Srednee=:0xAh = 10
ADC=0.025000 V
I=1.250000 A
Последний раз редактировалось wellcom Пн окт 08, 2012 13:16:36, всего редактировалось 1 раз.
:solder: 32-х ядерный процессор из П213В
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

wellcom писал(а):Измерение Напряжения (результат с учетом делителя)
как этот делитель учитывается в программе измерения напряжения???

я тут посчитал: при напряжении на входе делителя 5,77В, у Вас получается результат 771.
При опорном напряжении 2,56В и разрядности АЦП = 10 получается, что на самом деле на входе АЦП напряжение = 771/1024*2,56 = 1,9275 В
а это означает, что у Вас резистивный делитель делит напряжение на число = 5,77/1,9275 = 2,99
Если предположить, что в программе расчета тока тоже учитывается этот делитель, то получаются верные результаты.
И почему мы узнаем о делителе только сейчас? Программу измерения напряжения Вы сами писали?
Ставим плюсы: )
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

А я опять же нигде не увидел подстройку из-за разброса опорного напряжения, которое (напомню) может быть от 2.3 до 2.7 В. Насколько я понял, там только шунт и прецизионный 20-кратый усилитель.
Конечно, это ошибка не в разы, но всё же...
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Сообщение wellcom »

ibiza11 писал(а):
wellcom писал(а):Измерение Напряжения (результат с учетом делителя)
Спойлеркак этот делитель учитывается в программе измерения напряжения???
я тут посчитал: при напряжении на входе делителя 5,77В, у Вас получается результат 771.
При опорном напряжении 2,56В и разрядности АЦП = 10 получается, что на самом деле на входе АЦП напряжение = 771/1024*2,56 = 1,9275 В
а это означает, что у Вас резистивный делитель делит напряжение на число = 5,77/1,9275 = 2,99
Если предположить, что в программе расчета тока тоже учитывается этот делитель, то получаются верные результаты.
И почему мы узнаем о делителе только сейчас? Программу измерения напряжения Вы сами писали?
ibiza11 Вашы расчеты верны, делитель на 3 стоит, но только по входу измерения напряжения. По входу измерения тока никаких делителей нету.
Вот как меряю:
Спойлер

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

    if(ADC_GetSignal_Measure(4,&ui_tmp)) // 4 канал ацп, ток потребления
    { 
      temp1=(0.0025*ui_tmp)/20; //делим на 20 т.к. операционник усиливает ровно в 20 раз
      sprintf(Res,"\r\nADC Srednee=:0x%Xh = %u",ui_tmp,ui_tmp);UARSendStr(Res);  //вывод для отладки 
      sprintf(Res,"\r\nADC=%f V\r\n",(ui_tmp*0.0025));UARSendStr(Res);
      temp2 = temp1/0.001;
      sprintf(Res,"I=%f A\r\n",temp2);UARSendStr(Res);
      fl_I = temp2 ;            
    }
.................
    if(ADC_GetSignal_Measure(3,&ui_tmp))// 3 канал ацп напряжение питание
    { 
      temp1=(0.0025*ui_tmp)*DIVIDER_RATIO_V; //DIVIDER_RATIO_V=коеф. деления делителя =3
      sprintf(Res,"\r\nADC Srednee=:0x%Xh = %u",ui_tmp,ui_tmp);UARSendStr(Res);
      fl_U=temp1;  
Gudd-Head писал(а):А я опять же нигде не увидел подстройку из-за разброса опорного напряжения, которое (напомню) может быть от 2.3 до 2.7 В. Насколько я понял, там только шунт и прецизионный 20-кратый усилитель.
Конечно, это ошибка не в разы, но всё же...
Подстройки никакой нету, пока и не требуется, измерял мультиметром = 2,53 В. По схеме - да, только шунт и прецизионник *20.
:solder: 32-х ядерный процессор из П213В
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

а зачем вы делите результат на 400 (умножаете на 0.0025)? а зачем (в конце) умножаете на 1000? вообще не пойму логики...
какого типа переменные используются в программе? float?
Ставим плюсы: )
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Сообщение wellcom »

ibiza11 писал(а):а зачем вы делите результат на 400 (умножаете на 0.0025)? а зачем (в конце) умножаете на 1000? вообще не пойму логики...
какого типа переменные используются в программе? float?
именно float. Мое понимание такое: в ADCW сохраняется 10 битный результат преобразования АЦП., т.е. количество квантов. 1 квант = 2,5мВ, отсюда что бы узнать напряжение на входе, я 0,0025В*ADCW (число квантов) и должен получить напряжение на входе АЦП. Так как оно усилено в 20 раз, я его и делю на 20, что бы узнать падение на резисторе и расчитать ток. Возможно все это можно как то по другому записать.....я просто в математике не силен.
:solder: 32-х ядерный процессор из П213В
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Если у вас резистор 0.001 Ом, то один квант после 20-ти кратного усилителя равен 0,125 А в вашей схеме.
Опять же, при условии что опорное равно 2,56 В. Буду занудой, но один шаг квантования АЦП может быть от 2,2 до 2,6 мВ из-за разброса опорного.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Сообщение wellcom »

Gudd-Head писал(а):Если у вас резистор 0.001 Ом, то один квант после 20-ти кратного усилителя равен 0,125 А в вашей схеме.
Опять же, при условии что опорное равно 2,56 В. Буду занудой, но один шаг квантования АЦП может быть от 2,2 до 2,6 мВ из-за разброса опорного.
так и есть 0,125А, пробл в том что на входе 48мВ, а результат читаемый с ADCW = 3-4 (см. пост выше) а должно быть (48/2,5 = 19) в раене 18-19
если бы у меня опора была не 2,56, то и измерение напряжения было бы не верным.
:solder: 32-х ядерный процессор из П213В
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

wellcom писал(а):результат читаемый с ADCW = 3-4, а должно быть (48/2,5 = 19) в районе 18-19
Значит, шумы.
1. Вы переключаете каналы АЦП с "напряжения" на "ток". Так? Сколько времени проходит между переключением и измерением?
2. Вы используете “ADC Noise Canceler”?
3. Ну и никто не знает как это всё реализовано у вас на плате — аналоговое/цифровое питание, земля, фильтруется ли дополнительно опорное напряжение...
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Сообщение wellcom »

да, похоже что меряет шумы, но должен же мерять 48мВ....
1. вначале ток, потом не менее чем через 100мс напряжение
2. да
3. питание фильтруется (коденсатор), про остальное пока ничего не могу сказать....
:solder: 32-х ядерный процессор из П213В
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

по опыту могу сказать что первые 100 отсчетов АЦП меги 8-й - полная ересть нелинейность и туфта! даже если это просто 1 килоомный переменник линейный и кондер на 50 микрофарад!!! потому многие и советуют сделать "поднятие" нуля чтоб не мерять околонулевые значения!!!вот только поднятие это тож должно быть очень стабильным и всё бы ничего если б просто делителем с опоры брать но у меги8-й встроенная опора очень слабая и никаких делителей не допускает....нужно вводить внешнюю опору!
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Ответить

Вернуться в «AVR»