Пользовательский блок "измерение переменного тока"

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Аватара пользователя
Dev1
Майор
Сообщения: 1026
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 59
Откуда: Гондурас

Пользовательский блок "измерение переменного тока"

#41

Сообщение Dev1 » 01.02.2017{, 10:53}

Только заметил, что вы давно уже это решение используете. В программе один компаратор поставил и увидел в коде. И че я раньше парился с этими условиями. И посмотрите, везде в документации ни слова про такую возможность.
Win10-64 FLProg v7.5.2 Portable :fie:

lopezmil
Рядовой
Сообщения: 26
Зарегистрирован: 19.01.2017{, 00:41}
Репутация: 0

Пользовательский блок "измерение переменного тока"

#42

Сообщение lopezmil » 01.02.2017{, 11:05}

Вывел на монитор порта значение пин 13 и значение wire. Условие не выполняется, т.е. 600>wire. А значит на пин 13 должен быть ноль, а там 1 при любом значении wire. А ещё я заметил, что, если поставить строки вывода на монитор порта вот так:

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

float vpp;
float ncurr;
float rms;
float wire;
int sensorTA12=0; // Analog input pin that sensor is attached to
float nVPP; // Voltage measured across resistor
float nCurrThruResistorPP; // Peak Current Measured Through Resistor
float nCurrThruResistorRMS; // RMS current through Resistor
float nCurrentThruWire; // Actual RMS current in Wire
bool q;
void setup()
{
pinMode(13, OUTPUT);

Serial.begin(9600); 
pinMode(sensorTA12, INPUT);
}
void loop()
{

   nVPP = getVPP();   
  
   nCurrThruResistorPP = (nVPP/200.0) * 1000.0;   
   
   nCurrThruResistorRMS = nCurrThruResistorPP * 0.707;   
   
   nCurrentThruWire = nCurrThruResistorRMS * 1000;
   
   Serial.print("Volts Peak : ");
   Serial.println(nVPP,3);
   vpp = nVPP ;                    // выход vpp
   
   Serial.print("Current Through Resistor (Peak) : ");
   Serial.print(nCurrThruResistorPP,3);
   Serial.println(" mA Peak to Peak");
    ncurr = nCurrThruResistorPP ;                    // выход ncurr
   
   Serial.print("Current Through Resistor (RMS) : ");
   Serial.print(nCurrThruResistorRMS,3);
   Serial.println(" mA RMS");
    rms = nCurrThruResistorRMS ;                    // выход rms
   
   Serial.print("Current Through Wire : ");
   Serial.print(nCurrentThruWire,3);
   Serial.println(" mA RMS");  
   wire= nCurrentThruWire ;                    // выход wire
   Serial.println();   
 }
 
float getVPP()
{
  float result;
  
int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
   uint32_t start_time = millis();
   while((millis()-start_time) < 1000) //sample for 1 Sec
   {
       readValue = analogRead(sensorTA12);
       // see if you have a new maxValue
       if (readValue > maxValue) 
       {
           /*record the maximum sensor value*/
           maxValue = readValue;
       }
   }
   
   // Convert the digital data to a voltage
   result = (maxValue * 5.0)/1024.0;
  
   return result;
digitalWrite(13, (600.00) < (wire));
q=13;
 Serial.print(" q= "); 
Serial.println(q,3);

}
, то значение q на экран не выводится. Всё, что стоит после строки   return result; я так полагаю не выполняется.

Добавлено (01.02.2017, 11:03)
---------------------------------------------
попробовал изменить код 

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

float vpp;
float ncurr;
float rms;
float wire;
int sensorTA12=0; // Analog input pin that sensor is attached to
float nVPP; // Voltage measured across resistor
float nCurrThruResistorPP; // Peak Current Measured Through Resistor
float nCurrThruResistorRMS; // RMS current through Resistor
float nCurrentThruWire; // Actual RMS current in Wire
bool q;
void setup()
{
pinMode(13, OUTPUT);

Serial.begin(9600); 
pinMode(sensorTA12, INPUT);
}
void loop()
{

   nVPP = getVPP();   
  
   nCurrThruResistorPP = (nVPP/200.0) * 1000.0;   
   
   nCurrThruResistorRMS = nCurrThruResistorPP * 0.707;   
   
   nCurrentThruWire = nCurrThruResistorRMS * 1000;
   
   Serial.print("Volts Peak : ");
   Serial.println(nVPP,3);
   vpp = nVPP ;                    // выход vpp
   
   Serial.print("Current Through Resistor (Peak) : ");
   Serial.print(nCurrThruResistorPP,3);
   Serial.println(" mA Peak to Peak");
    ncurr = nCurrThruResistorPP ;                    // выход ncurr
   
   Serial.print("Current Through Resistor (RMS) : ");
   Serial.print(nCurrThruResistorRMS,3);
   Serial.println(" mA RMS");
    rms = nCurrThruResistorRMS ;                    // выход rms
   
   Serial.print("Current Through Wire : ");
   Serial.print(nCurrentThruWire,3);
   Serial.println(" mA RMS");  
   wire= nCurrentThruWire ;                    // выход wire
   Serial.println();   

   digitalWrite(13, (600.00) < (wire));
       q=13;
       Serial.print("q : ");
   Serial.println(q,3);
 }
 
float getVPP()
{
  float result;
  
int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
   uint32_t start_time = millis();
   while((millis()-start_time) < 1000) //sample for 1 Sec
   {
       readValue = analogRead(sensorTA12);
       // see if you have a new maxValue
       if (readValue > maxValue) 
       {
           /*record the maximum sensor value*/
           maxValue = readValue;
       }
       
   }
   
   // Convert the digital data to a voltage
   result = (maxValue * 5.0)/1024.0;
   

  
   return result;

}
теперь значение q выводится на экран, но условие   digitalWrite(13, (600.00) < (wire)); не выполняется. На пин 13 всегда 1. Можете сами проверить у себя, просто загрузив этот скетч и вывести монитор порта. У вас как ра получится, что wire меньше 600, а на пин 13 всё равно будет 1.

Добавлено (01.02.2017, 11:05)
---------------------------------------------
Самое интересное, что первый вариант кода, когда  

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

return result;
digitalWrite(13, (600.00) < (wire));
q=13;
 Serial.print(" q= "); 
Serial.println(q,3)
компилирует сама flprog

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 790
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Пользовательский блок "измерение переменного тока"

#43

Сообщение support » 01.02.2017{, 11:16}

Не хочу разбираться с Вашим кодом. Вот пример проекта (картинка, поскольку у меня сейчас версия в работе и у Вас проект сделанный в ней не откроется)

Изображение

Вот код

bool _gtv1 = 0;
int _stou1;
bool _count1I = 0;
int _count1P = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);

}
void loop()
{

if (1) {
if (! _gen1I) {
_gen1I = 1;
_gen1O = 1;
_gen1P = millis();
}
} else {
_gen1I = 0 ;
_gen1O = 0;
}
if (_gen1I) {
if ( _isTimer ( _gen1P , 250 )) {
_gen1P = millis();
_gen1O = ! _gen1O;
}
}

if (_gen1O)
{
if (! _count1I)
{
_count1P = _count1P + 1;
_count1I = 1;
}
}
else
{
_count1I = 0;
}
if (_gtv1) _count1P = 0;
_gtv1 =  _count1P  >=  50;
digitalWrite(13, (_count1P) > (25));
if (1) {
if (!(( _count1P) == (_stou1))) {
Serial.println(_count1P);
}
} _stou1 = _count1P;

}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime >= startTime) {
return (currentTime >= (startTime + period));
} else {
return (currentTime >= (4294967295 - startTime + period));
}
}

Обратите внимание на выделенную строку.  И всё прекрасно работает. Светодиод загорается и тухнет когда ему положенно
Автор программы FLProg.

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 790
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Пользовательский блок "измерение переменного тока"

#44

Сообщение support » 01.02.2017{, 11:29}

lopezmil писал(а):float getVPP()
{
  float result;
  
int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
   uint32_t start_time = millis();
   while((millis()-start_time) maxValue) 
       {
           /*record the maximum sensor value*/
           maxValue = readValue;
       }
   }
   
   // Convert the digital data to a voltage
   result = (maxValue * 5.0)/1024.0;
  
   return result;
digitalWrite(13, (600.00) < (wire));
q=13;
 Serial.print(" q= "); 
Serial.println(q,3);

}
 Ну вот это точно не FLProg собирало. Я такие переменные не использую, и комменты в коде практически не делаю.
