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

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

Добавлено: 30 янв 2017, 13:47
lopezmil
Реле у меня самое обыкновенное, при 1 на входе оно замыкается. Сначала я использовал пин13, чтобы по светодиоду определять его состояние . Позже подумал, что лучше использовать другой пин и реле. На плате реле есть два светодиода: красный, сигнализирующий о наличии питания и зелёный, сигнализирующий о состоянии контактов реле. Так вот с этим скетчем реле у меня постоянно замкнуто. Что самое интересное, с выхода компаратора инвертирую сигнал, а реле всё равно остаётся замкнутым!!! Когда просто выдёргиваю проводок из ардуины, зелёный светодиод гаснет. Для проверки работоспособности этого выхода залил в ардуину программу кнопки. Замыкая контакт, реле на этом пине замыкается и размыкается. Может кто-нибудь посмотрит скетч и даст разумный ответ на это?

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

Добавлено: 30 янв 2017, 13:51
OlegAn1962
А у вас есть что-нибудь кроме блока реле для проверки выхода? Вольтметр например?

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

Добавлено: 30 янв 2017, 14:11
Олег
Что-то мне припоминается что компаратор с Float не дружит. Может я и не прав, я обычно integer использую, проверить сейчас не могу.

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

Добавлено: 30 янв 2017, 14:21
OlegAn1962
Не знаю, вот кусок моего проекта, прекрасно работает:



Добавлено (30.01.2017, 14:21)
---------------------------------------------
lopezmil, а вы вообще смотрели, что у вас на входе в компаратор?

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

Добавлено: 30 янв 2017, 15:03
lopezmil
Хоть кто-нибудь,  кроме Slavas ( который сделал этот пользовательский блок ТА12), себе в flprog, прикреплённый мной файл, закидывал, открывал? Я спрашиваю не об абстрактных формах, а о конкретных вещах. В компараторе есть возможность выбора float, значит должен дружить. С выхода wire я получаю реальное значение тока. Отправляю его в компаратор (I2). Сравниваю его с уставкой (I1) в компараторе и на выходе с компаратора должен получить ответ о работоспособности устройства в виде 0 или 1. Вот так должна работать схема. А она мне постоянно выдаёт 1 на выходе компаратора. Вот в чём вопрос!!!$IMAGE1$

Добавлено (30.01.2017, 15:03)
---------------------------------------------
картинка

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

Добавлено: 30 янв 2017, 15:05
lopezmil
.

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

Добавлено: 30 янв 2017, 16:05
Олег
lopezmil писал(а):Хоть кто-нибудь,  кроме Slavas ( который сделал этот пользовательский блок ТА12), себе в flprog, прикреплённый мной файл, закидывал, открывал?
А с чего-бы  вам про флоат писал? 
Повесьте переменную на входе компаратора и на выходе и смотрите через компорт что у вас там происходит. Я обычно дисплей подключаю в таких случаях - все как на ладони.

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

Добавлено: 30 янв 2017, 16:34
slavas
lopezmil, у Вас блок работает нормально?
в схеме у Вас условие если вход 2 меньше 600 тогда на выходе 1.

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

Добавлено: 30 янв 2017, 16:55
lopezmil
Подскажите пожалуйста, а на монитор порта вывести эти переменные со входа и выхода можно? Я не совсем представляю себе как это сделать в flprog. Или нужно скомпилировать скетч и уже в скомпилированном добавить SerialPrint  и те переменные, которые нужно вывести на экран?

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

Добавлено: 30 янв 2017, 17:21
OlegAn1962
lopezmil писал(а):а на монитор порта вывести эти переменные со входа и выхода можно?
Элементарно, Ватсон :

[spoiler=Спойлер][/spoiler]

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

Добавлено: 30 янв 2017, 18:57
slavas
Вообще то в этом блоке я не удалял отправку com port и соответственно он в фоновом режиме отправляет туда данные. У меня косяк не понятный на lcd и блок отправки переменной в компорт блок не передаёт данные, либо я в коде накосячил либо последняя версия прги .

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

Добавлено: 31 янв 2017, 13:19
lopezmil
slavas, блок работает прекрасно. Огромное спасибо за помощь. Да, условие такое, только ничего не происходит, ни когда вход 2 меньше 600, ни когда больше. На пин 13 всё время 1. Я уже попробовал вставить после компаратора преобразователь float->int и константу изменял так же int, но и это не помогло.

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

Добавлено: 31 янв 2017, 14:47
Олег
lopezmil писал(а):Да, условие такое, только ничего не происходит, ни когда вход 2 меньше 600, ни когда больше. На пин 13 всё время 1.
Как вы проверяли вы не написали, так что напишу как-бы проверял я в вашей ситуации.
1. Инвертируем выход 13, если на выходе появился низкий, значит вход рабочий и переходим к пункту 2, если не появился, то выход не рабочий и тогда подключаем другой выход или берем другой контроллер.
2. На второй вход компаратора поставим 650, выход 13 возвращаем в исходное состояние. Появился низкий, значит проблема в блоке пользователя и он не дает значение больше 600 (или это из-за датчика), не появился, значит какой-то глюк в программе, что иногда случается. Выручает создание нового проекта с самого начала.

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

Добавлено: 31 янв 2017, 21:18
lopezmil
Как я проверял?! Скомпилировал проект > загрузил в ардуино > включил монитор порта и наблюдал за показаниями выхода wire. Они изменялись в соответствии с изменением нагрузки на реальном вентиляторе. Значит пользовательский блок работает (картинка в посте №26). В посте №21 я уже писал, что выход пробовал инвертировать. В посте №19 писал, что пробовал другие пины. Ничего не помогает. Повторюсь, что пробовал на этих пинах скетч с обычной кнопкой, т.е. на 7 пине кнопка, а пин 13 выход. Замыкаю пин 7 на 13 пине загорается светодиод. Плата исправна!!! Неисправна программа. А в чём неисправность не могу понять???

Добавлено (31.01.2017, 21:18)
---------------------------------------------


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

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

}

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

Добавлено: 31 янв 2017, 21:36
Dev1
Что то новенькое 
lopezmil писал(а):digitalWrite(13, (600.00) < (wire));
Должно быть как то так

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

if (wire > 600)
   {
      digitalWrite(13, HIGH);
   }
   else
      {
         digitalWrite(13, LOW);
      }
если логику не спутал, особенно не вникал..

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

Добавлено: 31 янв 2017, 22:40
Олег
Если у вас железо работает, то отсекайте по частям, удалите пользовательский блок, оставьте компаратор с выходом и проверьте. У меня ни разу компаратор нигде не глючил, так что проверяйте. Или что еще лучше сделайте новый проект, сначала проверка выхода с кнопкой, потом к нему подсоедините компаратор - на входах поставьте константы, ну потом пользовательский блок. Ну и смотрите где заткнется.

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

Добавлено: 31 янв 2017, 23:13
lopezmil

Что то новенькое 
Цитата lopezmil (Изображение)
digitalWrite(13, (600.00) < (wire));

Должно быть как то так

Код
if (wire > 600)
   {
      digitalWrite(13, HIGH);
   }
   else
      {
         digitalWrite(13, LOW);
      }
вот так мне компилирует flprog. Я понимаю, что ошибка в компиляции проекта программой, но где она не знаю. Поэтому и выложил уже скомпилированый текст программы. Попробовал ваше исправление, не помогло.

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

Добавлено: 01 фев 2017, 10:02
support
Dev1 писал(а):Что то новенькое
  А чем вам не нравится запись вида:

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

digitalWrite(13, (600.00) < (wire));
Если wire больше 600 на выход запишется 1 в противном случае  0. Всё правильно, функция digitalWrite позволяет производить расчёты внутри вызова.

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

Добавлено: 01 фев 2017, 10:35
Dev1
Просто я первый раз вижу что бы в digitalWrite в значении использовалось условие. Если у вас есть какие то описания можете кинуть ссылку почитать, сам ничего похожего не нашел.

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

Добавлено: 01 фев 2017, 10:48
support
Уже не помню где прочитал, но после проверки опытным путём начал использовать. Да Вы и сами можете проверить, всё работает