Autolaturi mökille varavoimaksi Arduinon avulla

@ississ , tuossa parhaillaan yritän tuota R2-vastuksen vaihtamista. Pitää laittaa sen tilalle potikka, että löytää uuden arvon vastukselle. Mitähän kannattaa olla minimilähtöä säätäessä olla kytkettynä? Ilmeisesti shuntti voi olla pois, kunhan siis piirissä on virrat päällä ja mittaa lähtöä samaan aikaan.

EDIT: Vastusti vastuksen irrotuksen kanssa! Mutta onnistuin sen lopulta saamaan irti ja tilalle perus 10k potikka. En vielä katsonut vastusarvoja sen kummemmin, mutta nyt on niin, että nollan ampeerin testikuormalla näyttää 2,24 volttia. Nyt en ymmärrä: 8,4 ampeerin testikuormalla lähtö on 1,78 volttia. Onkohan lähtö käänteinen? Onhan se, mutta mitähän tapahtuu isommilla virroilla? Niitä minulla ei ennen laturia ole mahdollista tällä testata.

Testissä kortti oli kytketty 12 voltin virtalähteeseen ja sillä mitattiin 12 voltin testikuormaa. VOUT oli kytkemättä ja mittasin suoraan VOUT pinniltä tuo lähtöjännitteen.
 
Viimeksi muokattu:
@ississ , tuossa parhaillaan yritän tuota R2-vastuksen vaihtamista. Pitää laittaa sen tilalle potikka, että löytää uuden arvon vastukselle. Mitähän kannattaa olla minimilähtöä säätäessä olla kytkettynä? Ilmeisesti shuntti voi olla pois, kunhan siis piirissä on virrat päällä ja mittaa lähtöä samaan aikaan.

EDIT: Vastusti vastuksen irrotuksen kanssa! Mutta onnistuin sen lopulta saamaan irti ja tilalle perus 10k potikka. En vielä katsonut vastusarvoja sen kummemmin, mutta nyt on niin, että nollan ampeerin testikuormalla näyttää 2,24 volttia. Nyt en ymmärrä: 8,4 ampeerin testikuormalla lähtö on 1,78 volttia. Onkohan lähtö käänteinen? Onhan se, mutta mitähän tapahtuu isommilla virroilla? Niitä minulla ei ennen laturia ole mahdollista tällä testata.

Testissä kortti oli kytketty 12 voltin virtalähteeseen ja sillä mitattiin 12 voltin testikuormaa. VOUT oli kytkemättä ja mittasin suoraan VOUT pinniltä tuo lähtöjännitteen.

Minimilähtö pitää määrittää niin että syöttö = VIN+ = VIN- = korkein mahdollinen eli 15V
Sitten vastusarvoa säätämällä niin että lähtö juuri ja juuri nousee minimistä.

Tällaisessa on kätevää olla erillinen erotettu jännitelähde jolla voi syöttää VIN+ ja VIN- välille sopivan jännitteen (siis 0 - 30mV ilman mittavastusta) jolloin saa testattua koko alueen. Tuohon riittää vaikka 1 akku/patteri ja vastusjako trimmillä. Eli silloin syöttö ja VIN+ = 15V ja toisella saadaan VIN- mittauksen verran alemmas.
Jos toimii väärään suuntaan niin silloin VIN+ ja VIN- on todennäköisesti väärin päin.
 
@ississ , joo, turhaan panikoin tuossa aikaisemmin! Eli siis VIN+ ja VIN- päinvastoin, niin normaalisti alkoi toimia. Joo, tuo minimilähdön määritys tosiaan pitäisi varmasti tehdä korkeammalla jännitteellä, tuossa jos laturin säädin saa jostain syystä täydet työsuhteet, jännite on 16 V. Eli ehkä pitäisi syöttää opamp-piiriä semmoisella jännitteellä. Ei vain ole semmoista virtalähdettä tähän hätään. 16 V:n ja 12 V:n ero on 33 %.

Tässä kuitenkin testattuna 12 V:n jännitteellä, ja erittäin lineaarinen on kyllä tuo, kun säädin potikalla vastusta hieman lisää. Eka testi ei vielä ollut riittävän suurella vastuksella ylittääkseen minilähdön jännitteen, mikä näkyy kuvaajassa epälineaarisuutena. Vastus on mitattu potikasta, kun se on kytkettynä sammutettuun piiriin. Mittasin kyllä ennen alkuperäisen 1k:n vastuksen poistamista, niin 1k sain tulokseksi. Eli tässä piirissä vastuksen voinee mitata ainakin tuossa kohdassa oikein vaikka onkin kytkettynä piiriin. Lopulliseksi täytyy hakea joku vastus tai useampi rinnan tai sarjaan, jotta käyttöön saa mahdollisimman lähelle testattua olevan vastuksen.

Tuosta voisi arvata, että jakaisi lähdön niin, että huippuarvo on 12 voltissa 90 ampeerin virralla 4 volttia. Tämä tekisi, jos menisi lineaarisesti, vähän yli 5 volttia 16 voltissa, joka tuskin hajottaisi vielä Arduinoa ja 16 volttia on jo äärimmäisen epätodennäköinen skenaario.



Laturin apukortin virtamittaus testaus 15524.png
 
Viimeksi muokattu:
Tota tota en oo varma oonko kartalla mutta laturi ei voi ladata 12v 90A koska akku jännite tuskin koskaan on niin alhaalla, sen takia akkua ladataan 13, 8-14,4v jännitteellä että akkuun yleensä menee sähköä. Omasta mielestä pitäs mitottaa tolla 14,4v se maksimi lataus virta
 
@Nasty76 , no näinhän se on. Ei ole minunkaan mielestä mahdollista ladata tosiaan 12 voltin jännitteellä. Minulla ei kuitenkaan ole kummempaa virtalähdettä käytössä, joten täytynee pärjäillä 12 voltin virtalähteellä testeissä ja mitoituksissa.
 
Mites muuten tuo opampin käyttöjännite? Jos se olisi aina ja koko ajan sama, eikö tuo vahvistuksen säätö olisi silloin varmempi? Käsittääkseni nyt lähtö vaeltaa käyttöjännitteen mukaan, tai olen ymmärtänyt väärin.

Tuohon toki voisi ehkä miettiä sitä vakiojännitelähdettä, mutta yritän nyt ensin tätä jotenkin saada toimimaan.
 
Mites muuten tuo opampin käyttöjännite? Jos se olisi aina ja koko ajan sama, eikö tuo vahvistuksen säätö olisi silloin varmempi? Käsittääkseni nyt lähtö vaeltaa käyttöjännitteen mukaan, tai olen ymmärtänyt väärin.

Tuohon toki voisi ehkä miettiä sitä vakiojännitelähdettä, mutta yritän nyt ensin tätä jotenkin saada toimimaan.

Kyllä käyttöjännitekin yleensä vähän vaikuttaa mutta sisäisesti noissa on yleensä vakiovirrat joilla pelataan niin jännite ei hirveästi vaikuta.
Tulojen jännitetaso tietenkin koska sieltä on vastusjako maahan niin muuttaa tasoa. Eli ei välttämätön.

Kyllä se vähän vaeltaa, myös siksi että tulot on niin lähellä käyttöjännitettä ja on myös aika iso vahvistus. Mutta kuten sanottua sen voit hoitaa pois arduinossa kun mittaa myös käyttöjännitteen.

1.14k olisi samalla kertoimella kuin se jonka mittasin (2.5k/2.2k). eli ehkä 1.2k olisi hyvä. Lähtöön jännitejako niin että pysyy alle 5V.

Tuosta latauksesta, laturin jännitteen pitää tietysti aina olla suurempi kuin akun, muuten ei virta kulje oikeaan suuntaan. Jos jännite olisi tasan sama niin latausvirta = 0. Eli maksimilataus onnistuu vain jos akut ovat täysin tyhjät, muussa tapauksessa jännite-ero rajoittaa aina latausvirtaa.
Mitoitus sen mukaan mikä on akkujen maksimijännite ( + pieni marginaali on aina hyvästä).
Sen puoleen 15V olisi sopiva mitoitukseen koska sen yli jännite ei koskaan saisi nousta. Tuo aiemmin mainittu 14.4V on myös hyvä kohdearvo.
 
@ississ , joo laitoin tilalle nyt noin 1,18k vastuksen (kaksi sarjassa) ja minimilähtö (0 A) oli 2,02 V, 90 ampeerilla se olisi 4,42 volttia. Mitattu 12 voltilla. Tämä vastuksen muutos 1,18 kilo-ohmiin loivensi lineaarista käyrää.

Voi olla, etten ole ihan kartalla, mutta mielestäni opampi vahvistaa vain tulosignaalin. Kun latauksessa jännite lienee noin 14,5 volttia, mikä on opampin minimilähtö, tai varsinkin yläpään lähtö 90 ampeerin kohdalla silloin? Varmasti se ei selviä muuten kuin mittaamalla laitteiston käydessä, mutta vaikuttaako siis tuo jännite lähtöön merkittävästi? Jos ei vaikuta merkittävästi, jännitejakoa ei tarvita.

EDIT: Hyvin toimii myös Rduinoon liitettynä! Ainoa vaan, että virta-arvot on väärin (160 A nollassa). Ei onnistunut tyylillä

C++:
float currentFactor = 80.00 / (4.15 - 2.02);  // Adjusted for 2.02 volts = 0 amps and 4.15 volts = 80 amps
.

Vaan tässä pitää käyttää jotain muuta tapaa, oli se sitte map tai joku muu. Yritän tutkia tässä vaihtoehtoja.

Mutta suuret kiitokset taas @ississ ja @Nasty76 :kin! Vaikuttaa siltä, että tällä elektronisilta osin päästään taas eteenpäin. :thumbsup:


EDIT2: No joo. Tekoälyn avustuksella sain virran mittauksen toimimaan. Eli suoran yhtälö sovitettuna. Säätöä tarvii, kun 4,3 ampeerin virralla näyttää oikein, mutta 8,3 ampeerin virralla tulee 9,3 ampeeria. Suoran pisteitä pitää vähän rukata. Eli hienosäädön voi tehdä tuossa koodissa helposti nyt.

Koodissa monia kohtia kommentoitu, kun niitä ei ole säätövaiheessa tarvinnut.

BTW tälleen sisällä lämpimässä kokeiltuna Arduinon mittaama arvo heittelee keskimäärin jotain ± 0,2 ampeeria, ja välillä saattaa tulla hetkellinen yli ampeerinkin pomppua. Voi tosin johtua joistakin liitoksistakin, kun on tällä hetkellä tyyliin hässäkkä. Toki lopulliseen laitetaan kunnolla.

C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Create a new LiquidCrystal_I2C display object with the correct I2C address and display size

// Define the pins
const int currentPin = A0;             //information about current
const int voltagePin = A2;             //information about voltage
const int motorPin = 7;                //motor running pin, HIGH = motor running, TEST purpose LOW
const int pwmPin = 9;                  //PWM output pin
const int relayPin = 3;                //Relay control pin
float voltageFactor = 5.00 / 1023.00;  //Factor to convert ADC reading to voltage
// OLD: float currentFactor = 80.00 / (4.15 - 2.02);  // Adjusted for 2.02 volts = 0 amps and 4.15 volts = 80 amps

// NEW: Define the points for current calculation
float x1 = 2.02;    // volts
float y1 = 0;       // amps
float x2 = 4.1538;  // volts
float y2 = 80;      // amps
// Calculate the slope and intercept
float m = (y2 - y1) / (x2 - x1);
float b = y1 - m * x1;

float currentCal = 0.97; // Variable to shift th whole current level

float sensVfactor = 20.00 / 4.9248;  //4.9248 volts = 20 volts, factor to convert high voltage to 0-5 V
float current;                       //store current value
float sensVoltage;                   //store sensed voltage
const int N = 25;                    //number of current readings to average
const int Y = 25;                    //number of sensed voltage readings to average
int readings[N];                     //array to store the current readings
int readingsV[Y];                    //array to store the sensed voltage readings
int motorStatus;                     //0=stopped, 1=starting, 2=running, 3=stopped but did run, on status 3, just switch off and on again to go back 0
int lcdStep;                         //0=current display, 1=voltage display
unsigned long lastTime = 0;          //timer to measure engine sensor input time for starting




void setup() {

  Serial.begin(9600);  // Start the serial communication

  // Initialize the LCD here
  // Give the screen time to boot
  delay(200);
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();

  // Change timers on pins to change PWM freq to 122 Hz
  // Pins D9 and D10 - 122 Hz
  TCCR1A = 0b00000001;  // 8bit
  TCCR1B = 0b00000100;  // x256 phase correct

  // Make pins output/input
  pinMode(currentPin, INPUT);       //Information on charging current
  pinMode(voltagePin, INPUT);       //information on voltage, for real use, delete _PULLUP
  pinMode(motorPin, INPUT_PULLUP);  //Vibration sensor in, for motor running detect,  for real use, delete _PULLUP (it is for test purpose, pullup resistor)
  pinMode(pwmPin, OUTPUT);          //Charger pwm output
  pinMode(relayPin, OUTPUT);        //Ignition relay pin

  // Start Duty Cycle at 5 %
  analogWrite(pwmPin, 13);
}


void motorRunning() {  //engine running function
  if (digitalRead(motorPin) == HIGH && motorStatus == 0) {

    if (millis() - lastTime >= 6000) {  //wait at least 6 seconds before ramping up pwn and so start charging

      motorStatus = 1;
    }

  } else if (motorStatus == 0) {
    lastTime = millis();

    lcd.setCursor(0, 0);  //On lcd print Finnish to start the engine
    lcd.print("K");
    lcd.print((char)0xe1);
    lcd.print("ynnist");
    lcd.print((char)0xe1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print("moottori");
  }
}


void rampUp() {  //rampup pwm

  // Ramp pwm up
  if (motorStatus == 1) {

    analogWrite(pwmPin, 48);
    delay(1000);
    analogWrite(pwmPin, 83);
    delay(1000);
    analogWrite(pwmPin, 118);
    delay(1000);
    analogWrite(pwmPin, 153);  //Duty Cycle at 60 percent

    motorStatus = 2;
  }
}


//void shutDown() {  //engine shutdown, execute relay
// If the charging current drops below five amperes
// start the shutdown function and turn off the relay for 15 seconds
// if (current < 5 && motorStatus == 2) {
//digitalWrite(relayPin, LOW);
//lcd.clear();
//lcd.setCursor(0, 0);
//lcd.print("Sammutus");


//motorStatus = 3;

// } else {
// digitalWrite(relayPin, HIGH);  //else, keep relay on
//}
//}


void showCurrent() {  //show current and voltage on lcd only when normal running state


  if (motorStatus == 2) {

    lcd.setCursor(0, 0);
    lcd.print("Virta:");
    lcd.setCursor(0, 1);
    lcd.print((float)current);
    lcd.print(" ");
    lcd.setCursor(5, 1);
    lcd.print(" A");

    lcd.setCursor(8, 0);
    lcd.print("J");
    lcd.print((char)0xe1);
    lcd.print("nnite:");
    lcd.setCursor(8, 1);
    lcd.print((float)sensVoltage);
    lcd.print(" ");
    lcd.setCursor(13, 1);
    lcd.print(" V");
  }
}




void loop() {


  //calculate current from shunt reading
  // Calculate the charging current from the average and display it on the LCD screen.
  // take N readings and store them in the array
  for (int i = 0; i < N; i++) {
    readings[i] = analogRead(currentPin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sum = 0;
  for (int i = 0; i < N; i++) {
    sum += readings[i];
  }
  float average = sum / N;

  float voltage = average * voltageFactor;  //  Convert ADC reading to voltage

  //OLD
  //current = voltage * currentFactor;  // Convert voltage to current

  //NEW
  current = (m * voltage + b) * currentCal;  // Convert voltage to current using the new linear equation


  //calculate high voltage from voltage divider input
  // Calculate the charging voltage from the average and display it on the LCD screen.
  // take Y readings and store them in the array
  for (int j = 0; j < Y; j++) {
    readingsV[j] = analogRead(voltagePin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sumV = 0;
  for (int j = 0; j < Y; j++) {
    sumV += readingsV[j];
  }
  float averageV = sumV / Y;

  float voltageV = averageV * voltageFactor;  //  Convert ADC reading to voltage

  sensVoltage = voltageV * sensVfactor;  // Convert voltage to real voltage







  motorRunning();
  rampUp();
  //shutDown();
  showCurrent();
  Serial.print("Lcdstep: ");
  Serial.print((int)lcdStep);
  Serial.println();
  Serial.print("Jannite: ");
  Serial.print((float)sensVoltage);
  Serial.println();
  Serial.print("Virta: ");
  Serial.print((float)current);
  Serial.println();
}
 
Viimeksi muokattu:
Voi olla, etten ole ihan kartalla, mutta mielestäni opampi vahvistaa vain tulosignaalin. Kun latauksessa jännite lienee noin 14,5 volttia, mikä on opampin minimilähtö, tai varsinkin yläpään lähtö 90 ampeerin kohdalla silloin? Varmasti se ei selviä muuten kuin mittaamalla laitteiston käydessä, mutta vaikuttaako siis tuo jännite lähtöön merkittävästi? Jos ei vaikuta merkittävästi, jännitejakoa ei tarvita.

Tällaisessa "vakio" tilanteessa opari pyrkii pitämään tulojen eron nollassa.

Nyt kytkennässä on yksi vastusjako joka asettaa toiseen tuloon tietyn jännitteen.
Toisessa tulossa on myös vastusjako mitattavasta kohteesta lähtöön.
Eli lähtö pyrkii sellaiseen jännitteeseen jossa tulojen ero on 0.

Jos on perusvahvistin
1715794616509.png


Ajatellaan niin että tässä tulosignaali olisi R3 päässä ja in+ kytketään maahan. Piirille 2- puoleinen syöttö.
Jos R3 in = 0 -> lähtö = 0 -> in- = 0. (Tai jos yksipuoleinen syöttö niin in+ = VCC/2 jolloin "nollatilanteessa" lähtökin on VCC/2)

Vastuksilla määrätään vahvistus. Nyt jos tulosignaalia nostetaan se pyrkii nostamaan in- jännitettä jolloin opari laskee lähtöä niin paljon että in ero on taas 0.
Toisaalta jos tulosignaali pysyy nollassa mutta säädetäänkin in+ tulon jännitettä niin lähdön taso muuttuu myös.

Differentiaalivahvistimessa molemmissa on vastusjako yhtä aikaa jolloin vahvistetaan ero (molemmat nousee saman verran, in+ ja in- ero pysyy nollassa -> lähtö ei muutu). Jos toinen haara on erilainen kuin toinen niin molempien signaalien nousu saman verran vaikuttaa lähtöön.
Myös jos oparin lähdön jännitealue ei riitä (suuri vahvistus, lähdöt lähellä ylä- tai alarajaa) tapahtuu tuo leikkaantuminen kuten huomattiin. Sen voi tietyissä rajoissa kiertää muuttamalla toisen haaran vahvistusta (eli sitä vastusjakoa). Toisena vaihtoehtona olisi jännitealueen muutos eli suurempi/pienempi käyttäjännite nollan suhteen tai vahvistuksen pienentäminen jolloin tarvitaan useampi vahvistin peräkkäin.

Oikea differentiaali olisi tällainen, eli kummallakin tulolla on oma vahvistin joiden vahvistus on sama (määritetään R ja Re avulla). Tärkeää tässä on se että molemmat toimivat samalla tavalla ja siksi Re on yhteinen vahvistinten välissä eikä maassa/muussa jännitteessä ja "virtuaalinen nolla" kelluu jossain Re alueella tuloista riippuen.
Ja näiden perään differentiaali jonka vahvistus on 1 (kaikki 4 vastusta saman kokoisia).
1715794994548.png




Yksinkertainen nollan asetus pitää tehdä ennen kertomista (tai sen jälkeen) eli
virta = ( luettu adc arvo - nollakohta ) * kertoimet;
tai
virta = ( luettu adc arvo * kertoimet ) - nollakohta;

Erona näissä on vain se kumpaa vähennetään, raakaa adc mittausarvoa vai laskettua virtaa. Mutta kertoimen sisälle nollakohdan hävitystä ei voi laittaa.

Nuo häiriöt voi johtua monestakin syystä, yksi on johdotus ja toinen itse adc ja mitä muuta hommaa piirillä silloin on. Hyvä että sait toimimaan.
 
@ississ , kiitokset vaivannäöstä! Pitää tutustua näihin.

On kätevää olla erillinen erotettu jännitelähde jolla voi syöttää VIN+ ja VIN- välille sopivan jännitteen (siis 0 - 30mV ilman mittavastusta) jolloin saa testattua koko alueen. Tuohon riittää vaikka 1 akku/patteri ja vastusjako trimmillä. Eli silloin syöttö ja VIN+ = 15V ja toisella saadaan VIN- mittauksen verran alemmas.
Jos toimii väärään suuntaan niin silloin VIN+ ja VIN- on todennäköisesti väärin päin.

Mitähän kämmäsin, kun en saanut toimimaan? Onko VIN+ jännitteen oltava sama tai suurempi kuin piirin käyttöjännitteen? En nimittäin saanut toimimaan 1,5 voltin virtalähteestä jännite laskettuna 32 millivolttiin. Opampin lähtö oli minimissä (noin 1,5 V) kun shuntti kytkettynä se on 0 ampeerin virralla 2,02 volttia.

Tulisiko akkujännite olla VIN+ ja VIN- olisi 32 millivolttia pienempi? (32 mV siis vastaa 80 A).
 
@ississ , kiitokset vaivannäöstä! Pitää tutustua näihin.



Mitähän kämmäsin, kun en saanut toimimaan? Onko VIN+ jännitteen oltava sama tai suurempi kuin piirin käyttöjännitteen? En nimittäin saanut toimimaan 1,5 voltin virtalähteestä jännite laskettuna 32 millivolttiin. Opampin lähtö oli minimissä (noin 1,5 V) kun shuntti kytkettynä se on 0 ampeerin virralla 2,02 volttia.

Tulisiko akkujännite olla VIN+ ja VIN- olisi 32 millivolttia pienempi? (32 mV siis vastaa 80 A).
Kumpikaan tulo (piirin jalassa) ei saisi yleesä ylittää käyttöjännitettä.
Eli toinen vin samaan kuin käyttöjännite ja toiseen se 0...32mV mitattava jännite.
Myös kaikki 3 samassa pitäisi antaa minimilähdön.
Tässä se jännite joka päätyy oparin + tuloon pitää olla tuloista isompi.
 
@ississ , joo, eli vika saattoi olla siinä, että kytkin miinuksen VIN- napaan ja plussan VIN+ napaan. Eli vetäisin +12 V VIN- napaan ja +32 mV VIN+ napaan? Ilmeisesti vetäisin millivolttivirtalähteen miinuksen yksinkertaisesti maahan?
 
@ississ , joo, eli vika saattoi olla siinä, että kytkin miinuksen VIN- napaan ja plussan VIN+ napaan. Eli vetäisin +12 V VIN- napaan ja +32 mV VIN+ napaan? Ilmeisesti vetäisin millivolttivirtalähteen miinuksen yksinkertaisesti maahan?
Näkemättä kytkentää voi vaan arvata...
 
@ississ, Niin siis tarkoitin nyt uutta testausta varten uutta kytkentää, mikäli oikein olen ymmärtänyt. Nyt kun luin uudestaan tuon edellisen viestini, niin siitä saakin sen käsityksen, että olisin kuvannut sitä kytkentää joka ei toiminut. Vain ensimmäinen lause koski sitä aikaisempaa testiä.

EDIT: No joo. Kokeilin uudemman kerran tuota millivolttitestiä. Saan aivan oikein ulkoisesta virtalähteestä jännitteenjakajan kautta 32 mV ulos. Syötän tämän +32 mV VIN+ napaan ja miinuksen maahan. Sitten kytken akkuplussan normaalisti kortin käyttöjännitteeksi sekä nyt VIN- napaan. Akkumiinuksen kytken normaalisti maahan. Opampi VOUT on tällöin akkujännite! En uskalla kytkeä Arduinoon virtoja tai edes liittää VOUT-johtoa siihen. Joku tässä nyt mättää, jota en tajua. Joskus aikaisemmin kyllä sain toimimaan testaamalla samalla tyylillä, mutta nyt on joku ongelma.

Ymmärrän, että VIN+ ja VIN- ero pitää olla käytännössä simuloitaessa 80 ampeerin virtaan, jos jännite olisi tasan 12 V, niin 12,000 V ja 11,968 V. Eikö sen näin pitäisi mennä?
 
Viimeksi muokattu:
@Uutta matoa koukkuun , joo tuo on tosi hyvä. Miksihän noita ei saa Suomesta kohtuuhintaan, tai ylipäätään? Kun tässä ei ole aikaa kolme kuukautta odotella tilausten saapumista ja vaatinee silti jonkinnäköisen vahvistimen väliin.

EDIT: Jos kiinanpojan speksit pitää paikkansa, ei tämmöiseen tarvitsisi mitään vahvistinta: 5.49€ 75% OFF|WCS1600 WCS1700 WCS1800 3 5V Hall Current Sensor Adjustable DC 100A 70A 35A Short Over Current Detector Protection Module| | - AliExpress

Jos laskeskellaan että, käyttäisimme Rduinon sisäistä 1100 mV:n referenssiä (en tiedä miten se tapahtuu), niin saisimme siitä 1100 / 1023 ~ 1,08 mV/porras ja tuo sensori olisi 20 mV/A jolloin ~ 1,08 mV / porras / 20 mv/A ~ 0,05 A. Eli riittäisi tarkkuudeltaan paremmin kuin hyvin, siis jos kiinanpojan tiedot pitäisi paikkansa. Ja voi olla, ettei tuo oikeasti kestä kuin 30 ampeeria jatkuvaa virtaa. :p
 
Viimeksi muokattu:
Joo. Ei se vaan ota onnistuakseen tuo testin tekeminen. Nyt sain sentään opampin lähdön seuraamaan millivolttivirtalähdettä. Testi siis onnistui jotenkin. Yllätyksekseni, kun millivoltit olivat noin 120, oli vasta silloin lähtö yli 2 volttia. Kuten aiemmin kerroin, kun systeemi on kytkettynä shunttiin ja käyttöjännite otetaan shuntin akun puoleiselta karvalta, silloinhan se minimi on se 2,02 volttia ja lähtee nousemaan lineaarisesti virran mukaan. Mutta tämä ulkoisella virtalähteellä tehtävä millivolttitesti nyt ei vaan onnistu, lähtö alkaa nousta vasta reilusti korkeammalla millivolttitulolla.
 
Viimeksi muokattu:
Hetkinen eikös tollasta shuntin häviöitä mitata kummaltakin puolelta shunttia eikä maatavasten, vai ymmärsinkö väärin taas jotain käsittääkseni shuntin yli jäävää hitu virtaa pitäisi mitata eli jännite häviöitä siitä shuntin kummaltakin puolelta
 
Koska ei jaksa piirtää niin käytetään Texasin valmista kuvaa
1715973587890.png


Tämä on siis oikea kytkentä. Ja silloin kun testataan jännitelähteellä niin kuorma otetaan pois ja kelluva jännitelähde laitetaan Rshunt tilalle jolloin vahvistin näkee tulot kuten oikeassakin kytkennässä.
Kaikki muut tavat ovat enemmän tai vähemmän väärin.
 
@ississ , kyllä. Tuo se tapa, jolla ensiksi tein tuon testin ja siis eilen se onnistui. Tai siis "onnistui". Kuten sanottua, vaadittiin yli 120 millivolttia, että opampin lähtö nousi yli 2 voltin, joka on shunttikytkennässä vasta minimi. Pitää vielä kerran kokeilla, ja jos ei onnistu, täytyy kai nostaa kädet pystyyn. :(

EDIT: Joo, ei toimi tuo testi. Vaadittiin yli 140 mV, jotta lähtö nousi yli kahteen volttiin. Nyt myös Rduinossa oli virrat, ja ampeerinäyttö vaelteli -5 ja 40 ampeerin välillä! Huom.! Lähtöjännite pysyi kuitenkin vakaana. Jääkö tässä muuta vaihtoehto, kuin testi lopullisessa muodossaan. Eli akku tyhjänä ja laturi käyttöön, kortilta VOUT-piuha irti varmuudeksi ja mittaa lähdön maksimilatausvirralla?

EDIT2: Tein varmuudeksi toisenkin testin. Otin koko apukortin irti pöydälle. Arvot muuttuivat, mutta tämäkään ei valitettavasti auta simuloimaan shunttia. Nyt noin 90 millivoltin tulo vaadittiin 2,02 voltin lähtöön. Sinänsähän piirissä ei selvästikään ole mitään ongelmaa, koska se seuraa tuloa. Mutta ihme, kun lähtö nollan kohdalla nousee reilusti, ja rajusti pienempi tulo riittää, kun koko järjestelmä kasataan.


Olisihan se ollut hyvä testata ensin koko alue, mutta ei näytä onnistuvan. :(
 
Viimeksi muokattu:
@ississ , kyllä. Tuo se tapa, jolla ensiksi tein tuon testin ja siis eilen se onnistui. Tai siis "onnistui". Kuten sanottua, vaadittiin yli 120 millivolttia, että opampin lähtö nousi yli 2 voltin, joka on shunttikytkennässä vasta minimi. Pitää vielä kerran kokeilla, ja jos ei onnistu, täytyy kai nostaa kädet pystyyn. :(

EDIT: Joo, ei toimi tuo testi. Vaadittiin yli 140 mV, jotta lähtö nousi yli kahteen volttiin. Nyt myös Rduinossa oli virrat, ja ampeerinäyttö vaelteli -5 ja 40 ampeerin välillä! Huom.! Lähtöjännite pysyi kuitenkin vakaana. Jääkö tässä muuta vaihtoehto, kuin testi lopullisessa muodossaan. Eli akku tyhjänä ja laturi käyttöön, kortilta VOUT-piuha irti varmuudeksi ja mittaa lähdön maksimilatausvirralla?

EDIT2: Tein varmuudeksi toisenkin testin. Otin koko apukortin irti pöydälle. Arvot muuttuivat, mutta tämäkään ei valitettavasti auta simuloimaan shunttia. Nyt noin 90 millivoltin tulo vaadittiin 2,02 voltin lähtöön. Sinänsähän piirissä ei selvästikään ole mitään ongelmaa, koska se seuraa tuloa. Mutta ihme, kun lähtö nollan kohdalla nousee reilusti, ja rajusti pienempi tulo riittää, kun koko järjestelmä kasataan.


Olisihan se ollut hyvä testata ensin koko alue, mutta ei näytä onnistuvan. :(

Sanoisin että jos se ei toimi tuolla testillä niin todennäköisesti ei oikeastikaan. Voi tietysti olla käyttöjänniteriippuvainen mutta sekään ei ole hyvä.
 
Herätelläänkö tätäkin ketjua taas henkiin. :)

Pelkään, ettei tuo virranmittaus tule tuommoisenaan toimimaan, kuten @ississ aiemmin on kertonut. Joten hankkisin jo valmiiksi virtasensorin tätä varten.

Laskenko oikein, että tällä pääsisi suurin piirtein 0,2 ampeerin tarkkuuteen Arduinolla (200 A malli)? Ja siis 1 ampeerin tarkkuus riittää tähän.


Mun laskulla avr mittaa 5000mV / 1024 = 4.88mV/askel.
Anturi antaa 10mV/A eli noin 0.5A jää erottelutarkkuudeksi.
 
Herätelläänkö tätäkin ketjua taas henkiin. :)

Pelkään, ettei tuo virranmittaus tule tuommoisenaan toimimaan, kuten @ississ aiemmin on kertonut. Joten hankkisin jo valmiiksi virtasensorin tätä varten.

Laskenko oikein, että tällä pääsisi suurin piirtein 0,2 ampeerin tarkkuuteen Arduinolla (200 A malli)? Ja siis 1 ampeerin tarkkuus riittää tähän.


Mun laskulla avr mittaa 5000mV / 1024 = 4.88mV/askel.
Anturi antaa 10mV/A eli noin 0.5A jää erottelutarkkuudeksi.
 
@ississ , miten tuossa tuo vout 0,5 nollan ampeerin kohdalla vaikuttaa? Oonko ihan ulapalla, että tuo pienentää aluetta jo 500 mV? Tuo anturi on käsittääkseni kaksisuuntainen, eli olisiko käyttökelpoinen alue silloin vain 2000 mV?

Lämpötilan minimi on tuolla anturilla -20 astetta, mutta eipä se sen matalampi tarvi olla. Ei varmaan tule yhtään kertaa käyttöä alle -20 asteen pakkasessa.
 
Jos ulkomailta tilailee tavaraa niin osta ad1115 tms joka 16bit ad muunin sillä sais 5000mv/65548 tms sillä sais noin 0,07mv tarkkuuden
 
@ississ , miten tuossa tuo vout 0,5 nollan ampeerin kohdalla vaikuttaa? Oonko ihan ulapalla, että tuo pienentää aluetta jo 500 mV? Tuo anturi on käsittääkseni kaksisuuntainen, eli olisiko käyttökelpoinen alue silloin vain 2000 mV?

Lämpötilan minimi on tuolla anturilla -20 astetta, mutta eipä se sen matalampi tarvi olla. Ei varmaan tule yhtään kertaa käyttöä alle -20 asteen pakkasessa.

Datalehden mukaan laskennallisesti 0A = 1/2 Vcc eli 2.5V ja siitä 10mV/A eli 0.5A = +5mV -> 2.5V + 5mV = 2.505V
Ja tuohon sitten avr adc tarkkuus ja muut mittaheitot +- päälle.
Käyttökelpoinen alue on se jolla avr pystyy mittaamaan, eli ei ihan 0-5V vaasn hiukan pienempi. Joka tapauksessa kun anturi on 2- suuntainen niin vain puolet adc alueesta on käytössä.
Ja kyllä, koska anturi on speksattu 200A (ja 10mV/A) niin sen max lähtö on vain 2V max virralla, siis absoluuttisena 4.5V

Tarkempaan pääsee vain tarkemmalla ad- muuntimella tai 1- suuntaisella anturilla jossa on suurempi mV/A lähtö.
 
@ississ , ymmärin melkein viestisi. ;)

Mutta joo, harmi kun on kaksisuuntainen, ja isompi harmi, että ei näytä tuota saavan juuri mistään...

Pitäisi yrittää jostain nyt löytää bolt-on virta-anturi, tai että lähtö siis on riittävän suuri. Tuommoinen 10 mV/A riittää jo ihan varmasti, kun se olisi teoriassa noin 0,5 ampeerin luokkaa erottelultaan Arduinoon liitettynä.
 
@ississ , no joo, olinkin tuon nähnyt. Onkohan noita valmiina piirikortilla? Tuossahan on ainakin suodatuskonkka ja sitten kiinnitysreiät jne..

Tuntuu siltä, että Alista saa noita valmiina, mutta ihme kun ei lähempää.

Tuokin näyttää muuten olevan kaksisuuntainen. Jos oon ymmärtänyt oikein, niin se yksisuuntainen olisi tässä parempi, kun ei tarvi "miinusampeereja" mitata. Saadaan koko alue käyttöön.
 
Tässähän se on: Pololu - ACS72981KLRATR-150U5 Current Sensor Large Carrier 0A to 150A, 5V

Tätä saa myös Suomesta, mutta tuossa taitaa tulla haasteeksi lämmöntuotto. Kun tuo pitäisi asentaa kuitenkin suljettuun, pieneen kytkentärasiaan ja tuossa tulisi jo yli 60 A:n jatkuvalla virralla kiinnittää erikoishuomiota lämmönhallintaan. Tulisi pyrkiä välttämään nyt kaikkea lisärakentelua, joten pitäisi kartoittaa muita vaihtoehtoja, jotka eivät lämpenisi merkittävästi, mutteivät tarvitsisi mitään lisäpiiriä, vaan voisi liittää suoraan Arduinoon. Tämä moduulihan se olisi muuten suorastaan täydellinen.

Edit: tulisi siis löytää jokin viranmittaukseen soveltuva valmismoduuli, mutta mikäli kuitenkin on niin ettei sellaista löydy, niin tuo kai se täytyy sitten hankkia. Kun puhutaan tavanomaisesta muovisesta, noin 12 cm x 12 cm sään kestävästä kytkentärasiasta, lämmön hallitsemiseksi tulee heti mieleen leikata pellistä sopivan kokoinen ja muotoinen kappale, jonka voisi vetää muutamalla ruuvilla kiinni siten että pellin alapääty on sopiva piirin pintaan laitettavaksi lämpötahnan avulla. Jos olen aivan oikein ymmärtänyt, tuossa piirissä lämmön tuotos tulee vastuksesta, joka on siis 0,2 mOhm, laskujeni mukaan se tekee 80 A:n virralla noin 1,2 W. Kovin valtaisesta lämmöntuotannosta siis ei puhuta, mutta kun se tulee pieneen pisteeseen, niin helpostihan siinä piiri voi kärvähtää, jos lämmöntuotantoa ei ole huomioitu.
 
Viimeksi muokattu:
Onkohan muunlaista bolt-on anturia olemassa? Tuo Pololun anturi tuottaa yli 60 A:n virralla jo sen verran lämpöä, joten pienimmän vaivan tie olisikin löytää jokin anturi, joka ei tuota niin paljon lämpöä.

Ainoa vaatimus tosiaan varmaan, että vähintään noin 10 mV/A olisi lähtö. :)
 
Noin mitätöntä lämmittämistä ei tarvii ottaa huomioon millään tavalla. Lämpö johtuu pois jo kaapeleita pitkin eikä anturi tunnu kädenlämpöistä kuumemmalta.
 
Onkohan muunlaista bolt-on anturia olemassa? Tuo Pololun anturi tuottaa yli 60 A:n virralla jo sen verran lämpöä, joten pienimmän vaivan tie olisikin löytää jokin anturi, joka ei tuota niin paljon lämpöä.

Ainoa vaatimus tosiaan varmaan, että vähintään noin 10 mV/A olisi lähtö. :)
En ole valitettavasti perehtynyt tähän ketjuun, mutta päätin postata silti... Jos haluat jonkun shunttiin perustuvan virtamittauksen, eikö sen voisi ottaa kenttämagnetoinnin puolelta? Kentän puolella virta liikkuu jossain 1-8A ja korreloi latausvirtaan.
 
@Toinen nimimerkki , onpa jännä ajatus! Onko kyseessä siis eri asia kuin magnetointivirta, joka on luokkaa 5 A silloin, kun laturi ei pyöri, mutta on kytkettynä akkuun?

@Uutta matoa koukkuun , valmistaja varoittaa, että yli 60 ampeerin jatkuvalla virralla lämpötilaa tulisi peräti seurata ja kiinnittää huomiota lämpenemiseen. Eli ehkä tuota anturia käyttäessä olisi hyvä jonkinlainen siili olla. Toki siis mielellään joku muu anturi.
 
@Toinen nimimerkki , onpa jännä ajatus! Onko kyseessä siis eri asia kuin magnetointivirta, joka on luokkaa 5 A silloin, kun laturi ei pyöri, mutta on kytkettynä akkuun?

@Uutta matoa koukkuun , valmistaja varoittaa, että yli 60 ampeerin jatkuvalla virralla lämpötilaa tulisi peräti seurata ja kiinnittää huomiota lämpenemiseen. Eli ehkä tuota anturia käyttäessä olisi hyvä jonkinlainen siili olla. Toki siis mielellään joku muu anturi.

Juu sama magnetointivirta, eli toinen hiilien johtimista poikki ja siihen väliin. Voi tietty olla haastavaa jos jänniteensäädin on hiiliharjassa kiinni ja käytät alkuperäistä säätäjää sellaisenaan. Ja tosiaan, kun laturi ei lataa, kenttä on tapissa, eli pitäisi ohjelmoida ehto, että jos laturi ei pyöri, virta on nolla.

Hall-anturi on toinen vaihtoehto, eli vaikka joku TO92 koteloinen sopivalle etäisyydelle virrallisesta johtimesta. Kenttää voi tehostaa kiepauttamalla latausjohtoa muutaman kierroksen pultin ympärille ja mittaa kenttää pultin kannasta. Tai jokin valmis anturi josta vain sujautetaan johto läpi.

Köyhän miehen shunttina varmaan voisi käyttää myös nykyistä latausjohtoa mittaamalla jännitettä sen yli. Tässä tietysti ympäristön lämpötila hieman tuo epätarkuutta ja varsinkin jos latausjohto mitoitukseltaan kuumenee latausvirran vaikutuksesta
 
Viimeksi muokattu:
Jaaha. Otin paketin taas pitkästä aikaa käyttöön ja nyt ei tuo PWM:n muoto ilman 12 V:n piiriä näytä oikealta. Taajuus on oikein, samoin pulssisuhde, mutta muoto ja jännite (noin 8 V) ei. En tiedä, mistä johtuu. Yleismittarilla ei löydy nyt jännitettä, joka toisaalta lieneenki ihan ok.

DSC_1324.jpg


Tarkoitus oli tehdä testi, saako lataussäätimen nollattua (ettei magnetoisi ennen kuin moottori käy) ajamalla 100 %:n pulssisuhdetta ja sen jälkeen vetää nolliin ennen kuin moottori käy. Lähden nyt tekemään ko. kytkentää, jos se kuitenkin toimisi, kun koko asetelma on kytketty. En ihan kaikkia johtoja Arduinon ja apukortin välistä jaksanut lähteä purkamaan, joten niillä voinee olla vaikutusta tuohon outoon PWM:ään.

Voihan se olla, ettei tuota lataussäädintä ns. saa nollattua. Jospa onkin niin, että autossakin tuo pulssijohto on täysin signaaliton ja vasta kunnes moottori käy, siihen tulee mitään. Nythän on joka tapauksessa niin, että vaikka johtoon ei Arduinolla ajaisi mitään, niin silti oskilloskoopilla havaitsee loivaa signaalia siitä, joka ehkä lataussäätimessä aiheuttaa jo magnetoinnin. Ihan mutuilua tämä on vaan, kun varsinkin puhutaan nyt vain Arduinoista eikä 12 voltin PWM-piiristä, joka menee laturille. No mutta joka tapauksessa voi olla, että joutuu sen toisen releen laittamaan tuolle pulssijohdolle, jotta laturia ei magnetoitaisi heti, kun järjestelmään kytketään virrat. Sähkömagneetti ottaa kuitenkin noin 5 ampeeria virtaa, joten se lämpenee siinä, jos moottoria ei saa kohtuu ajassa käyntiin. Lisäksi se vastustaa moottorin käynnistymistä.

Pakko vielä pohtia tätä lisää. Silloin muinoin, kuin ei edes Arduinoa hommaan mietitty vaan eläteltiin toiveita, että tuon laturin saisi edes toimimaan ilman mitään ohjausta, kytkettiin siihen pulssijohtoon +12 V akusta ja mitään ei tapahtunut. Eli käsittääksenihän tuo on periaatteessa 100 % PWM, joka siis ei laukaissut magnetointia. Tästä siis tuli mieleheeni, jos lataussäätimen saisi ikäänkuin nollille ennen käynnistystä, jolloin lisää releitä ei tarvisi alkaa ähräämään.
 
Ite olen tehnyt jokusen generaattorin auton latureista. Jos jännittensäädin on ollut joku väyläohjattu tai takavuosien prässätty relepurkki, niin kokonaan pois vaan ja hiilien päähän oma transistorin alvasvetokytkentä tms patentti, joka työntää roottoriin 12V aina kun staattorin jännite on alle 14,4.

Silloin on saanut helpolla magnetoinnin pois käynnistyksen ajaksi esimerkiksi kierrosnopeutta seuraamalla ja samalla estänyt alimitoitetun poltto(tai kaura)moottorin tukehtumisen ylikuormatilanteessa.
 
Jos sulla on siinä jo pwm ohjaus eikös sen saa 12v kun ajaa käynnistyksessä 100% pwmää laturille. Kelluuku muuten tuo pwm linja kun siellä ei ole signaalia voisiko käynnistyvä laturi aiheuttaa kelluvaan pwm linjaan häiriöitä joka laittaa laturin lataamaan.ainakin microkontrollereissa kelluvat linjat on myrkkyä ja input vaihtaa jatkuvasti tilaa häiriöistä johtuen
 
@Nasty76 , joo tuota just oon tekemässäkin, että ensin PWM 100 % ja sitten 0.

Mut, jos ei tällä saa toimimaan, niin laitetaan PWM-johtoon rele. :(
 
Se olisi kuulkaas poikaat siinä siltä osin! Eli laturin säädin toimii niin, että suoralla viivalla (pwm 100 %), tai tasasähköllä sähkömagneetti ei aktivoidu. Eli emme tarvitse sitä toista relettä. Ohjelman alussa ja lopussa (sammutusfunktio) on tuo "urku auki" pwm, joka siis pitää laturin löysänä.

Koodi ei siis ole mikään hieno edelleenkään vaan lähinnä copy-paste sekamelska ja lähinnä kosmeettisia muutoksia olen siihen tehnyt. Pääasia, että se toimii riittävän hyvin. Sammutus on kommentoituna, jotta koodia on helpompi testailla ilman sammutuksen käynnistymistä.

Suuri osa kunniasta kuuluu @Nasty76 :lle, @ississ :lle, ja muille jotka ovat auttaneet hommaa jo tähän mennessä tavattoman paljon eteenpäin. Kiitos, että olette edelleenkin kiinnostuneita tästä sähellyksestä.

C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Create a new LiquidCrystal_I2C display object with the correct I2C address and display size

// Define the pins
const int currentPin = A0;             //information about current
const int voltagePin = A2;             //information about voltage
const int motorPin = 7;                //motor running pin, HIGH = motor running, TEST purpose LOW
const int pwmPin = 9;                  //PWM output pin
const int relayPin = 3;                //Relay control pin
float voltageFactor = 5.00 / 1023.00;  //Factor to convert ADC reading to voltage
// OLD: float currentFactor = 80.00 / (4.15 - 2.02);  // Adjusted for 2.02 volts = 0 amps and 4.15 volts = 80 amps

// NEW: Define the points for current calculation / the line equation
float x1 = 2.02;    // volts
float y1 = 0;       // amps
float x2 = 4.1538;  // volts
float y2 = 80;      // amps
// Calculate the slope and intercept
float m = (y2 - y1) / (x2 - x1);
float b = y1 - m * x1;

float currentCal = 1;  // Variable to shift th whole current level

float sensVfactor = 20.00 / 4.9248;  //4.9248 volts = 20 volts, factor to convert high voltage to 0-5 V
float current;                       //store current value
float sensVoltage;                   //store sensed voltage
const int N = 25;                    //number of current readings to average
const int Y = 25;                    //number of sensed voltage readings to average
int readings[N];                     //array to store the current readings
int readingsV[Y];                    //array to store the sensed voltage readings
int motorStatus;                     //0=stopped, 1=starting, 2=running, 3=stopped but did run, on status 3, just switch off and on again to go back 0
int lcdStep;                         //0=current display, 1=voltage display
unsigned long lastTime = 0;          //timer to measure engine sensor input time for starting




void setup() {

  Serial.begin(9600);  // Start the serial communication

  // Initialize the LCD here
  // Give the screen time to boot
  delay(50);
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();

  // Change timers on pins to change PWM freq to 122 Hz
  // Pins D9 and D10 - 122 Hz
  TCCR1A = 0b00000001;  // 8bit
  TCCR1B = 0b00000100;  // x256 phase correct

  // Make pins output/input
  pinMode(currentPin, INPUT);       //Information on charging current
  pinMode(voltagePin, INPUT);       //information on voltage, for real use, delete _PULLUP
  pinMode(motorPin, INPUT_PULLUP);  //Vibration sensor in, for motor running detect,  for real use, delete _PULLUP (it is for test purpose, pullup resistor)
  pinMode(pwmPin, OUTPUT);          //Alternator pwm output
  pinMode(relayPin, OUTPUT);        //Ignition relay pin

  // Start Duty Cycle at 100 %, alternator electromagnet off
  analogWrite(pwmPin, 255);
}


void motorRunning() {  //engine running function
  if (digitalRead(motorPin) == HIGH && motorStatus == 0) {

    if (millis() - lastTime >= 6000) {  //wait at least 6 seconds before ramping up pwn and so start charging

      motorStatus = 1;
    }

  } else if (motorStatus == 0) {
    lastTime = millis();

    lcd.setCursor(0, 0);  //On lcd print Finnish to start the engine
    lcd.print("K");
    lcd.print((char)0xe1);
    lcd.print("ynnist");
    lcd.print((char)0xe1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print("moottori");
  }
}


void rampUp() {  //rampup pwm

  // Ramp pwm up
  if (motorStatus == 1) {

    analogWrite(pwmPin, 48);
    delay(1000);
    analogWrite(pwmPin, 83);
    delay(1000);
    analogWrite(pwmPin, 118);
    delay(1000);
    analogWrite(pwmPin, 153);  //Duty Cycle at 60 percent

    motorStatus = 2;
  }
}


//void shutDown() {  //engine shutdown, execute relay
// If the charging current drops below five amperes
// start the shutdown function and turn off the relay for 15 seconds

// if (current < 5 && motorStatus == 2) {
// digitalWrite(relayPin, LOW);
// Stop Duty Cycle at 100 %, alternator electromagnet off
// analogWrite(pwmPin, 255);

//lcd.clear();
//lcd.setCursor(0, 0);
//lcd.print("Sammutus");


//motorStatus = 3;

// } else {
// digitalWrite(relayPin, HIGH);  //else, keep relay on
//}
//}


void showCurrent() {  //show current and voltage on lcd only when normal running state


  if (motorStatus == 2) {

    lcd.setCursor(0, 0);
    lcd.print("Virta:");
    lcd.setCursor(0, 1);
    lcd.print((float)current);
    lcd.print(" ");
    lcd.setCursor(5, 1);
    lcd.print(" A");

    lcd.setCursor(8, 0);
    lcd.print("J");
    lcd.print((char)0xe1);
    lcd.print("nnite:");
    lcd.setCursor(8, 1);
    lcd.print((float)sensVoltage);
    lcd.print(" ");
    lcd.setCursor(13, 1);
    lcd.print(" V");
  }
}




void loop() {


  //calculate current from shunt reading
  // Calculate the charging current from the average and display it on the LCD screen.
  // take N readings and store them in the array
  for (int i = 0; i < N; i++) {
    readings[i] = analogRead(currentPin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sum = 0;
  for (int i = 0; i < N; i++) {
    sum += readings[i];
  }
  float average = sum / N;

  float voltage = average * voltageFactor;  //  Convert ADC reading to voltage

  //OLD
  //current = voltage * currentFactor;  // Convert voltage to current

  //NEW
  current = (m * voltage + b) * currentCal;  // Convert voltage to current using the new linear equation


  //calculate high voltage from voltage divider input
  // Calculate the charging voltage from the average and display it on the LCD screen.
  // take Y readings and store them in the array
  for (int j = 0; j < Y; j++) {
    readingsV[j] = analogRead(voltagePin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sumV = 0;
  for (int j = 0; j < Y; j++) {
    sumV += readingsV[j];
  }
  float averageV = sumV / Y;

  float voltageV = averageV * voltageFactor;  //  Convert ADC reading to voltage

  sensVoltage = voltageV * sensVfactor;  // Convert voltage to real voltage


  motorRunning();
  rampUp();
  //shutDown();
  showCurrent();
  Serial.print("Lcdstep: ");
  Serial.print((int)lcdStep);
  Serial.println();
  Serial.print("Jannite: ");
  Serial.print((float)sensVoltage);
  Serial.println();
  Serial.print("Virta: ");
  Serial.print((float)current);
  Serial.println();
}
 
No ni seuraava harjotus korvata delayt silleen että otetaan aika ja ajetaan esim 1000ms jälkeen seuraava toiminto ettei Arduino odottele tyhjää ja voisi laskea muita hommia.tuota delay ei pitäisi juuri missään käyttää kun sen aikaa Arduino ei tee missään mitään vaan odottaa siinä delay kohdalla
 
@Nasty76 , no huonohan tuota on käyttää, mutta eipä sitä muutakaan osaa. On se tuo koodaaminen ja piirikortin suunnittelu kyllä vaikein asia, mitä koskaan olen harjoitellut. Ei voi kuin hattua nostaa niille, jotka asiasta jotain ymmärtävät, esim. @ississ. Biisien teko ja soitteleminen lastenleikkejä, vaikka niissäkään en todellakaan mikään mestari ole, vaan ainoastaan hel*etin hyvä. ;)

Mutta tuskinpa juuri tässä nimenomaisessa koodissa tuota delayn käyttämisestä mitään haittaa on.
 
Viimeksi muokattu:
Juu ei ole haittaa tuollaisessa mutta jos innostusta riittää ja tulevissa projekteissa voisi olla hyötyä.ps nytkö toimii kaikki kuten haluat?
 
@Nasty76 , no huonohan tuota on käyttää, mutta eipä sitä muutakaan osaa. On se tuo koodaaminen ja piirikortin suunnittelu kyllä vaikein asia, mitä koskaan olen harjoitellut. Ei voi kuin hattua nostaa niille, jotka asiasta jotain ymmärtävät, esim. @ississ. Biisien teko ja soitteleminen lastenleikkejä, vaikka niissäkään en todellakaan mikään mestari ole, vaan ainoastaan hel*etin hyvä. ;)

Mutta tuskinpa juuri tässä nimenomaisessa koodissa tuota delayn käyttämisestä mitään haittaa on.

Muistaakseni tein jossain välissä sen yhden koodiesimerkkiversion ilman odotuksia, siitä voi ottaa mallia.

Delayn ongelma on esimerkiksi rampup() sisällä olevat odotukset. Käytännössä kun ollaan käynnistysrampissa niin mitään muuta ei tehdä koko rampin keston aikana.
Yleensä olisi ehkä samalla hyvä myös mitata virtaa/jännitettä jos vaikka menee yli rajojen jo rampin aikana.
Tässä tapauksessa sillä ei varmaan oikeasti ole väliä mutta idea varmaan selvisi.

Minä nostan hattua soittajille, se on jotain jota en ole koskaan osannut millään tasolla. Vain sen verran että pääsin joskus kauan sitten koulun musiikista läpi...
 
@ississ, joo. Käsittääkseni tuossa on tuo jännitteen säätö sellainen, että se on jänniteasetus, eli laturin säädin pitää sen automaattisesti siinä eikä sitä tarvitsisi jatkuvasti ohjata. Mutta sehän varmistuu sitten, kun saadaan laturi pyörimään ja akkua lataamaan.
 

Uusimmat viestit

Statistiikka

Viestiketjuista
261 751
Viestejä
4 545 864
Jäsenet
74 840
Uusin jäsen
jousam

Hinta.fi

Back
Ylös Bottom