#1 2017-03-25 19:46:28

bAster.89
Учасник
Зареєстрований: 2017-03-22
Повідомлень: 7

Разобраться с кодом (строю амперметр)

Приветствую!

Я в Ардуино(как и в програмировании) бегинер.
Нужен, как элемент другого проекта амперметр(переменный ток). Купил датчик ACS712 на 30 А.
Все бы ничего, но при измерении переменного тока получается великоватая погрешность.
Порылся по интернету, нашел вот такой код, для подобного устройства с преобразованием Фурье(что бы это ни значило):
https://github.com/babinvn/homegrid/blo … megrid.ino
Несколько дней уже неспешно курю его. То в справочник посмотрю, то у гугла спрошу. Но все-равно остались фрагменты, которые справочник не освещает, почему-то, а гугл не понимает чего я от него хочу.
Короче, помогите разобраться с фрагментом кода. Что это, как функционирует, и с чем его едят:

double det3x3(
  double m00, double m01, double m02,
  double m10, double m11, double m12,
  double m20, double m21, double m22
){
  return m00*m11*m22 + m01*m12*m20 + m10*m21*m02 - m02*m11*m20 - m01*m10*m22 - m00*m12*m21;
}

Объяснения можно оформить в виде отсылок к конкретной литературе/статьям где есть разъяснение.

Остання редакція bAster.89 (2017-03-25 19:56:01)

Неактивний

#2 2017-03-25 20:02:18

bAster.89
Учасник
Зареєстрований: 2017-03-22
Повідомлень: 7

Re: Разобраться с кодом (строю амперметр)

Всем спасибо за помощь. Как написал, так сам и разобрался. Это же функция. В окошке справочника на нее выхода нема, поэтому и не сообразил...

Но по проекту 100% еще будут вопросы. Как натолкнусь- сюда опять спрошу.

Неактивний

#3 2017-03-25 20:05:04

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Разобраться с кодом (строю амперметр)

Привет, матрицы
http://ru.solverbook.com/primery-reshenij/primery-resheniya-matric/

Неактивний

#4 2017-03-26 01:41:52

bAster.89
Учасник
Зареєстрований: 2017-03-22
Повідомлень: 7

Re: Разобраться с кодом (строю амперметр)

Спасибо.
Почитал. Понял мало, но хоть общее представление теперь имею.
Скажите, а какого уровня это математика? Школьная старшие(10-11) классы или вузовская, что за раздел?

ЗЫ. Не удивляйтесь, я музыкант по образованию. В программе обучения повыпиливали почти все технические дисциплины, от многих даже ознакомительного курса не оставили.  sad

Неактивний

#5 2017-03-26 12:51:05

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Разобраться с кодом (строю амперметр)

