HRP-N3 - серия источников питания с максимальной пиковой мощностью в 350% от MEAN WELL

Амперметр переменного тока на ATmega8

Страница 1 из 4
Новичок
 
Регистрация: 13.02.2015
Адрес: Тула
Сообщений: 13
Репутация: 10
 
22.08.2015 22:13 #1
Всем доброго времени суток!
Уважаемые форумчане, требуется Ваша помощь! Пытаюсь сделать амперметр переменного тока в корпусе на DIN-рейку (2 места) на ATmega8 и трансформаторе тока ASM-030. Высокая точность не нужна, хотя хотелось бы, чтобы отсчет показаний начинался с 0,5А, правда по даташиту на ТТ равномерная характеристика начинается примерно с 1 Ампера. Для этих целей в схеме стоит ОУ AD8541AS, чтобы усилить напряжение с ТТ, и фиксировать значения менее 1 А (хотя оно будет сильно нелинейное). В Протеусе симуляция идет прекрасно, в изделии - непонятные показания в пределах 40-70 ампер хаотически меняющиеся, причем независимо от тока нагрузки. Опорное напряжение для АЦП - AVCC. Делитель на резисторах на входе, чтобы получить половину AVCC. Бит ADLAR установлен в 1. АЦП измеряет среднее, а не среднеквадратичное напряжение.
Именно с битом ADLAR и опорным напряжением я окончательно запутался, а от них собственно и зависит код программы.
Вот фрагмент кода, написанный в CVAVR для АЦП, частота МК - 4МГц.

#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (1<<ADLAR)) // опорное напр. AVCC и сдвигаем результат преобразования влево

void sampleADC() // работа АЦП
{
static unsigned long int indication; // переменная значения измеренного напряжения
static unsigned int adc_count; // внутренный счётчик количества измерений
static unsigned long int value; // переменная для записи данных АЦП
static unsigned char I; // счетчик обновления индикатора

ADMUX = ADC_VREF_TYPE | (0x02); // вход PINC.2
delay_us(10);

ADCSRA |= (1<<ADSC); // запуск АЦП
while(!(ADCSRA & (1<<ADIF))); // ждём окончания конвертирования
ADCSRA |=(1<<ADIF); // сбрасываем флаг записью 1

adc_count++; // увеличиваем счетчик счётчик количества измерений на 1

value = value + ADCW; // накапливаем и записываем показания в value

if (adc_count==480) // если произведено 480 измерений ( ~100мс )
{


indication = (value/adc_count)%10000; // вычисляем значение тока


Iporog = indication%1000; // записываем в Iporog значение в Амперах

I++; // увеличиваем счетчик обновления индикатора

if (I>=10) // если счетчик досчитал до 10 ( ~1с )
{
if (Iporog>=100) // если показания больше 10 Ампер
{
count3 = indication%1000/100; // 1-й разряд - десятки Ампер
count2 = indication%100/10; // 2-Й разряд - единицы Ампер
count1 = indication%10/1; // 3-й разряд - десятые доли Ампера
}
else
{
count3 = 10; // 1-й разряд - гасим разряд
count2 = indication%100/10; // 2-Й разряд - единицы Ампер
count1 = indication%10/1; // 3-й разряд - десятые доли Ампера
};


I=0; // обнуляем счетчик обновления индикатора
};
};

if (adc_count>480) // если произведено более 480 измерений ( ~100мс )
{
value = 0; // обнуляем переменную максимального значения напряжения
adc_count = 0; // обнуляем счётчик количества измерений
};
}

Инициализация АЦП:
ADMUX=ADC_VREF_TYPE; // опорное напр. AVCC и сдвигаем результат преобразования влево
ADCSRA = (1 << ADPS2)|(1 << ADPS1)|(0 << ADPS0) // предделитель на 64 (частота АЦП 62,500 kHz)
|(1 << ADEN) // разрешение работы АЦП
|(1 << ADFR); // непрерывный режим работы АЦП

while (1)
{
sampleADC(); // работа АЦП
}


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

Вот схема в Протеусе:
Изображения
Тип файла: jpg 11.jpg (624.7 Кб, 0 просмотров)
Последний раз редактировалось EvgenyVK; 24.08.2015 в 14:06.
Оценка
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей.
Специалист
 
Аватар для antonydublin
 
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 868
Репутация: 380
371 0
3 0
 
24.08.2015 13:07 #2
EvgenyVK, Вы зря не выложили весь проект "как есть", а также перенасытили текст комментариями (что в общем-то хорошо).

Забегая вперёд.
Извините, если скажу очевидное. Когда в симуляторе схема работает, а в железе нет, то в первую очередь нужно искать огрехи на плате - непропаянные места или замыкания, обрывы проводников, неправильную установку элементов (перевёрнутые корпуса), нестабильное питание.

Если сомневаетесь в обвязке на ОУ, мультиметру не доверяете, а осциллографа под рукой нет, то порядок действий приблизительно такой: а) разорвите цепь после R20 и на аналоговый вход АЦП подключите просто потенциометр (питание U1_VCC, GND); б) код функции sampleADC() упростите до вывода на индикацию единичного замера ADCW*0.004882. При этом бит ADLAR не нужно выставлять; в) вращая ручку потенциометра убедитесь, что МК умеет измерять постоянное напряжение в диапазоне 0-5 вольт, и индикация вольтметра работает правильно. Затем проверьте, работает ли часть кода с усреднением adc_count++; г) если вольтметр работает, значит проблема во внешнем усилителе и датчике тока. В первую очередь проверьте датчик (с ЛАТРа нагрузите лампочку). Проверять вход/выход усилителя лучше двухлучевым осциллографом (будет видно сигнал с датчика и сдвинутый сигнал после ОУ), но подойдёт и мультиметр. Всё должно работать как положено - скажем, Вы не ошиблись с выбором коэффициента усиления, усилитель не самовозбуждается, смещение по входам равно половине питания.

Относительно устройства функции sampleADC(). Нет необходимости каждый раз писать в ADMUX (Вы используете один канал АЦП) - достаточно единожды выбрать источник опорного (1<<REFS0) и номер канала (1<<MUX1). Это лучше сделать еще при инициализации портов и прочей периферии. Запуск преобразования у Вас выполнен правильно (1<<ADSC). Но тат как Вы вручную управляете АЦП и не используете прерывания, то воспользуйтесь условием окончания преобразования вида: while(ADCSRA & (1<<ADSC)) (см. раздел "ADC Control and Status
Register A" даташит). Так никаких флагов сбрасывать не нужно. Аналогично, при инициализации АЦП нет необходимости выставлять бит ADFR регистра ADCSRA. Вот так:

ADMUX = (1<<MUX1)|(1<<REFS0);
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS1)|(1<<ADPS2); // Init

Да вот, запись вида (0<<BIT) не имеет смысла. К тому же, после старта МК начальные значения регистров ADCSRA, ADMUX - нули. Также стоит избегать объявления статических переменных внутри функций, ведь программа не большая, сделайте их глобальными с явной инициализацией.
Оценка
Новичок
 
Регистрация: 13.02.2015
Адрес: Тула
Сообщений: 13
Репутация: 10
 
24.08.2015 14:16 #3
antonydublin, спасибо за рекомендации, в ближайшее время попробую подать на вход АЦП сигнал с потенциометра, проверить ОУ и ТТ и отпишусь. По поводу записей 0 в биты. Запись (0<<REFS1) | (1<<REFS0) | (1<<ADLAR) мне удобна тем, что я могу оперативно сбросить или установить нужный бит в процессе написания кода. После того как устройство в железе начинает "правильно" работать, я все нулевые биты удаляю из окончательного кода. А вот по-поводу глобальных и статических переменных почему-то все советуют по-разному, но последую Вашему совету и объявлю их как глобальные.
Оценка
Новичок
 
Регистрация: 13.02.2015
Адрес: Тула
Сообщений: 13
Репутация: 10
 
24.08.2015 20:15 #4
Проверил работу АЦП - отключил R20 от входа МК, вместо него подключил движок потенциометра на 100к, крайние выводы соответственно на +5 и общий. Бит ADLAR сбросил. Результат - при вращении потенциометра на индикаторе меняются значения от 0,0 до 99,9 (и чуть дальше, опять начиная от 0,0 - то есть значения по индикатору превышают 100 - потребуется корректировка программы - это будет проще, чем подбирать сопротивления делителя R12 и R13). Далее отключил потенциометр, восстановил связь с R20, закоротил С4, отключил трансформатор тока. Показания индикатора 51,1. Затем подключил движок потенциометра к выводу 2 операционника, а крайние выводы опять же соответственно на +5 и общий. Результат - показания индикатора меняются от 0 до 99. Осталось заменить ТТ, но увы сейчас другого у меня нет. Кстати, сопротивление ТТ постоянному току близко к нулю - мультиметр точнее не может измерить. Вот у меня вопрос - какое сопротивление у него должно быть, в Инете я не нашел такой информации. Может проблема в ТТ?
Оценка
Гуру
 
