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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.03.2013, 09:03   #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
По умолчанию ACS712 Датчик тока

Вообщем в продолжении темы начатой еще на compcar http://www.compcar.ru/forum/showthread.php?t=8542, имеется датчик тока

Задача определяющие силы протекающего тока(для принятия решений -например о том, что прибор включился) и потребление тока.
С постоянным напряжением все понятно. Вот с переменным начинаются засады. График выходного сигнала повторяет синусоиду волны переменного тока, т.е. колеблется с частотой 50 Гц. Т.е. чтоб знать действующую величину тока нужно ловить пик синусоиды. Допустим в схеме Диммера можно добавить в процедур обработку прерывания при пересечении нуля кроме запуска таймера для отсчета отрезания волны, еще и запуск таймера для отсчета времени после которого будет считываться значение аналогового входа т.е. при 50 Гц это через 5 миллисекунд, выборку можно производить не каждый период т.е 20 миллисекунд, а реже , чтоб сильно не грузить процессор.
В общем схема понятна, дальше возникает вопрос что делать с этими данными и как их обрабатывать. Узнавать средний ток за секунду, за минуту. Наверное все зависит от того что с ними собираешься делать дальше. Допустим передавать на головное устройство средний ток за последнюю минуту, как оно определит за какую минуту это было или просто копить значение среднего того от передачи до передачи, а после подтверждения о передаче обнулить его и формировать новое?
Bulatovor вне форума   Ответить с цитированием
Старый 12.03.2013, 10:30   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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
По умолчанию

Цитата:
Допустим передавать на головное устройство средний ток за последнюю минуту, как оно определит за какую минуту это было или просто копить значение среднего того от передачи до передачи, а после подтверждения о передаче обнулить его и формировать новое?
Потребуются две переменные
1-я переменная, для хранения среднего значения тока за 1 сек. unt16_t или uint8_t
2-я переменная, пройденное время, с момента последнего прочтения данных тока центральным узлом или после обнуления. переменная типа uint32_t
При таком подходе, можно хранить данные о потребления тока в удаленном узле, за последниз 1194444 часов или 49768 суток или 136 лет.
Можно так же использовать EEPROM память, что бы не потерять данные тока при пропадания электроэнергии в сети
Admin вне форума   Ответить с цитированием
Старый 12.03.2013, 12:26   #3
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1604
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

А что мешает поставить диодный мост.
andr128 вне форума   Ответить с цитированием
Старый 12.03.2013, 12:54   #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
По умолчанию

Цитата:
Сообщение от andr128 Посмотреть сообщение
А что мешает поставить диодный мост.
Ограничения по размерам например, плюс просто мост только сгладит в 4 раза кривую, дальше нужна катушка, кондер и т.п., т.е полноценный выпрямитель иначе придется решать ровно те же проблемы что и при измерении переменки иначе неточность просто в те же 4 раза уменьшится и ничего не даст
Bulatovor вне форума   Ответить с цитированием
Старый 12.03.2013, 12:59   #5
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 вне форума   Ответить с цитированием
Старый 12.03.2013, 13:09   #6
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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
По умолчанию

Диммер отсекает как положительный так и отрицательный полупериод с боку по времени
Admin вне форума   Ответить с цитированием
Старый 13.03.2013, 11:54   #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
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Потребуются две переменные
1-я переменная, для хранения среднего значения тока за 1 сек. unt16_t или uint8_t
2-я переменная, пройденное время, с момента последнего прочтения данных тока центральным узлом или после обнуления. переменная типа uint32_t
При таком подходе, можно хранить данные о потребления тока в удаленном узле, за последниз 1194444 часов или 49768 суток или 136 лет.
Можно так же использовать EEPROM память, что бы не потерять данные тока при пропадания электроэнергии в сети
Со временем пока единственное что не могу придумать как быть
1. Просто передавать данные со времени последнего отправления -будет средняя, ну допустим головное опрашивает подчиненные раз в минуту -т.е. среднее за минуту, соответственно график будет минутный или десятиминутный в зависимости от количества подчиненных. Или передавать какой-то массив с посекундной тарификацией . А дальше уж головное определяет в какое время это было
2. В ведомых устройствах не критичных к габаритам можно поставить часы реального времени и передавать уже не количество секунд, а конкретные данные -потребление в конкретный момент

Пока остановлюсь на варианте среднее за период между опросами, думаю память микроконтроллера использовать бессмысленно, данные за минуту роли не сыграют большой -высокой точности добиваться бессмысленно. Вот что имеет смысл то это подумать над тем, как будет считаться если в течении долгого времени головное не получает инфы от ведомого например с в связи с его неисправностью и вообще как согласовывать возобновление работы после отключений электроэнергии.
Bulatovor вне форума   Ответить с цитированием
Старый 13.03.2013, 12:23   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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
По умолчанию