в коде вероятно поиск максимума спектра
[fix] быстрое преобразование  Фурье, как раз та лекция что я проспал (


наверное лучшая книга  для ознакомления Юкио Сато   Обработка сигналов

тут посмотрите,   
http://dsp-book.narod.ru/books.html
narod.ru - жесть рекламная (

или в поиске "цифровая обработка сигналов книги"


Вы если что обращайтесь, вместе попробуем разобраться )

Остання редакція NoName (2017-03-27 09:42:30)

Неактивний

#6 2017-04-02 22:13:49

bAster.89
Учасник
Зареєстрований: 2017-03-22
Повідомлень: 7

Re: Разобраться с кодом (строю амперметр)

Приветствую!
Столкнулся с неожиданными проблемами в программе, все в коментариях:

  for(int i = 0; i < m; i++)                                          //Перебираем указанные выше задействованные пины по очереди, промеряем ток проходящий через них
  {                                                                   //и для каждого выполняем вычисления Вт и ВтЧ электроэнергии прошедших через датчик.
                                                                      //________________________Здесь начинаются проблемы____________________________________________________________________________________________________
     unsigned long T = millis() - Time[input[i]];                     //!!!Вычисляем интервал от последнего замера конкретного порта(или от начала работы микроконтроллера)                                               !!!
     unsigned long A=Time[input[i]];                                  //!!!Переменная А-ничего не делает, просто сохраняет текущее значение переменной Time для последующего ее отображения на мониторе                   !!!
     Time[input[i]]=Time[input[i]]+T;                                 //!!!Пытаемся вычислить значение миллис() в 47 строчке программы(на две строчки выше), но, судя по монитору- получается какая-то фигня вместо этого.!!!
                                                                      //!!!высчитанные миллис() легко могут в результате оказаться меньше чем Т, чего не должно быть по определению                                       !!!
                                                                      //!!!_______________________________________________________________________________________________________________________________________________!!!
     double T1;                                                       //!!!Вторая проблема- При делении Т на 60000(переводим значение в миллисекундах- в минуты) почему-то получается 0,000000, хотя 20000(с гаком)/600000!!!
     T1=T/60000;                                                      //!!!Никак не может иметь значение меньше 0,000001                                                                                                  !!!
                                                                      //!!!_____________________Здесь кончаются проблемы__________________________________________________________________________________________________!!!

И так, и сяк вертел, но ничего не получается, помогите пожалуйста!!
Ну и сам скетч, кому надо, для лучшего понимания проблем.

Неактивний

#7 2017-04-03 04:12:38

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Разобраться с кодом (строю амперметр)

T1=(double)T/60000.0;

Неактивний

#8 2017-04-03 13:52:32

bAster.89
Учасник
Зареєстрований: 2017-03-22
Повідомлень: 7

Re: Разобраться с кодом (строю амперметр)

Та что-то с этими привидениями, вернее преобразованиями типов, вообще не разобрался...
Это же уравнение пытался записать ка double(T)=T/60000, ну и разные вариации этого(double(T)=double(T/60000); T1=double(T/60000) ; T1= double(T)/60000...), большинство компиллятор не пропустил или результат получается целым.

Вот сейчас еще записал и обратил внимание, что у вас(и не только , где то в кодах такую же запись встречал) запись "(дабл)" а в справочнике пишут "дабл()". Так и так правильно? Или ошибка в справочнике? или я не правильно прочитал?

Но это все не большая проблема. Меня больше волнует Кусок с миллисами.
Он явно работает как-то не правильно. Для понимания этой конструкции в квадратных скобках- кусочек "головы" скетча:

  const byte input [] = {7,2};                  //В фигурные скобочки выписываем через запятую все номера аналоговых входов, на которых висят датчики тока
  const double ACScoef [] = {0.066 , 0.120};    //------------------"------------------------- соответствующие значения коэффициента датчика тока(Вольт на 1 Ампер тока)
  double WhH[8];                                //В ячейку массива, соответствующую аналоговому пину, будет записываться значение прошедших через нее ВтЧ.
                                                //Ячейки соответствующие неиспользуемым пинам- остаются с записанным в них нулем(позже в програме).
  unsigned long Time[8];                        //То же самое но со временем

Пытался приложить конструкцию с миллисами(ту же которая выше) но движок форума вдруг сообразил:

"Следующие ошибки необходимо исправить прежде чем сообщение будет сохранено:
[і] открывается внутри такого же тега, это недопустимо"

Если это автоматизированная подсказка(почему она вчера не вылезла?), то пробовал input[і] заменить:
int C= input[і]
и дальше везде где встречается конструкция "[input[і]]", пишем [C].
Но на мониторе, в результате всех манипуляций,ничего не меняется(Под ником "Time[C]old" или "Time[input[і]]old" отображается переменная "А"):

WhH(7)(0.07)=0.000000	T1=0.00000000	T=0	Time[input[i]]old=0	Time[input[i]]=0
WhH(2)(0.12)=35481.722656	T1=0.00066667	T=50	Time[input[i]]old=0	Time[input[i]]=40
**************************************************************************************
WhH(7)(0.07)=9501268.000000	T1=0.08700000	T=12144	Time[input[i]]old=0	Time[input[i]]=5220
WhH(2)(0.12)=4712320.500000	T1=0.08725000	T=12163	Time[input[i]]old=40	Time[input[i]]=5275
**************************************************************************************
WhH(7)(0.07)=19404908.000000	T1=0.08736667	T=12172	Time[input[i]]old=5220	Time[input[i]]=10462
WhH(2)(0.12)=12790881.000000	T1=0.08745000	T=12177	Time[input[i]]old=5275	Time[input[i]]=10522
**************************************************************************************
WhH(7)(0.07)=29085428.000000	T1=0.08753334	T=12204	Time[input[i]]old=10462	Time[input[i]]=15714
WhH(2)(0.12)=21078378.000000	T1=0.08755001	T=12205	Time[input[i]]old=10522	Time[input[i]]=15775
**************************************************************************************
WhH(7)(0.07)=38467000.000000	T1=0.08756667	T=12206	Time[input[i]]old=15714	Time[input[i]]=20968
WhH(2)(0.12)=28501928.000000	T1=0.08756667	T=12206	Time[input[i]]old=15775	Time[input[i]]=21029
**************************************************************************************
WhH(7)(0.07)=47665244.000000	T1=0.08755001	T=12205	Time[input[i]]old=20968	Time[input[i]]=26221
WhH(2)(0.12)=34527320.000000	T1=0.08756667	T=12206	Time[input[i]]old=21029	Time[input[i]]=26283

**************************************************************************************
WhH(7)(0.07)=55715240.000000	T1=0.08756667	T=12206	Time[input[i]]old=26221	Time[input[i]]=31475
WhH(2)(0.12)=39587316.000000	T1=0.08756667	T=12206	Time[input[i]]old=26283	Time[input[i]]=31537
**************************************************************************************
WhH(7)(0.07)=64370500.000000	T1=0.08756667	T=12206	Time[input[i]]old=31475	Time[input[i]]=36729
WhH(2)(0.12)=44447576.000000	T1=0.08756667	T=12206	Time[input[i]]old=31537	Time[input[i]]=36791
**************************************************************************************
WhH(7)(0.07)=73871320.000000	T1=0.08755001	T=12205	Time[input[i]]old=36729	Time[input[i]]=41982
WhH(2)(0.12)=50538388.000000	T1=0.08755001	T=12205	Time[input[i]]old=36791	Time[input[i]]=42044
**************************************************************************************

_______________________________________________________________________________________________________


WhH(7)(0.07)=0.000000	T1=0.00000000	T=0	Time[C]old=0	Time[C]=0
WhH(2)(0.12)=49927.851562	T1=0.00066667	T=50	Time[C]old=0	Time[C]=40
**************************************************************************************
WhH(7)(0.07)=9561402.000000	T1=0.08700000	T=12144	Time[C]old=0	Time[C]=5220
WhH(2)(0.12)=5157965.500000	T1=0.08725000	T=12163	Time[C]old=40	Time[C]=5275
**************************************************************************************
WhH(7)(0.07)=19223488.000000	T1=0.08736667	T=12172	Time[C]old=5220	Time[C]=10462
WhH(2)(0.12)=13170035.000000	T1=0.08745000	T=12177	Time[C]old=5275	Time[C]=10522
**************************************************************************************
WhH(7)(0.07)=28601492.000000	T1=0.08753334	T=12204	Time[C]old=10462	Time[C]=15714
WhH(2)(0.12)=21224550.000000	T1=0.08755001	T=12205	Time[C]old=10522	Time[C]=15775
**************************************************************************************
WhH(7)(0.07)=38285696.000000	T1=0.08756667	T=12206	Time[C]old=15714	Time[C]=20968
WhH(2)(0.12)=28248626.000000	T1=0.08756667	T=12206	Time[C]old=15775	Time[C]=21029
**************************************************************************************
WhH(7)(0.07)=47181368.000000	T1=0.08755001	T=12205	Time[C]old=20968	Time[C]=26221
WhH(2)(0.12)=34007704.000000	T1=0.08756667	T=12206	Time[C]old=21029	Time[C]=26283
**************************************************************************************
WhH(7)(0.07)=55291892.000000	T1=0.08756667	T=12206	Time[C]old=26221	Time[C]=31475
WhH(2)(0.12)=38701516.000000	T1=0.08756667	T=12206	Time[C]old=26283	Time[C]=31537
**************************************************************************************
WhH(7)(0.07)=64128728.000000	T1=0.08756667	T=12206	Time[C]old=31475	Time[C]=36729
WhH(2)(0.12)=43927960.000000	T1=0.08756667	T=12206	Time[C]old=31537	Time[C]=36791
**************************************************************************************
WhH(7)(0.07)=73750576.000000	T1=0.08755001	T=12205	Time[C]old=36729	Time[C]=41982
WhH(2)(0.12)=51050548.000000	T1=0.08755001	T=12205	Time[C]old=36791	Time[C]=42044
**************************************************************************************



К стати, Т1 на мониторе вверху уже вычисляется:
T1=(double)T/60000
Помогло, спасибо! 60000.0 специально не ставил. Без ".0" вроде все работает тоже. smile

Остання редакція bAster.89 (2017-04-03 13:54:03)

Неактивний

#9 2017-04-03 14:09:25

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Разобраться с кодом (строю амперметр)

unsigned long T = millis() - Time[input[i]];          
тут суммируем  время  , а не храним старое 
	Time[input[i]] += T;                          
	
сложно пишете ( 	
	unsigned long old_millis = millis();
	unsigned long T = old_millis - Time[input[i]];          
	Time[input[i]] = old_millis;

Неактивний

#10 2017-04-03 14:27:38

bAster.89
Учасник
Зареєстрований: 2017-03-22
Повідомлень: 7

Re: Разобраться с кодом (строю амперметр)

Кажется обнаружил ошибку:
     Serial.print("T1=");
     Serial.print(T1,8);
     Serial.print("\t");
     Serial.print("T=");
     Serial.print(T,8);
Как и водится, она оказалась совсем не там, где я ее искал. Раньше Т была double, ну и, естественно, я ее на мониторе хотел видеть с 8-ю знаками после запятой, а потом я ее поменял на unsigned long а восьмерка- осталась ("Serial.print(T,8);") Не знаю что она делала с переменной типа ЛОНГ, но когда я ее убрал- все стало похожим на правильное.

Остання редакція bAster.89 (2017-04-03 14:48:37)

Неактивний

#11 2017-04-03 15:07:31

bAster.89
Учасник
Зареєстрований: 2017-03-22
Повідомлень: 7

Re: Разобраться с кодом (строю амперметр)

unsigned long T = millis() - Time[input[i]];          
тут суммируем  время  , а не храним старое 
Time[input[i]] += T;  

Хранение старого времени никому не нужно было, ввел для отладки, чтоб быть уверенным, что за цикл с ним ничего не происходит.
Математическое мышление за годы занятия музыкой- заржавело страшно. Часто не могу сообразить элементарные вещи. Будем надеяться что в ближайшем времени разработается smile

сложно пишете ( 	
	unsigned long old_millis = millis();
	unsigned long T = old_millis - Time[input[i]];          
	Time[input[i]] = old_millis;

Спорный вопрос как сложнее. В вашем варианте получается одна лишняя переменная.
Хотя логику я понимаю:
Вы сначала записываете миллис(), а потом делаете с ними вычисления, а я
сначала делаю вычисления с миллис(), а потом вычисляю какие-же все-таки были только что миллис big_smile
Но замечание, в любом случае, принято.
И спасибо за помощь! smile

Остання редакція bAster.89 (2017-04-03 15:14:24)

Неактивний

#12 2017-04-03 15:28:22

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Разобраться с кодом (строю амперметр)

точно, заработался
Ваш вариант  тоже рабочий

unsigned long T = millis() - Time[0]; 
 Time[0]+= T;                           
                                         
	old_millis , по логике нужно назвать new_millis / current_millis

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму