Перейти к содержанию

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


Рекомендуемые сообщения

Привет всем !  Взываю к коллективному разуму :-) Нужно замерить переменный ток частотой  50Гц, с помощью трансформатора тока , далее ТТ.

Замерять при помощи микроконтроллера. Вопрос больше по построению входной цепи и по общему принципу измерения.  Как лучше , удобнее, правильнее сделать ?  Из требований - точность невысокая , 5-10% вполне устроит, компоненты  неспециализированные, из подножных .  Пока видятся  такие варианты -    ТТ грузить на шунт, выпрямитель на инструментальном ОУ и далее в АЦП МК . Программно вычислить среднеквадратичное, и ввести поправки если потребуется.  Из минусов - дополнительно нужен ОУ  желательно с двуполярным питанием.

Вариант два -  ТТ грузить на резистор, отсекать одну половину синуса, стабилитроном , измерять вторую половину, программно усреднять . Из минусов - резистор нагрузки ТТ греется.

И в обоих случая много ресурсов МК уйдет на измерение, т.к. нужно сделать много выборок за половину периода . Можно , конечно, поставить после выпрямителя RC фильтр, проинтегрировать на нем и делать меньше выборок.

Что ещё можно придумать ?

з/ы специализированные микросхемы для измерения параметров сети не предлагать , я о них знаю, но в данной задаче это излишне.

Изменено пользователем E_C_C
поскриптум
Ссылка на комментарий
Поделиться на другие сайты

1. ТТ без нагрузки не включать!!!!

2. как вариант подвязать один конец датчика к половине питания и считать все програмно, по обеим полуволнам.

Жизнь не белая или чёрная, а в мелкую серенькую полосочку...

Ссылка на комментарий
Поделиться на другие сайты

Зачем делать множество выборок для частоты сети в 50Гц, какой процесс надеемся отследить? И как это стыкуется с 

1 час назад, E_C_C сказал:

точность невысокая , 5-10% вполне устроит

?

 

Изменено пользователем ivani-2a
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, E_C_C сказал:

Из минусов - дополнительно нужен ОУ  желательно с двуполярным питанием.

Можно и с однополярным, с привязкой смещения к ИОН от МК, либо отдельного. Хоть на виртуальной средней точки, правда её тоже нужно к МК подключить.

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2 часа назад, Piotr__1 сказал:

считать все програмно, по обеим полуволнам.

А смысл ? 

 

45 минут назад, ivani-2a сказал:

Хоть на виртуальной средней точки, правда её тоже нужно к МК подключить.

хоть как но нужен ОУ , это лишний корпус на плате 

 

1 час назад, ivani-2a сказал:

Зачем делать множество выборок для частоты сети в 50Гц

а как иначе измерить среднеквадратичное значение ?  

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Одиночный ОУ в корпусе SOT235 не сложно разместить.

Если частота известна, а она известна  = 50Гц, то достаточно увеличить на порядок частоту выборки для обеспечения требуемой в ТЗ точности. Поэтому, хоть 500Гц, хоть 5кГц делай свою выборку = современные МК легко осилят такую нагрузку, только объём памяти следует подобрать необходимый.

 

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, E_C_C сказал:

Нужно замерить переменный ток частотой  50Гц, с помощью трансформатора тока , далее ТТ.

Замерять при помощи микроконтроллера.

Из требований - точность невысокая , 5-10% вполне устроит

ТТ так ТТ - значит так нужно.

Точность измерения СКЗ 10%? Синус в сети намного красивее, и с помощью пересчётных коэф. можно СКЗ получить из амплитудного значения с точностью лучше 10%.

АЦП МК? А дальше куда? На стрелочный прибор? Или сразу арабских цифр захотелось? Тогда Щ4300 в помощь! Его семисегментный код можно сразу в цифрУ загнать. 

Под столом нет Щ4300? Тогда - в китайпром - там цифровых вольтметров с арабскими цифрами полным-полно.

ПС. Понятно, что хочется измерить. Но зачем? Куда результат измерений деваться/направляться будет?

Ссылка на комментарий
Поделиться на другие сайты

14 часов назад, Гость ]-: сказал:

Куда результат измерений деваться/направляться будет?

Это принципиально важно ? вопрос был не о том как отправить и чем индицировать.

Куда захочу туда и напрвлю. Захочу по UART , а захочу так и по I2C или по беспроводному каналу.

А может и ещё чего странного захочу.

Ссылка на комментарий
Поделиться на другие сайты

19.08.2020 в 05:29, E_C_C сказал:

А может и ещё чего странного захочу.

Уже захотели. Странное нежелание "лишнего" корпуса на плате. Можно поставить одиночный ОУ либо в SOT23-5, либо в MSOP-8. Впрочем, SOIC-8 тоже не велик. Скажем, MCP6023 как раз заточен для такого рода задач и имеет внутренний референс на половину питания.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, E_C_C сказал:

его у меня нет

Это плохой, даже ОТВРАТИТЕЛЬНЫЙ подход.

Для того, чтобы засунуть на вход АЦП в МК с опорой в 5, а чаще 3,3 вольта сигнал и не создавать кучу питающих напряжений с целью преодолеть большие падения напряжения по выходу ОУ, следует использовать Reil2Reil ОУ с питанием равным опорному АЦП.

Купить нынче любой ОУ не составляет проблем, а ОУ Микрочипа к тому же очень дешевы. 

 

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Опорник на 2,5 вольта. Один вывод тт на выход опорника, второй на вход АЦП. Я использую тт Tahoma. Алгоритм. Сначала меряем напряжение без тока. Это ноль. Запоминаем. По таймеру запускаем АЦП. Главное, что скорости АЦП и мк хватило. Я использую AVR. Измеренный результат суммируем, потом среднеквадратичное значение.

Ссылка на комментарий
Поделиться на другие сайты

18.08.2020 в 11:10, E_C_C сказал:

Что ещё можно придумать ?

берем народный LN358-ой запитываем от 7..12в  , ТТ (для примера 50/5) грузим на шунт 50мОм, при амплитуде тока на шунте  5А, на шунте получаем амплитуду 0,25в.
на LM358 собираем дифф.усилитель с К=10 среднюю точку привязываем на Vref/2 АЦП =2,5в , на выходе получаем амплитуду 2,5в относительно Vref/2 АЦП.
Дальше три варианта:
1. данные АЦП определяем как  знаковые (signed int) делаем 100...200 выборок на период, выборки возводим в квадраты, суммируем и делим на кол-во выборок, извлекаем корень получаем среднеквадратичное (эффективное).

2. объединяем вход АЦП и компаратора МК . При превышении входного сигнала выше  Vref/2 по прерыванию от компаратора запускаем таймер на 2,5мс , по отработке таймера запускаем АЦП , полученные значения усредняем , вычитаем Vref/2 =  среднеквадратичное (эффективное).

3. внешний компаратор вешаем на прерывание по INT0 ,  по прерыванию запускаем таймер , далее читай вар.2

5040582_-.png.c8d56675da5a6ce827a6c4dc60264a05.png

ЗЫ. варианты 2 и 3 только для синусоидальной формы тока !!!

Ссылка на комментарий
Поделиться на другие сайты

Слишком сложно и громоздко. ТТ Talema, размах хватит для АЦП, в крайнем случае rail-to-rail ОУ. Если среднеквадратичное, контроль перехода через нуль не нужен. Главное, настроить таймер так, чтобы он пинал АЦП с частотой кратной 50 Гц. Я открыл проект, у меня стоит значение 400 замеров. То есть, 8 периодов.

Схему позже могу выложить, так получилось, что собирал макет, окончательную схему не сохранил.

Скрытый текст

//========================================================================
#ifndef METER_H
#define METER_H

#include "meter.h"

#include "main_def_func.h"
//========================================================================

//========================================================================
#define METER_TCNT         TCNT0
#define METER_TIMSK        TIMSK
#define METER_OCIE         OCIE0
#define METER_OCR          OCR0
#define METER_TCCR         TCCR0
#define METER_CS0          CS00
#define METER_CS1          CS01
#define METER_CS2          CS02

#define METER_OCR_VAL      25
//========================================================================

//========================================================================
#define V_REF   5.00
#define ADC_RES 1023.0
#define K_1     1.089
#define K_2     1.061
#define K_3     1.033
//========================================================================

//========================================================================
#define SAMPLES 400
//========================================================================

//========================================================================
enum
{
   PHASE_A,   //фаза A
   PHASE_B,   //фаза B
   PHASE_C,   //фаза C
   PHASE_Usm,
};
//========================================================================

//========================================================================
void meter_timer_init (void);
void meter_timer_off (void);

void meter_init (void);
void meter_off (void);

u16 read_adc (u08 channel);

void set_proc_meter_on (void);
void set_proc_meter_off (void);
void proc_meter (void);

u32 calc_adc_result (u32 sqr_summ);

bool get_measure_complete (void);
//========================================================================