Регистрация: 08.05.2006
Адрес: москва
Сообщений: 8,268
Репутация: 2207
2,193 1,125
40 83
 
24.08.2015 22:49 #5
EvgenyVK
Сопротивление обмоток ТТ делается минимально возможнным. Следует заметить, что при ра*боте трансформатора тока вторичная обмотка всегда должна быть замкнута на нагрузку. Реальный ТТ, в диапазоне токов 0-4% от номинально допустимого дают значительную погрешность. Это связано с затратами на намагничивание сердечника (если таковой есть).
Оценка
Новичок
 
Регистрация: 13.02.2015
Адрес: Тула
Сообщений: 13
Репутация: 10
 
24.08.2015 23:05 #6
Гуру
Спасибо, я понял. Про большую погрешность на токах до 1 Ампера у ТТ Talema я в курсе, в даташите график от 1 А начинается. Остается мне только поменять трансформатор тока на новый, и то, если найду у себя в городе. Если и это не поможет, тогда даже и не знаю, в каком направлении дальше копать.
Оценка
Новичок
 
Регистрация: 13.02.2015
Адрес: Тула
Сообщений: 13
Репутация: 10
 
25.08.2015 13:44 #7
Вчера в запарке схему Протеуса не подправил - резисторы делителя R12 и R13 исключены из симуляции (с ними индикатор ерунду показывает). Вот схема без них, именно она и работает в Протеусе.
Изображения
Тип файла: jpg 12.jpg (436.5 Кб, 0 просмотров)
Оценка
Новичок
 
Регистрация: 20.11.2012
Сообщений: 43
Репутация: 25
15 0
0 0
 
25.08.2015 15:48 #8
вот вот. Почему у вас делитель в первом варианте на ИЗМЕРЯЕМЫЙ ВХОД подключен, вместо входа референского напряжения, он вам сигнал и банит, поскольку конденсатором от операционника отвязаны, а так бы операционник его перебивал - там ток больше (вообще выход делителя нужно на ногу AREF подать). Вообще говоря в меге есть очень удобный встроенный источник опорного напряжения 2.56 вольта - как раз половина от питания, да еще и в бинарной кратности - для его выбора нужно старшие 2 бита ADMUX в 1 выставить, а на AREF просто конденсатор буферный повесить. Я бы электролиты С3 С4 тоже выкинул (на трансе итак переменка, а как она будет через вашу RC на ОУ проходить при таких номиналах ... не для 50гц какие-то номиналы ) - пусть мгновенное значение на трансе вытягивает, а резисторы операционника R14 R15 перегнал в диапазон сотни килоом - операционнику хватит - меньше будет погрешность вносить (200 ом нагрузки транса против 3к операционника - это же порядка 8% замеряющий вносит).
Оценка
Гуру
 
Регистрация: 08.05.2006
Адрес: москва
Сообщений: 8,268
Репутация: 2207
2,193 1,125
40 83
 
25.08.2015 17:10 #9
EvgenyVK
Вы не рассматривали вариант использовать измерительные датчики тока на эффекте Холла? Выпускаются и доступны как контактные (например)http://www.prosoft.ru/products/brands/allegro/367517/
так и безконтактные
http://www.niiem46.ru/current_sensors/
Оценка
Новичок
 
Регистрация: 13.02.2015
Адрес: Тула
Сообщений: 13
Репутация: 10
 
25.08.2015 17:29 #10
dvz
За основу для своей конструкции я брал материал отсюда http://kazus.ru/forums/showthread.php?t=16845&page=2 - 2-я страница, верхнее сообщение. Конденсаторы С3 и С4 - это неполярная SMD керамика. Выбор в качестве опорного AVCC (+5В) обусловлен следующим. ОУ работает от однополярного источника, поэтому делителем R18 и R21 "поднимаем" выход наполовину напряжения питания - это будет условный уровень отсчета при измерении. При установке бита ADLAR в 1, результат преобразования сдвигается влево - первые 8 разрядов в регистр ADCH, оставшиеся 2 - в регистр ADCL. При подаче сигнала с ОУ получается, что отсчет значений будет производится от искусственно созданной "земли" - половина напр. питания. Берем результат преобразования АЦП и вычисляем среднее значение. По крайней мере, я так предполагаю, что должно быть. Протеус это подтверждает, но вот в "железе" - некорректно работает. Кстати, по Вашему совету, попоробую заменить R14 и R15 на более высокоомные.
Оценка
Ответ
Страница 1 из 4
Похожие темы
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Бесплатная доставка по России
Часовой пояс GMT +3, время: 09:27.
Обратная связь РадиоЛоцман Вверх