|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.05
|
Objavljeno: Ned Mar 26, 2017 12:03 pm Naslov sporočila: |
|
|
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 |
|
|
beny1989 Član
Pridružen-a: Sob 26 Jan 2013 15:34 Prispevkov: 35 Aktiv.: 0.26 Kraj: Prevalje
|
Objavljeno: Ned Mar 26, 2017 7:42 pm Naslov sporočila: |
|
|
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 |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.05
|
Objavljeno: Ned Mar 26, 2017 9:59 pm Naslov sporočila: |
|
|
Lahko kupiš še 3 Arduinote ...
... a to še ne pomeni, da ne bom poskušal usposobiti programa, da bo deloval z enim
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 |
|
|
beny1989 Član
Pridružen-a: Sob 26 Jan 2013 15:34 Prispevkov: 35 Aktiv.: 0.26 Kraj: Prevalje
|
Objavljeno: Pon Mar 27, 2017 4:25 pm Naslov sporočila: |
|
|
https://www.youtube.com/watch?v=uyRqLXX67ZU&feature=youtu.be
Spet nekaj utripanja
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 |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.05
|
Objavljeno: Pet Mar 31, 2017 2:05 pm Naslov sporočila: |
|
|
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.
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 |
|
|
beny1989 Član
Pridružen-a: Sob 26 Jan 2013 15:34 Prispevkov: 35 Aktiv.: 0.26 Kraj: Prevalje
|
Objavljeno: Pon Apr 24, 2017 3:51 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 69 dni
Powered by phpBB © 2001, 2005 phpBB Group
|