Это наверное какой то пользовательский блок на С, а за их содержание я не отвечаю)))). Все вопросы к автору блока))))).
Автор программы FLProg.

Аватара пользователя
Dev1
Майор
Сообщения: 1026
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 59
Откуда: Гондурас

Пользовательский блок "измерение переменного тока"

#45

Сообщение Dev1 » 01.02.2017{, 11:44}

Что то мне сдается что я много чего пропустил...
далее

Win10-64 FLProg v7.5.2 Portable :fie:

Аватара пользователя
slavas
Лейтенант
Сообщения: 595
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 1
Откуда: Санкт-Петербург

Пользовательский блок "измерение переменного тока"

#46

Сообщение slavas » 01.02.2017{, 11:47}

support, так в том то и косяк что в проекте сидит мой блок и один он работает а lcd или компортом глючит.

lopezmil
Рядовой
Сообщения: 26
Зарегистрирован: 19.01.2017{, 00:41}
Репутация: 0

Пользовательский блок "измерение переменного тока"

#47

Сообщение lopezmil » 01.02.2017{, 11:58}

support, Правильно, блок пользовательский. Сделан он slavas. Блок этот раз в секунду показывает значение переменного тока, измеряемое трансформатором тока. И к работе блока у меня не никаких вопросов. Он работает идеально. У меня есть вопрос к flprog. Выход блока wire показывает реальное значение переменного тока в float. Этот выход я подключаю ко входу  компаратора. На второй его вход я подаю константу, так же в float. На выходе должен получить 0 или 1, в зависимости от результата сравнения. А получаю 1, вне зависимости от результата сравнения. Вот в этом вся проблема. В этой самой еденице.

Добавлено (01.02.2017, 11:52)
---------------------------------------------
И выше я уже указывал в чем причина такой работы, но почему оно так происходит и почему flprog так компилирует, сне непонятно. Так как я не программист.

Добавлено (01.02.2017, 11:58)
---------------------------------------------
Dev1, в 42 посте то, что вы пропустили

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 790
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Пользовательский блок "измерение переменного тока"

#48

Сообщение support » 01.02.2017{, 12:03}

Это конечно не правильно, но язык это позволяет))))))). Происходит автоматическое приведение типов. Всё что больше 0 - становится True, 0 становится  False

P.S. - Это касалось 
bool q;
q=13;
Автор программы FLProg.

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 63
Контактная информация:

Пользовательский блок "измерение переменного тока"

#49

Сообщение Олег » 01.02.2017{, 12:09}

lopezmil писал(а):Правильно, блок пользовательский. Сделан он slavas. Блок этот раз в секунду показывает значение переменного тока, измеряемое трансформатором тока. И к работе блока у меня не никаких вопросов. Он работает идеально.
 Если пользовательский блок не дает нормально работать программе, то он не работает идеально, он не должен мешать работе основной пограммы и других приложений.
 slavas, же пишет что ни LCD ни com port нормально не работают вместе с ним, может все-таки в блоке ошибки поищете?

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 790
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Пользовательский блок "измерение переменного тока"

#50

Сообщение support » 01.02.2017{, 12:11}

lopezmil писал(а):Выход блока wire показывает реальное значение переменного тока в float. Этот выход я подключаю ко входу  компаратора. На второй его вход я подаю константу, так же в float. На выходе должен получить 0 или 1, в зависимости от результата сравнения. А получаю 1, вне зависимости от результата сравнения. Вот в этом вся проблема. В этой самой еденице.
Какое сравнение используете. С флоат есть некоторые сложности. 

Из описания на сайте ардуино


Хранение в памяти чисел с плавающей точкой в двоичной системе обуславливает потерю точности. Так, например,  6.0 / 3.0 не обязательно равен 2.0. Сравнивая два числа с плавающей точкой следует проверять не точное равенство, а разницу между этими числами, меньше ли она некого выбранной малого порога.
Так что сравнивать по равенству или не равенству флоат не стоит. Как вариант - умножать значение на 10, 100, 100 в зависимости от необходимой точности, превращать его в integer и сравнивать с integer. или сравнивать по условию больше или меньше
Автор программы FLProg.

Аватара пользователя
slavas
Лейтенант
Сообщения: 595
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 1
Откуда: Санкт-Петербург

Пользовательский блок "измерение переменного тока"

#51

Сообщение slavas » 01.02.2017{, 16:25}

support

 float getVPP()
{
float result;

int readValue; //value read from the sensor
int maxValue = 0; // store max value here
uint32_t start_time = millis();
while((millis()-start_time) < 1000) //sample for 1 Sec
{
readValue = analogRead(sensorTA12);
// see if you have a new maxValue
if (readValue > maxValue)
{
/*record the maximum sensor value*/
maxValue = readValue;
}
}

// Convert the digital data to a voltage
result = (maxValue * 5.0)/1024.0;

return result;
}

кусок кода из моего блока может конфликтовать с flprog и как исправить?
Последний раз редактировалось slavas 01.02.2017{, 16:26}, всего редактировалось 1 раз.

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 790
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Пользовательский блок "измерение переменного тока"

#52

Сообщение support » 01.02.2017{, 20:46}

slavas писал(а):кусок кода из моего блока может конфликтовать с flprog и как исправить?
Не должен конфликтовать, ничего такого в нём нет. Надо внимательнее посмотреть блок, но пока некогда
Автор программы FLProg.

bars
Рядовой
Сообщения: 26
Зарегистрирован: 27.11.2015{, 05:59}
Репутация: 0

Пользовательский блок "измерение переменного тока"

#53

Сообщение bars » 07.02.2017{, 12:34}

Здравствуйте! Я тоже сейчас делаю проект на ТА-12. Только мне необходимо измеренные данные выводить на 4 сегментный LED индикатор. Данные измеряются но очень быстро, поэтому индикатор не выводит в статичном виде цифры, а очень быстро их меняет. Создаются эфект мерцания и конкретные цифры уже не разглядеть. Как сделать, что бы изменять период опроса датчика, или что бы изменять период вывода на индикатор без эфекта мерцания?

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 63
Контактная информация:

Пользовательский блок "измерение переменного тока"

#54

Сообщение Олег » 07.02.2017{, 14:02}

Можно данные на индикатор считывать из переменной, а запись новых значений в переменную делать раз в секунду, например. Можно поставить какой-нибудь цифровой фильтр.

bars
Рядовой
Сообщения: 26
Зарегистрирован: 27.11.2015{, 05:59}
Репутация: 0

Пользовательский блок "измерение переменного тока"

#55

Сообщение bars » 08.02.2017{, 06:56}

Спасибо за совет! Данные в индикатор записывались из переменной, вот только датчик слишком быстро записывал измеренное значение в переменную, а я не знал как сделать прерывание на опрос датчика или записывать в переменную усреднённое значение нескольких измерений. Теперь буду пробовать, думаю поможет.

Добавлено (08.02.2017, 06:56)
---------------------------------------------
Подскажите, а нет ли у кого блоков цифровых фильтров на FBD, а то эти блоки в CODE а я в нём не силён. Мне бы для понимания, что зачем делается. Фильтры работают, результат получен, правда не совсем так, как хотелось бы, но будем думать дальше главное что сдвинулся с мёртвой точки. Ещё вопрос: в настройках переменной есть возможность добавить вход разрешения записи в переменную, а что происходит с переменной когда на входе разрешения записи висит 0. Переменная сохраняет предыдущее значение или падает в ноль?

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 63
Контактная информация:

Пользовательский блок "измерение переменного тока"

#56

Сообщение Олег » 08.02.2017{, 10:22}

В этом и назначение переменных - хранить информацию. При 0 на входе разрешения записи запись не происходет, на выходе последнее записанное значение. Если на EN подать сигнал с генератора, то можете записывать туда значения через любой промежуток времени. 
bars писал(а):Подскажите, а нет ли у кого блоков цифровых фильтров на FBD, а то эти блоки в CODE а я в нём не силён.
Я думаю в FBD эти фильтры будут весить гораздо больше. Некоторые вещи в FBD вообще сложно сделать, так что мое мнение если есть блок на CODE, то лучше использовать его. Если есть вопросы по блоку, задать их тому кто его делал и все прояснится.

lopezmil
Рядовой
Сообщения: 26
Зарегистрирован: 19.01.2017{, 00:41}
Репутация: 0

Пользовательский блок "измерение переменного тока"

#57

Сообщение lopezmil » 09.02.2017{, 22:42}

Задал данный впрос на форумах по ардуино и вот что мне один товарищ ответил : 
1. добавляешь аналоговый вход.
2. добавляешь две переменные, одну float, другую int. Float - для результата, int - для промежуточного максимума.
3. millis() в этой поделке недоступна. Как будем поступать? Нет ничего проще! Делаешь генератор на период (тут важно не зырываться, потому, что эта херня ничего не проверяет на реальность) допустим 1 мс или 500 мкс, не меньше. И счетчик.
4. делаешь 1000 измерений, для генератора 1 мс или 2000 для 500 мкс. Тут есть хитрость. Импульс генератора  - он как синхроимпульс для фиксации измерения. Сумеешь такое сам нарисовать?
5. В каждом измерении сравниваешь вход и переменную для максимума и записываешь в нее MAX. Тут понятно?
6. арифметикой вычисляешь из полученного "макса" значение в вольтах и записываешь его в результирующую переменную, или просто на выход отправляешь, смотря, что тебе нужно.


Добавлено (09.02.2017, 22:41)
---------------------------------------------
А вот что я ему ответил :
Что значит генератор на период 1мс? И какой выход должен быть у этого генератора, в каких еденицах? 4 пункт тоже боюсь неправильно понял. Как я понимаю в момент импульса генератора должно фиксироватся текущее значение измерения с аналогового входа?  Чем оно должно фиксироватся и куда записыватся? И чем можно сравнить максимальное значение измерения и текущее, чтобы на выходе сравнения получилась int переменная?

Добавлено (09.02.2017, 22:42)
---------------------------------------------
Но ответы на свои вопросы я так и не получил. Может здесь кто подскажет?

tok17
Рядовой
Сообщения: 23
Зарегистрирован: 30.04.2016{, 09:46}
Репутация: 0
Откуда: Южно-Сахалинск
Имя: Александр
Контактная информация:

Пользовательский блок "измерение переменного тока"

#58

Сообщение tok17 » 12.02.2017{, 15:09}

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

bars
Рядовой
Сообщения: 26
Зарегистрирован: 27.11.2015{, 05:59}
Репутация: 0

Пользовательский блок "измерение переменного тока"

#59

Сообщение bars » 13.02.2017{, 05:25}

А схему подключения ТТ к ардуино с диодом и стабилитроном можно?

Добавлено (13.02.2017, 05:25)
---------------------------------------------
lopezmil, В принципе теоретически на форуме тебе описали достаточно подробно. Во всяком случае для меня понятно. Генератор работает и выдаёт тебе импульсы типа boolean далее после генератора надо поставить тригер, который по переднему фронту от генератора на своём выходе выдаёт импульс в один такт типа boolean и этот импульс подаётся на вход разрешения записи переменной в которую по этому такту записываются данные с аналогового входа. С какой частостой сделаеш генератор, так часто будут записываться данные в переменную. Если есть желание ждать то, я в скором времени постараюсь сделать блок в FBD, так как он имне самому нужен. Нечто подобное я уже делал но у меня получился не совсем удовлетворяющий меня результат. Задача ставилась такая: ТТ измеряет переменный ток в цепи, а контроллер обрабатывает данные с учётом кооффициентов пересчёта и выдаё на 7 сигментный 4 разрядный LED индикатор. Но получилось вот что. ТТ очень быстро делает замеры и мне приходилось частотой генератора ограничивать количество выборок, что бы на индикаторе можно было нормально видить цифры. А иначе появлялся ифект мерцания из-за слишком частого смены цифирь на индикации. Применил по советам с этого форума различные фильтры и тут открылась новая засада. выборки делаются и фильтры их сглаживают, но вопервых выводится на индикацию среднее значение выборок тока а не максимальные, во вторых нет синхронизации с синусойдой перменного тока и на индикации не стоит статично цифра установленного тока, например 10 А а плавно увеличиваются от 0 до 10 и затем плавно опускаются от 10 до ноля. Надо записывать измеренные значения в массив и выбирать из массива максимальные и только после этого выводить на индикацию.

lopezmil
Рядовой
Сообщения: 26
Зарегистрирован: 19.01.2017{, 00:41}
Репутация: 0

Пользовательский блок "измерение переменного тока"

#60

Сообщение lopezmil » 14.02.2017{, 00:40}



Добавлено (14.02.2017, 00:40)
---------------------------------------------
Что скажете, знатоки?
Вложения
8705626.jpg

Ответить

Вернуться в «Спросить у знатоков»