#endif

 

Скрытый текст

//========================================================================
#include "meter.h"
//========================================================================

//========================================================================
bool adc_complete;

static u08 phase;
static u16 sample;

static u32 phase_a_summ_sqr;
static u32 phase_b_summ_sqr;
static u32 phase_c_summ_sqr;

static bool measure_complete;
//========================================================================

//========================================================================
#pragma vector = TIMER0_COMP_vect
__interrupt void meter_timer_comp (void)
{
   u16 adc = 0;
   u16 temp = 0;

   u32 a = 0;

   METER_OCR += METER_OCR_VAL;

   adc = read_adc (PHASE_Usm);

   temp = adc;

   adc = read_adc (phase);

   if (adc >= temp)
      adc -= temp;
   else
      adc = (temp - adc);

   a = (long) (adc * adc);

   switch (phase)
   {
      case PHASE_A:
         phase_a_summ_sqr += a;
         phase = PHASE_B;
         break;

      case PHASE_B:
         phase_b_summ_sqr += a;
         phase = PHASE_C;
         break;

      case PHASE_C:
         phase_c_summ_sqr += a;
         phase = PHASE_A;

         if (++sample > SAMPLES)
         {
            meter_off ();

            measure_complete = true;
         }
         break;
   }
}
//========================================================================

//========================================================================
#pragma inline = forced
void meter_timer_init (void)
{
   METER_TCNT = 0;
   METER_OCR = METER_OCR_VAL;
   set_bit (METER_TIMSK, METER_OCIE);
   set_bit (SFIOR, PSR10);
   METER_TCCR |= ((1<<METER_CS1) | (1<<METER_CS0));
}
//------------------------------------------------------------------------
#pragma inline = forced
void meter_timer_off (void)
{
   METER_TCCR = 0;
   clr_bit (METER_TIMSK, METER_OCIE);
   METER_TCNT = 0;
   METER_OCR = 0;
}
//========================================================================

//========================================================================
//#pragma inline = forced
u16 read_adc (u08 channel)
{
   ADMUX = ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | channel);

   set_bit (ADCSRA, ADSC);

   while (1)
   {
      __enable_interrupt ();

      sleep_mode_enable ();

      if (adc_complete)
      {
         adc_complete = false;
         break;
      }
   }

   return ADC;
}
//========================================================================

//========================================================================
#pragma vector = ADC_vect
__interrupt void adc_interrupt_handler (void)
{
   adc_complete = true;
}
//========================================================================

//========================================================================
void meter_init (void)
{
   phase = PHASE_A;

   phase_a_summ_sqr = 0;
   phase_b_summ_sqr = 0;
   phase_c_summ_sqr = 0;

   sample = 0;

   measure_complete = false;

   meter_timer_init ();
}
//------------------------------------------------------------------------
#pragma inline = forced
void meter_off (void)
{
//   ADCSRA = 0;
//   ADMUX = 0;

   meter_timer_off ();
}
//========================================================================

//========================================================================
static u08 _proc_meter;

void set_proc_meter_on (void)
{
   ACSR = (1<<ACD);

   ADCSRA = ((1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (1<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0));

   _proc_meter = 1;
}
//------------------------------------------------------------------------
void set_proc_meter_off (void)
{
   meter_off ();

   _proc_meter = 0;
}
//------------------------------------------------------------------------
void proc_meter (void)
{
   switch (_proc_meter)
   {
      case 0:
         break;

      case 1:
         meter_init ();
         _proc_meter = 2;
         break;

      case 2:
         if (get_measure_complete ())
         {
            phase = PHASE_A;
            _proc_meter = 3;
         }
         break;

      case 3:
         switch (phase)
         {
            case PHASE_A:
               set_i_ph_a (calc_adc_result (phase_a_summ_sqr));
               phase = PHASE_B;
               break;

            case PHASE_B:
               set_i_ph_b (calc_adc_result (phase_b_summ_sqr));
               phase = PHASE_C;
               break;

            case PHASE_C:
               set_i_ph_c (calc_adc_result (phase_c_summ_sqr));
               Set_Event (EV_ID_MEASURE_I_ABC_COMPLETE, USER_EVENT);
               _proc_meter = 1;
               break;
         }
         break;
   }
}
//========================================================================

//========================================================================
u32 calc_adc_result (u32 sqr_summ)
{
   float a;
   u16 temp;

   sqr_summ /= sample;

   a = sqrt (sqr_summ);
   temp = (int) a;

   a = (float) a * (V_REF / ADC_RES);

   if (temp <= 50)
      a = (float) a * K_1;
   if (temp > 50 && temp < 100)
      a = (float) a * K_2;
   if (temp >= 100)
      a = (float) a * K_3;

   a = a * 10000;
   return (long) a;
}
//========================================================================

//========================================================================
bool get_measure_complete (void)
{
   if (measure_complete == true)
      {
         measure_complete = false;
         return true;
      }
   else
      return false;
}
//========================================================================

 

 

AC-1005 Jun-06.pdf

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, demiurg1978 сказал:

Слишком сложно и громоздко.

угу...:king:

3 часа назад, demiurg1978 сказал:

Главное, настроить таймер так, чтобы он пинал АЦП с частотой кратной 50 Гц. Я открыл проект, у меня стоит значение 400 замеров. То есть, 8 периодов.

классный код :i-m_so_happy:как понимаю 400 замеров за 8 периодов это 50 на период или системный клок 20мс/50=400мкс
считаем: вызов прерывания 8мкс, уложить в сон МК 5мкс, пробуждение МК 50мкс, выбрать канал АЦП и провести измерение 50мкс ,
возвести в квадрат 300..410мкс (в среднем 350мкс) ,

387795542_.png.cfde6fcb92a5223f661661557f8a985c.png

плюс время на проверку условий 10..20мкс , итого в среднем 510 мкс (в пике 570мкс) , вопрос как это работает...

Ссылка на комментарий
Поделиться на другие сайты

Измерение идёт пакетно. 400 раз отмерили, отключаем таймер и АЦП, вычислили квадратный корень, перевели в значение. И по новой. Этот подход хорош тем, что нет привязки к переходу через нуль. Пакет по времени равен 8 периодам.

В качестве примера использовался проект Ридико Леонида Ивановича.

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

18.08.2020 в 11:10, E_C_C сказал:

Как лучше , удобнее, правильнее сделать ?

Взять спец микруху, типа ADE7858. Она все сама измерит. Обвязка простейшая. Знай себе, забирай данные по SPI или I2C. На работе такими пользуюсь, измеряют прям очень хорошо и напряжение и ток. Эта микруха трехфазная. Если не изменяет память, то есть аналогичные однофазные. 

Если не охота ставить отдельную микруху, то взять простецкий STM32, через DMA сливать данные из АЦП, а дальше уже математика. Причем можно сразу взять МК с диф. входом на АЦП. Причем если есть доступ к напряжению, которое проходит через провод, продетый через датчик, то можно работу АЦП привязать к форме напряжения и в буфер будет ложиться четко полупериод.

Ссылка на комментарий
Поделиться на другие сайты

Как на работе буду, кину код. Все довольно просто. Несколько команд на запуск, в стиле включись, включи АЦП и т.п. Самый кайф в том, что у нее есть функция "посадить входы на землю" Т.е. можно откалибровать ноль даже когда на схему подано измеряемое напряжение. Единственно, у нее несколько земель, придется поморочить голову с трассировкой платы.

Ссылка на комментарий
Поделиться на другие сайты

22 часа назад, demiurg1978 сказал:

ТТ Talema

как и 

13 часов назад, BARS_ сказал:

ADE7858

штуки безусловно хорошие, но чет дорогие ... наверное потому что хорошие...

23.08.2020 в 05:20, IMXO сказал:

берем народный LN358-ой

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

23.08.2020 в 05:20, IMXO сказал:

варианты 2 и 3 только для синусоидальной формы тока !!

Угу, поэтому вариант 1, ибо будет тиристорный регулятор.

Изменено пользователем E_C_C
Ссылка на комментарий
Поделиться на другие сайты

Talema Ac1005 в Новосибирске 316 рублей. Миниатюрный. Нагрузочный резистор подберёте по таблице.

Я видел как-то на одном станке такую схему. Китайские (ептыть, забыл про них, они ещё дешевле) тт нагрузочный резистор, диодный мост, сглаживающий конденсатор.

Ссылка на комментарий
Поделиться на другие сайты

а если не нагружать микроконтроллер лишней математикой , уж коли ставить ОУ , так на нем и выпрямитель сделать , можно снизить количество выборок АЦП.

1.png

только придется двухполярное питание заводить...

Ссылка на комментарий
Поделиться на другие сайты

Эээ, как бы микроконтроллеру абсолютно без разницы, что выполнять. Хоть математику, хоть холостые циклы. Главное, успевать вычислять, и здесь скорее программист напрягается. :)

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...