вольтметр и милливольтметр одноврменно

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

nik182 пишет:

wdrakula пишет:

1. nik182. Точно! Мой косяк.Все правильно. А10 на землю и убрать "-511" при вычислении.

 В диф. режиме при равенстве входов выдает 511 - от этой величины верх положительные коды, вниз отрицательные. Имеется в виду, если на на отрицательном входе напряжение больше чем на положительном, то выдаваемый код будет меньше 511-ти. Если заземлим отрицательный, при нулевом положительном выходной код будет 511( или где то рядом - для точного значения нужна калибровка)  поэтому положительные значения напряжения на положительном входе имеют коды от 511 до 1023. Поэтому нужно вычитать 511 в дифф режиме для измерений от нуля до референс напряжения. Разрядность только 9 бит будет.   

Простите, ник, но усомнившись в этом  (ведь в даташите совсем не так) я поставил несложный эксперимент на Амперковской леонардо.

вот прога:

uint16_t i,V,l,h;

void setup() {
  Serial.begin(9600);
}

void loop() {
  ADCSRB = 0x1 << MUX5; 
  ADMUX = 0xCB;
  for(i=0;i<100;i++); 
  ADCSRA=B11000111;
  while (ADCSRA & (1 << ADSC));
  l=ADCL;
  h=ADCH;   
  V=(h << 8) + l;

  Serial.println(V);
  delay(2000);
}

Код  0xCB - это ADC0=A5 (-), ADC7=A0 -(+) gain x10, Ref - internal 2.56 V.

В остальном код Ваш.

Так вот на мониторе все так, как и написано в даташите: положительные значени от 0 до 511, отрицательные от 1023 до 512,

то есть чуть ниже 0 - идет сразу 1023 и потом, по мере роста отрицательного напряжения результат уменьшается от 1023 до 512.

вот фото:

Резистор на 100К подстроечник на 5К, на БП выставлено 4.8 В фиксированно. На фото, как раз вариант с отрицательными значениями, красный провод на А5 (ADC0).

----------------------

Так что простите, но "-511" в Вашем коде лишние, и я был прав  их действительно надо убрать.

Еще раз извините, я не ловил на ошибке, я скорее себя проверял.

nik182
Offline
Зарегистрирован: 04.05.2015

Да. Согласен. Эксперементировал на ЛСД шилде с кнопочками , которые резюки на массу замыкают на входе АЦП. Как меняются коды видел, но что то не так не понял. Спасибо.

maxvalin
Offline
Зарегистрирован: 22.02.2016

di_mot пишет:

А теперь вопрос (на засыпку): - С какой периоичностью снимаются показания Вольт и Ампер? ;-)

Ответ: 1 сек (время по п.2) + время по п.1 + время по п.3.

То тебе измерять каждую секунду и писать в лог каждые 300 сек.

То устраивает не известно как часто измеряешь и писать через не определенное время (но явно чаще чем раз в 300 сек)  в лог.

Что вы, что вы!))

я имел ввиду что код работает а с периодичностью я еще не доконца сделал, это на самом деле не суть вопроса. Мне лог скажут раз в пять минут делать или 10. Так что временные интервалы ерунда))

maxvalin
Offline
Зарегистрирован: 22.02.2016

увяз все таки на миллиамперах, не понимаю, скорее всего сопротивлениена входе ардуино ниже чем допустимо для этого шунта... 

ноль, получается, измеряет ноль. Наверное придется городить усилитель, есть у кого опыт с этим?

nik182
Offline
Зарегистрирован: 04.05.2015

У меня стоит INA138. Специальная мс для шунта, но 140 руб. Сопротивление по даташиту должно быть 10кОм. Очень странно. С шунта, у которого сопротивление существенно ниже должено цифроваться хорошо. Другое дело разрядность 

maxvalin
Offline
Зарегистрирован: 22.02.2016

nik182 пишет:

 но 140 руб.

это ее недостаток?))) Да я бы взял сразу 100А датчик (вопрос в цене вообще не стоит), лиж бы работал в связке с ардуино, но подобному напроч не доверяю http://ru.aliexpress.com/item/Free-Shipping-Electronic-Voltage-Regulator-ACS758ECB-200B-PFF-T-SENSOR-CURRENT-200A-5V-BI-5-CB/32382443124.html

и ее хватает наглости указывать 200А! да стакими ножками он и 50 не потянет. У меня на зарядке КАБЕЛЯ настоящие и то моменты есть когда прогреваются. А на подобную шибздню даже время тратить не охота.

другое дело ваш датчик шунта! , доверия больше так как он паралельно шунту висит!

а как насчет  LM358 или  LM358 ? просто в наличии в нашем свинарнике только это и есть

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Вам же показали, как включить внутренний усилитель в меге. Если хотите LM358 то схема включения с двумя резисторами есть везде в сети. Вам нужен неинвнртивуюший усилитель. Если опорное 1.1В, то усилиние нужно в 12раз примерно. Резисторы 10К и 120К будет 13 крат усиления.

maxvalin
Offline
Зарегистрирован: 22.02.2016

Согласен с вами, но у меня просадка на входе получается почему то. может из за схемы включения... Там же ограничения есть по току для АЦП? или я не прав?

di_mot
Offline
Зарегистрирован: 12.08.2016

maxvalin пишет:

....может из за схемы включения... Там же ограничения есть по току для АЦП? или я не прав?

А счему подключения и фрагмет кода "миливольт- измерителя" привести?

maxvalin
Offline
Зарегистрирован: 22.02.2016

да,да еще раз да! неправильно подключился! поменял местами на шунте провода, замеры пошли верно! Ну наполовину верно! Чего то все равно не хватает. Уж слижком цифры на амперметр бегут сильно быстро! на вольтметре нормально.

вот код для милливольт и вольт (для сравнения)

float Vin = (analogRead(A5) * 1.1) / 10.23; // вычисление ацп напряжение на А5
    VinOld=VinSmooth;   // приравнивание переменных друг другу
    VinSmooth=(3.0*VinOld+Vin)/4.0; // формула для усреднения показаний 
    lcd.setCursor(0, 0);
    lcd.print("VOLT=");  
    lcd.print(VinSmooth, 1); // вывожу усредненные показания для напряжения.
    float Uin = (analogRead(A10) *1.1/1023)/0.00075;
    UinOld=UinSmooth;
    UinSmooth=(6.0*UinOld+Uin)/7.0;
    lcd.setCursor(0, 1);
    lcd.print("AMPER=");
    lcd.print(UinSmooth,1);
    lcd.print("      ");

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

установил delay (300);

между 6 и 7 строкой, замеры амперов устаканились, пойду тэстить на зарядном)

спустя 15мин. :

замеры снимаются правильно, усреднение удовлетворително.

 

Следующий этам как из csv легко построить график, как правильно логировать данные чтоб строчки не путались при построении графика. (скурил, это проще простого оказалось.)

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

di_mot
Offline
Зарегистрирован: 12.08.2016

maxvalin пишет:

 Время имею не общее а с времени запуска лога.

А чем не устраивает millis() ?

nik182
Offline
Зарегистрирован: 04.05.2015

Ну так заводите переменную long Starttime, Присваете ей значение millis перед записью лога, а потом выводите время (millis()-Starttime) / 1000  - будет в секундах с начала лога

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

думал насчет millis , но пока что остановиля на этом, установка одного заряда где-то 6-7 часов, вроди как то что надо

}
ISR (TIMER1_OVF_vect) { 
sec++ ; //инкремент переменной каждую секунду
if (sec>59){sec=0; minut++; }
if (minut>59){minut=0; chas++; }
if (chas>23){chas=0;}
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

На таких временах отдельное прерывание это лишнее. millis() это и есть прерывание каждую милисекунду. Можно просто

uint8_t h,m,s;
uint32_t  starttime;

........

starttime=milis();

...........

timecToTime(millis()-starttime);

.........

void timecToTime (unsigned long t){
unsigned long tm=t / 60000L;
h= tm / 60;
m=tm%60;
s=(t/60000L)%60;
}

Соответственно после вызова timecToTime(millis()-starttime);  в переменных h,m,s будет время с начала лога.