Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.05.2013, 20:26   #1
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Подключил к радиоканалу и начал мониторить. При нагрузке даже в 40 ватт на 20 амерный датчик выдатся значения 516-517 что для диммера должно хватать. Судя по всему в чем косяк стало понятно, в первоисточнике с датчиком ноля - определяется только ноль , а дальше работает таймер. А у меня же прерывания постоянно без запуска отдельного таймера и в результате в выложенном ранее коде получается
PHP код:
void halfcycle()  //прерывания таймера 
{    
  
Vout=A3_Read// читаем  порт к которому подключен выход датчика тока
  
if (Vout>508 && Vout<516)  tic=0;   //детектор ноля     
  
if(Dimmer tic) {D13_High;} else  D13_Low;
tic++;  //счетчик  
}; 
А засада вот в чем: пока счетчик не достиг значения диммера нагрузка выключена -отрезаем фронт, т.е. нагрузка моментальная 0, соответственно значение датчика 512 и счетчик каждое прерывание обнуляется, т.е. все правильно -диммер работает только выключателем, когда значение Dimmer равно нулю- то нагрузка сразу включается и показания датчика растут, в иных случаях она по этому коду и не должна включиться. Будем думать...
Bulatovor вне форума   Ответить с цитированием
Старый 28.05.2013, 20:41   #2
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

решения с ходу приходит пока только с использованием костыля (флага)
PHP код:
void halfcycle()  //прерывания таймера 
{    
  
Vout=A3_Read// читаем  порт к которому подключен выход датчика тока
  
if (Vout>508 && Vout<516 && flag==0)  {tic=0flag=1;}   //детектор ноля     
  
if(Dimmer tic) {D13_Highflag=0;} else  D13_Low;
tic++;  //счетчик  
}; 
Но нужно что-то более элегантное

Последний раз редактировалось Bulatovor; 29.05.2013 в 07:12.
Bulatovor вне форума   Ответить с цитированием
Старый 28.05.2013, 22:28   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Наверно имелось ввиду
if (Vout>508 && Vout<516 && flag==0) { tic=0; flag=1; } //детектор ноля

Ошибка в выполнении условия, выполнится только tic=0; так как нет фигурных скобок
Admin вне форума   Ответить с цитированием
Старый 29.05.2013, 07:11   #4
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Согласен
Bulatovor вне форума   Ответить с цитированием
Старый 29.05.2013, 18:51   #5
dmitry123
Member
 
Регистрация: 03.12.2012
Адрес: Ярославль
Сообщений: 53
Вес репутации: 0
dmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant future
По умолчанию

У меня к сожалению датчика тока под рукой нет, проверить никак ...
Проблема в том, насколько я понял, отловить ZeroCross через ACS712 ...
А если ловить его таким образом:
Ставим компаратор напряжения на выходе с ACS712, настраиваем на 2,5в ... а далее по накатаной схеме Admin'ом через прерывание ????
Как вариант - микросхема BU4825G-TR и настраивать ничего не надо .... 2.5в ...
Наверное правильнее будет ловить 0 через прерывание, чем через АЦП

Последний раз редактировалось dmitry123; 29.05.2013 в 19:00.
dmitry123 вне форума   Ответить с цитированием
Старый 29.05.2013, 19:16   #6
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

У Arduino есть встроеный аналоговый компаратор пины AIN0, AIN1
Но тут проблема в том, что когда через нагрузку не течет ток, то показания датчика все время будут на ноле.
Admin вне форума   Ответить с цитированием
Старый 29.05.2013, 21:10   #7
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

С костылем заработало, но немного не стабильно, еще не знаю почему - нужно докрутить будет, ну для начала увеличив нагрузку. Использование компатора ( выводы D6 и D7 Arduino) упростит задачу - отправив его по накатанной схеме с димером по прерываниям, но это лишнее лишнее - зачем два раза снимать показания с одного датчика -ведь его же функция еще и мерить ток.
Есть конечно интересная мысль -запускать таймер по прерыванию с компаратора, а ток измерять только раз в период (вместо 200) через 50 миллисекунд, но как быть тогда если кооффициент диммирования больше 50% -синусоида своего пика не достигнет? или мерять по включению диммера и умножать на коофициент диммера

Последний раз редактировалось Bulatovor; 30.05.2013 в 11:56.
Bulatovor вне форума   Ответить с цитированием
Старый 30.05.2013, 10:26   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
С костылем заработало, но немного не стабильно
Нестабильно я думаю из-за датчика 20А, так как число уровней от ноля до максимума, очень маленькое и еще к этому добавить шум
Admin вне форума   Ответить с цитированием
Старый 30.05.2013, 13:46   #9
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Ну вот от скуки попробовал вариант с компаратором - опорное напряжение будет получено из равноплечего резистивного делителя, соответственно оно будет равно логическому нулю на датчике тока, независимо от колебаний напряжения arduino. Вечером протестирую на железе если успею
PHP код:
#include "CyberLib.h"      //подключаем библиотеку быстрого управления пинами
#include "analogComp.h" // библиотека компаратора

// Переменные для функционирования Диммера
int Dimmer1=20// переменная определяющая яркость свечения диммера 
int tic1=0;        // счетчик таймера
int DimmerMax=100// максимальное значение диммера

// Переменные измерения тока
volatile long  Smax// сумма максимальных значений
volatile long PeriodTic=0// счетчик периодов
volatile long Vout;// значение аналогового порта, можно конечно и считывать прямо,но на сайте Arduino говорится что при использовании в функции max других функций результаты получаются непредсказуемыми
volatile unsigned int Power// значение потребляемой мощности 
volatile unsigned int I 0// сила тока 

void setup()  
D4_Out//Настраиваем порт на выход Dimmer1
  
D4_Low
    
  
analogComparator.setOn(AIN0AIN1); //настраиваем компаратор
  
analogComparator.enableInterrupt(detectCHANGE); //прерывание компаратора по изменению уровня -детектор нуля
};  
  

//обработчики прерываний для работы диммера
void  detect()  // обработка внешнего прерывания. Сработает переходу через ноль
{  
 
tic1=0;             //обнулить счетчик
 
StartTimer1(halfcycle,100);   //запустить таймер
 
}  

void halfcycle()  //прерывания таймера 
tic1++;  //счетчик диммера
if(Dimmer1 tic1 
{  
D4_HighStopTimer1(); 
if(
Dimmer1>DimmerMax/2){StartTimer1(current,5000-100*tic1);} else current();} // Если значение Dimmer>50, то ждем до пика по времени и считываем данные датчика, иначе меряем сразу.
else  D4_Low;
}

// подпрограмма измерения тока 
void current()
{
Vout=A3_Read
Smax=Smax+Vout// Добавляем сумму  значений 
PeriodTic++; // увеличиваем счетчик периодов
}

void loop() {  } 
Из видимых минусов такого решения -на датчик так уходит три ноги контроллера и добавляется 2 резистора. Но в данном проекте это в принципе терпимо.

Последний раз редактировалось Bulatovor; 30.05.2013 в 13:52.
Bulatovor вне форума   Ответить с цитированием
Старый 30.05.2013, 20:20   #10
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Сделал делитель из двух резисторов по 100 ом. Работает, но так же не стабильно как и в версии без компаратора. Жду 5 амперные датчики
Bulatovor вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 21 (пользователей: 0 , гостей: 21)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

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

Быстрый переход


Текущее время: 06:38. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика