www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Pomoč pri programiranju arduinota
Pojdi na stran Prejšnja  1, 2, 3
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.06

PrispevekObjavljeno: Ned Mar 26, 2017 12:03 pm    Naslov sporočila:   Odgovori s citatom

Daj v prekinitvi spremeni TCNT1 iz 65495 v 65455.
TCNT1 = 65455;

Začetni impulz bo sicer trajal dobre 3 ms in frekvenca PWM bo nižja, a to se lahko kasneje uredi.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
beny1989
Član
Član



Pridružen-a: Sob 26 Jan 2013 15:34
Prispevkov: 35
Aktiv.: 0.26
Kraj: Prevalje

PrispevekObjavljeno: Ned Mar 26, 2017 7:42 pm    Naslov sporočila:   Odgovori s citatom

Se vedno ni tako kot je treba pa mislim da ko aktiveram četrti par ledica na izhodi 2 utripne. Vedno bolj se nagibam da bi uporabil prvo kodo ki si mi jo poslal in imel za vsak injektor svoj arduino. Je preprosta dela in sam se znajdem v kodi da bi lahko popravlu peak in hold. Ko sem v zadnji kodi pomeril izhodni signal z osciloscopom je med PWM prihajalo do nekaksnih prekenitev itd
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.06

PrispevekObjavljeno: Ned Mar 26, 2017 9:59 pm    Naslov sporočila:   Odgovori s citatom

Lahko kupiš še 3 Arduinote ...
... a to še ne pomeni, da ne bom poskušal usposobiti programa, da bo deloval z enim Anxious


Vstavi celoten nov loop()
Koda:

void loop() {

TestValj1: // najhitrejša oblika zanke
//////////////////////////////////////////////////////////////////// VALJ 1
  if (digitalRead(pinIMP1) == LOW)  // Če je vhod aktiven ...
  {
    StanjeINJ1 = StanjeINJ1 | B00000001;  // ... je bit0 enak "1" ...
  }
  else
  {
    StanjeINJ1 = 0;  // ... sicer je celotna spremenljivka enaka 0.
    digitalWrite(pinINJ1, LOW); // izhod na "0"
    goto TestValj2; // Sploh ne preverja StanjeINJ1
  }
    switch (StanjeINJ1) // Samo LIHA stanja opravljajo nalogo, saj je takrat Bit0 enak "1".
    {
      case 5: // PWM 25 %
      {
        if((IzhodiMUX & B00000011) == B00000000) // Samo vsaka četrta prekinitev ga sme vklopiti, ostale 3 vklapljajo ostale 3 injektorje
        {
          digitalWrite(pinINJ1, HIGH); // izhod na "1"
        }
        else
        {
          digitalWrite(pinINJ1, LOW); // izhod na "0"
        }
      }
        break;
      case 3: // Čakanje 1320 us
      {
        if(IzhodiMUX1 == IzhodiMUX) // 33 prekinitev je minilo
        {
          StanjeINJ1 = 5; // Konec 1320 us, vklopi PWM
        }
      }
        break;
      case 1: //
      {
        digitalWrite(pinINJ1, HIGH); // izhod na "1"
        StanjeINJ1 = 3; // Vklopil je na "1", sedaj mora počakati 33 prekinitev (33*40=1320 us)
        IzhodiMUX1 = IzhodiMUX + 33; // Pripravi si "budilko" čez 33 prekinitev in počaka v novem stanju StanjeINJ1
      }
        break;
    }// switch
//////////////////////////////////////////////////////////////////// VALJ 1
TestValj2:
//////////////////////////////////////////////////////////////////// VALJ 2
  if (digitalRead(pinIMP2) == LOW)  // Če je vhod aktiven ...
  {
    StanjeINJ2 = StanjeINJ2 | B00000001;  // ... je bit0 enak "1" ...
  }
  else
  {
    StanjeINJ2 = 0;  // ... sicer je celotna spremenljivka enaka 0.
    digitalWrite(pinINJ2, LOW); // izhod na "0"
    goto TestValj3; // Sploh ne preverja StanjeINJ2
  }
    switch (StanjeINJ2) // Samo LIHA stanja opravljajo nalogo, saj je takrat Bit0 enak "1".
    {
      case 5: // PWM 25 %
      {
        if(((IzhodiMUX & B00000011) - 1) == B00000000) // Samo vsaka četrta prekinitev ga sme vklopiti, ostale 3 vklapljajo ostale 3 injektorje
        {
          digitalWrite(pinINJ2, HIGH); // izhod na "1"
        }
        else
        {
          digitalWrite(pinINJ2, LOW); // izhod na "0"
        }
      }
        break;
      case 3: // Čakanje 1320 us
      {
        if(IzhodiMUX2 == IzhodiMUX) // 33 prekinitev je minilo
        {
          StanjeINJ2 = 5; // Konec 1320 us, vklopi PWM
        }
      }
        break;
      case 1: //
      {
        digitalWrite(pinINJ2, HIGH); // izhod na "1"
        StanjeINJ2 = 3; // Vklopil je na "1", sedaj mora počakati 33 prekinitev (33*40=1320 us)
        IzhodiMUX2 = IzhodiMUX + 33; // Pripravi si "budilko" čez 33 prekinitev in počaka v novem stanju StanjeINJ2
      }
        break;
    }// switch
//////////////////////////////////////////////////////////////////// VALJ 2
TestValj3:
//////////////////////////////////////////////////////////////////// VALJ 3
  if (digitalRead(pinIMP3) == LOW)  // Če je vhod aktiven ...
  {
    StanjeINJ3 = StanjeINJ3 | B00000001;  // ... je bit0 enak "1" ...
  }
  else
  {
    StanjeINJ3 = 0;  // ... sicer je celotna spremenljivka enaka 0.
    digitalWrite(pinINJ3, LOW); // izhod na "0"
    goto TestValj4; // Sploh ne preverja StanjeINJ3
  }
    switch (StanjeINJ3) // Samo LIHA stanja opravljajo nalogo, saj je takrat Bit0 enak "1".
    {
      case 5: // PWM 25 %
      {
        if((IzhodiMUX & B00000011) == B00000010) // Samo vsaka četrta prekinitev ga sme vklopiti, ostale 3 vklapljajo ostale 3 injektorje
        {
          digitalWrite(pinINJ3, HIGH); // izhod na "1"
        }
        else
        {
          digitalWrite(pinINJ3, LOW); // izhod na "0"
        }
      }
        break;
      case 3: // Čakanje 1320 us
      {
        if(IzhodiMUX3 == IzhodiMUX) // 33 prekinitev je minilo
        {
          StanjeINJ3 = 5; // Konec 1320 us, vklopi PWM
        }
      }
        break;
      case 1: //
      {
        digitalWrite(pinINJ3, HIGH); // izhod na "1"
        StanjeINJ3 = 3; // Vklopil je na "1", sedaj mora počakati 33 prekinitev (33*40=1320 us)
        IzhodiMUX3 = IzhodiMUX + 33; // Pripravi si "budilko" čez 33 prekinitev in počaka v novem stanju StanjeINJ3
      }
        break;
    }// switch
//////////////////////////////////////////////////////////////////// VALJ 3
TestValj4:
//////////////////////////////////////////////////////////////////// VALJ 4
  if (digitalRead(pinIMP4) == LOW)  // Če je vhod aktiven ...
  {
    StanjeINJ4 = StanjeINJ4 | B00000001;  // ... je bit0 enak "1" ...
  }
  else
  {
    StanjeINJ4 = 0;  // ... sicer je celotna spremenljivka enaka 0.
    digitalWrite(pinINJ4, LOW); // izhod na "0"
    goto TestValj1; // Sploh ne preverja StanjeINJ4
  }
    switch (StanjeINJ4) // Samo LIHA stanja opravljajo nalogo, saj je takrat Bit0 enak "1".
    {
      case 5: // PWM 25 %
      {
        if((IzhodiMUX & B00000011) == B00000011) // Samo vsaka četrta prekinitev ga sme vklopiti, ostale 3 vklapljajo ostale 3 injektorje
        {
          digitalWrite(pinINJ4, HIGH); // izhod na "1"
        }
        else
        {
          digitalWrite(pinINJ4, LOW); // izhod na "0"
        }
      }
        break;
      case 3: // Čakanje 1320 us
      {
        if(IzhodiMUX4 == IzhodiMUX) // 33 prekinitev je minilo
        {
          StanjeINJ4 = 5; // Konec 1320 us, vklopi PWM
        }
      }
        break;
      case 1: //
      {
        digitalWrite(pinINJ4, HIGH); // izhod na "1"
        StanjeINJ4 = 3; // Vklopil je na "1", sedaj mora počakati 33 prekinitev (33*40=1320 us)
        IzhodiMUX4 = IzhodiMUX + 33; // Pripravi si "budilko" čez 33 prekinitev in počaka v novem stanju StanjeINJ4
      }
        break;
    }// switch
//////////////////////////////////////////////////////////////////// VALJ 4

  goto TestValj1; // najhitrejša oblika zanke
} // loop() 

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
beny1989
Član
Član



Pridružen-a: Sob 26 Jan 2013 15:34
Prispevkov: 35
Aktiv.: 0.26
Kraj: Prevalje

PrispevekObjavljeno: Pon Mar 27, 2017 4:25 pm    Naslov sporočila:   Odgovori s citatom

https://www.youtube.com/watch?v=uyRqLXX67ZU&feature=youtu.be
Spet nekaj utripanja Very Happy

Mi lahko se kdo razlozi katere podatke moram gledati za MOSFETe, napetost aktivacije izhoda hitrost itd in kako je kateri podatek označen.
Ali je IRFZ44N uporaben za takšne stvari?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.06

PrispevekObjavljeno: Pet Mar 31, 2017 2:05 pm    Naslov sporočila:   Odgovori s citatom

igo je napisal/a:
Daj v prekinitvi spremeni TCNT1 iz 65495 v 65455.
TCNT1 = 65455;

Začetni impulz bo sicer trajal dobre 3 ms in frekvenca PWM bo nižja, a to se lahko kasneje uredi.
Sem se malo zakopal v razloge, zakaj obe različici tako enostavnega programa ne delujeta po pričakovanjih. Think

V osnovi bi moralo biti vse v redu, samo prekinitev se očitno zgodi prehitro. V 40 korakih MCU komaj dobro spelje z mesta, pa mora že zavirati, zaradi nove prekinitve.

Naj bo v prekinitvi:
TCNT1 = 64895; // Naslednja prekinitev čez (65535 - 64895 = 640) x 1/16000000 = 40us


Popravi in preveri v obeh različicah. Z osciloskopom pomeri frekvenco utripanja ledic in oceni duty-cycle (če je 1/4 ali kaj bolj nepredvidljivega).

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
beny1989
Član
Član



Pridružen-a: Sob 26 Jan 2013 15:34
Prispevkov: 35
Aktiv.: 0.26
Kraj: Prevalje

PrispevekObjavljeno: Pon Apr 24, 2017 3:51 pm    Naslov sporočila:   Odgovori s citatom

Se opravicujem za dolgo tisino ampak sem trenutno ostav brez arduinota zato ni bilo kaj od mene upam da ga dobim v naslednih dneh in porocam situacijo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3
Stran 3 od 3

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 67 dni


Powered by phpBB © 2001, 2005 phpBB Group