Цитата:
Вот что имеет смысл то это подумать над тем, как будет считаться если в течении долгого времени головное не получает инфы от ведомого например с в связи с его неисправностью и вообще как согласовывать возобновление работы после отключений электроэнергии.
Если нет ответа, тут уже ничего не поделаешь. Неисправности иногда случаются
После отключения энергии, нужно продолжать считать дальше, так же как после первого запуска или после ребута
Нет энергии или поломка, значит не будет потребления, так как контроллер не даст включится потребителю
Admin вне форума   Ответить с цитированием
Старый 13.03.2013, 13:43   #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
По умолчанию

Итак, исходные данные пока без учета использования диммера -просто измерение тока
при частоте сети 50 Гц синусоида от крайнего нижнего значения до крайнего верхнего поднимается за 10 миллисекунд. Соответственно на одно значение АЦП 1024 приходится почти 10 микросекунд( 9,7 если точнее) - это максимальная частота опроса которая будет наиболее точно отражать изменение уровня. Но я думаю такая частота не нужна, достаточно стандартных использованных в диммере 40 мкс, что даст возможную погрешность всего 0,4% что не просто приемлемо, а вполне приемлемо, по крайней мере для моих целей.
Соответственно запускаем таймер со счетчиком с интервалом 40 мкс и выбираем максимальное за один период(счетчик до 500), после чего считаем средний максимум за секунду или другой период исходя из максимумов и согласно формуле Power = 220 x (Vout – 2.5) x 0.707 / 0.1 считаем потребление(для питания в 5 вольт и датчике на 20 Ампер). Щас чего нибудь напишу.

P/S/ почитал темку про ускорение arduino - даже с либой analog_read требуется для преобразования 50 мкс, значит значение в 40 таймера не прокатит. Пусть пока будет 80 там посмотрим.

Последний раз редактировалось Bulatovor; 13.03.2013 в 13:54.
Bulatovor вне форума   Ответить с цитированием
Старый 13.03.2013, 15:33   #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
По умолчанию

Вот получилось что-то типа такого, на железе пока не проверял, не могу скачать новую версию nanopins а в моей, последней что скачивал таймера еще небыло.

По нажатию кнопки передаются средние значения от нажатия до нажатия

PHP код:
#include "nanopins.h" //быстрое управление пинами 
#include <Bounce.h>        // библиотека для устранения дребезга 
#include <TimerOne.h> //использует Timer1

 
volatile int  Smax// сумма максимальных значений
 
volatile int PeriodTic=0// счетчик периодов
 
volatile int PintTic=0// счетчик периодов
 
volatile int Vmax;// максимальное значение за период
 
volatile int Vout;// значение аналогового порта, можно конечно и считывать прямо, 
                   //но на сайте Arduino говорится что при использовании в функции 
                   // max других функций результаты получаются непредсказуемыми
           
int Power=0// значение потребляемой мощности
           
int I 0// сила тока
           
 
Bounce bouncer Bounce(95); //создаем экземпляр класса Bounce для 9 вывода 
 

void setup()  
{    
D9_In//настраиваем порт на вход для кнопки 1
     
D9_High;  //установить на входах высокий уровень и подключить резистор 
     
Serial.begin(9600);//поднимаем соединение для передачи на терминал   
   // Запуск таймера
    //  StartTimer1(current_meter, 80); 
    
     
Timer1.initialize(80);              // Интервал срабатывания таймера в мкс 
  
Timer1.attachInterrupt(current_meter);   //будет вызыватся каждый раз при отсчете заданого времени
 

//********************обработчики прерываний******************************* 
void current_meter()  //прерывания таймера 

  
PintTic++;  //счетчик периодов  
  
Vout=A3_Read// читаем  порт к которому подключен выход датчика
  
Vmax=max(Vout,Vmax); //  если полученное значение самое большое, присваиваем его переменной Vmax
    
if(PintTic==250)
  {   
Smax=Smax+Vmax// Добавляем сумму максимальных значений
      
PeriodTic++; // увеличиваем счетчик периодов
      
Vmax=0// обнуляем переменную максимума
      
PintTic=0;  //обнуляем счетчик 
  
}



//************************************************************************* 
void loop()  

  
  
// Обработка нажатия кнопки 
   
if (bouncer.update()) {     //если состояние кнопки изменилось
    
if (bouncer.read()==0//если кнопка нажата
    
{//если кнопка нажата
      
I=(Smax/PeriodTic-512)*0,707/0,1;
      
Power 220*I;// рассчитываем потребляемую мощность
      
Serial.print ("I=");Serial.print (IDEC); Serial.print (" A");
      
Serial.print ("   P=");Serial.print (PowerDEC); Serial.print ("Watt");
      
Serial.print ("   Period=");Serial.print (PeriodTic/50DEC); Serial.println ("Sec");
      
Smax=0// Обнуляем счетчики
      
PeriodTic=0// обнуляем счетчик
    

  }

Проверил, не работает, разбираюсь

Последний раз редактировалось Bulatovor; 13.03.2013 в 21:50.
Bulatovor вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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


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


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