Страница 3 из 3

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

Добавлено: 01.02.2017{, 10:53}
Dev1
Только заметил, что вы давно уже это решение используете. В программе один компаратор поставил и увидел в коде. И че я раньше парился с этими условиями. И посмотрите, везде в документации ни слова про такую возможность.

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

Добавлено: 01.02.2017{, 11:05}
lopezmil
Вывел на монитор порта значение пин 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

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

Добавлено: 01.02.2017{, 11:16}
support
Не хочу разбираться с Вашим кодом. Вот пример проекта (картинка, поскольку у меня сейчас версия в работе и у Вас проект сделанный в ней не откроется)

Изображение

Вот код

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));
}
}

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

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

Добавлено: 01.02.2017{, 11:29}
support
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 собирало. Я такие переменные не использую, и комменты в коде практически не делаю.
Это наверное какой то пользовательский блок на С, а за их содержание я не отвечаю)))). Все вопросы к автору блока))))).

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

Добавлено: 01.02.2017{, 11:44}
Dev1
Что то мне сдается что я много чего пропустил...
далее


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

Добавлено: 01.02.2017{, 11:47}
slavas
support, так в том то и косяк что в проекте сидит мой блок и один он работает а lcd или компортом глючит.

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

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

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

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

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

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

P.S. - Это касалось 
bool q;
q=13;

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

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

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

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

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


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

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

Добавлено: 01.02.2017{, 16:25}
slavas
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 и как исправить?

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

Добавлено: 01.02.2017{, 20:46}
support
slavas писал(а):кусок кода из моего блока может конфликтовать с flprog и как исправить?
Не должен конфликтовать, ничего такого в нём нет. Надо внимательнее посмотреть блок, но пока некогда

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

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

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

Добавлено: 07.02.2017{, 14:02}
Олег
Можно данные на индикатор считывать из переменной, а запись новых значений в переменную делать раз в секунду, например. Можно поставить какой-нибудь цифровой фильтр.

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

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

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

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

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

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

Добавлено: 09.02.2017{, 22:42}
lopezmil
Задал данный впрос на форумах по ардуино и вот что мне один товарищ ответил : 
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)
---------------------------------------------
Но ответы на свои вопросы я так и не получил. Может здесь кто подскажет?

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

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

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

Добавлено: 13.02.2017{, 05:25}
bars
А схему подключения ТТ к ардуино с диодом и стабилитроном можно?

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

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

Добавлено: 14.02.2017{, 00:40}
lopezmil


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