|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
dejko1 Član
Pridružen-a: Ned 16 Mar 2008 0:21 Prispevkov: 265 Aktiv.: 1.35 Kraj: Ljubljana
|
Objavljeno: Sre Nov 26, 2014 2:22 pm Naslov sporočila: |
|
|
OCR1B je potrebno nastavit pred TCCR. Pa tisto ( a > (b+1) || a < (b-1) ) spremeniš na vsaj ( a > (b+5) || a < (b-5) ). Bi pa moral probat zadevo, da bi lahko rekel kaj ti nagaja...
OCR registre bi se mogoče dalo spreminjat v interruptih (z nekaj pametne logike kdaj spreminjat), da se znebiš ustavljanja timerja.
|
|
Nazaj na vrh |
|
|
KlemenD Član
Pridružen-a: Sre 18 Maj 2011 15:08 Prispevkov: 188 Aktiv.: 1.19 Kraj: Maribor
|
Objavljeno: Sob Nov 29, 2014 1:57 pm Naslov sporočila: |
|
|
Zdravo,
vseeno kje nastavim ORC1B, napaka se ponovlja. Ali bi pomagalo, ce nalozim posnetek signala z osciloskopom kadar se obraca potenciometer ?
Lep pozdrav,
Klemen
|
|
Nazaj na vrh |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.04
|
Objavljeno: Sob Nov 29, 2014 2:34 pm Naslov sporočila: |
|
|
Ja pa ne moreš (beri: ne smeš) vsakič izvesti celotnega setup() z nastavitvami portov, timerjev in vsega ostalega.
Takrat signal na prvem izhodu začne s prvim impulzom 01, ne glede na trenutno stanje obeh izhodov 00, 01, 10, 11. Ti to opaziš kot premik faze, čeprav iz stališča MCU to ni. On samo začne znova.
Spremeni smo OCR1B
Koda: |
int a;
int b;
volatile int c;
void setup() {
TCCR1A=0;
TCCR1B=0;
PORTB=0x00;
DDRB=0x06;
ICR1=199;
OCR1A=0;
TCNT1=0;
TCCR1A=0x50;
TCCR1B=0x19;
OCR1B= c;
}
void loop() {
a = analogRead(0);
if( a > (b+1) || a < (b-1) )
{ //tole za silo popravi skakanje
c = round(a*(199/1023.0));
while (!TCNT1){} ; // Počakaš, da je TCNT1 enak 0
OCR1B= c; // nato spremeniš vrednost
b = a;
}
} |
_________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
|
KlemenD Član
Pridružen-a: Sre 18 Maj 2011 15:08 Prispevkov: 188 Aktiv.: 1.19 Kraj: Maribor
|
Objavljeno: Sob Nov 29, 2014 6:55 pm Naslov sporočila: |
|
|
Pozdravljen,
navedena koda še vedno ne popravi obračanja signala
Lep pozdrav,
Klemen
|
|
Nazaj na vrh |
|
|
KlemenD Član
Pridružen-a: Sre 18 Maj 2011 15:08 Prispevkov: 188 Aktiv.: 1.19 Kraj: Maribor
|
Objavljeno: Sob Nov 29, 2014 11:25 pm Naslov sporočila: |
|
|
igo a nebi potem delalo, če bi samo PORTB register pustil namiru, ko stvar resetiram ? Temu ni tako...koda še vedno ne deluje
Takole:
Koda: |
int a;
int b;
volatile int c;
volatile int i;
void setup() {
TCCR1A=0;
TCCR1B=0;
if( i == 0)˙{
PORTB=0x00;
i = 1;
}
DDRB=0x06;
ICR1=199;
OCR1A=0;
TCNT1=0;
TCCR1A=0x50;
TCCR1B=0x19;
OCR1B= c;
}
void loop() {
a = analogRead(0);
if( a > (b+1) || a < (b-1) ){ //tole za silo popravi skakanje
c = round(a*(199/1023.0));
setup();
b = a;
}
}
|
|
|
Nazaj na vrh |
|
|
dejko1 Član
Pridružen-a: Ned 16 Mar 2008 0:21 Prispevkov: 265 Aktiv.: 1.35 Kraj: Ljubljana
|
Objavljeno: Tor Dec 02, 2014 12:24 am Naslov sporočila: |
|
|
V bistvu PORT register ne vpliva na vrednost izhoda ki prihaja iz timerja. Da spremeniš vrednost pina moraš uporabit force compare match.
Evo koda ki bi mogla delovat:
Koda: |
void setup() {
PORTB=0x00;
DDRB=0x06;
ICR1=199;
OCR1A=100;
OCR1B=100;
TCNT1=0;
TCCR1A=0x50;
TCCR1B=0x19;
}
int j=0;
int a;
void loop() {
delay(100);
a = analogRead(0);
j = (a/3);
if(j>199) j=199;
TCCR1B=0x18;
if((PINB&0x02)!=00) TCCR1C=0x80;
if((PINB&0x04)!=00) TCCR1C=0x40;
TCNT1=0;
OCR1B = j;
if(j==0) TCCR1C=0x40;
TCCR1B=0x19;
} |
Nekaj več o kodi:
http://www.rei-labs.net/arduino-generating-two-fast-phase-offset-signals
Hehe, reševanje tuje domače naloge je lahko tudi izziv
|
|
Nazaj na vrh |
|
|
Jani Član
Pridružen-a: Ned 14 Dec 2003 22:48 Prispevkov: 460 Aktiv.: 2.06 Kraj: Bela krajina
|
Objavljeno: Ned Nov 13, 2016 12:11 pm Naslov sporočila: |
|
|
Pozdravljeni,
Na internetu sem našel PID regulacijo za spajkalnik z arduinom. Uspelo mi je spremeniti program do te mere, da regulacija začne delovati takoj, brez pritiska na tipko, želel bi pa še vključiti časovnik, ki bi regulacijo ugasnil po cca 3 urah. Regulacijo bi rad vključil spet za tri ure s pritiskom na katero koli tipko. Časovnik se mi zdi zelo uporaben, saj je včasih zgodi, da spajkalnik pozabim ugasniti
Ker pa se mi ne sanja kako, lepo prosim nekoga, ki to obvlada.
Sicer pa toplo priporočam to regulacijo, saj se (zaenkrat) zelo dobro obnese! Temperaturo drži stabilno na +/- 1 stopinjo.
Hvala za pomoč!
Link projekta
Opis: |
|
Download |
Ime datoteke: |
spajkalnik_start_280.zip |
Velikost datoteke: |
2.73 KB |
Downloadano: |
6 krat |
|
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.89 Kraj: Grosuplje
|
Objavljeno: Ned Nov 13, 2016 4:32 pm Naslov sporočila: |
|
|
Jani pozdravljen,
uporabi funkcijo millis(), ki šteje milisekunde od začetka izvajanja programa (ko Arduino zaštarta).
Npr:
Koda: |
unsigned long ShutDown; // Definiraš novo spremenljivko unsigned long tam kjer so ostale definicije, potem pa lahko daš v loop() ali funkcijo Buttons() test
ShutDown = millis();
if (ShutDown > 10800000){ //toliko milisekund je za 3 ure
fTset=0;
}
|
Če to dodaš v Buttons(), ki jo izvaja v Loop() bi potem izgledala funkcija Buttons() nekeko takole:
Koda: |
void Buttons() {
ShutDown = millis();
if (ShutDown > 10800000){ //toliko milisekund je za 3 ure
fTset=0;
}
if ((digitalRead(btnUp) == HIGH) && (digitalRead(btnDown) ==LOW )) {
fTSet = fTSet + 5.0 ;
if (fTSet > 380.0) { fTSet = 380.0 ; } //LIMIT to 380 degC
}
if ((digitalRead(btnUp) == LOW) && (digitalRead(btnDown) ==HIGH )) {
fTSet = fTSet - 5.0 ;
if (fTSet < 0.0) { fTSet = 0.0 ; } //LIMIT to 0
}
if ((digitalRead(btnUp) == HIGH) && (digitalRead(btnDown) ==HIGH )) {
iPID_or_OnOff++ ; //increment
if (iPID_or_OnOff > 1) { iPID_or_OnOff = 0; } //then reset it to 0
}
if (digitalRead(btnMode) == HIGH) {
fTSet = fTSet + 5.0;
if (fTSet < 150.0) {
fTSet = 150.0 ;
}
if ( (fTSet > 150.0) && (fTSet < 280.0 ) ) { fTSet = 280.0 ; }
if ( (fTSet > 280.0) && (fTSet < 320.0 ) ) { fTSet = 320.0 ; }
if ( (fTSet > 320.0) && (fTSet < 350.0 ) ) { fTSet = 350.0 ; }
if (fTSet > 350.0) { fTSet = 0.0 ; }
}
}
|
In ko se to zgodi, da ne kompliciramo s programom, moraš resetirati Arduina, kajti millis() pride zopet na nulo čez 50 dni.
Enostavno daš dodatno tipko za reset, ki ga imaš na zunanjih pinih Arduina.
Definicijo unsigned long ShutDown; daj pa nekam na začetek programa, tja kjer so že ostale definicije spremenljivk.
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
Jani Član
Pridružen-a: Ned 14 Dec 2003 22:48 Prispevkov: 460 Aktiv.: 2.06 Kraj: Bela krajina
|
|
Nazaj na vrh |
|
|
MadMax Član
Pridružen-a: Pet 09 Sep 2005 22:16 Prispevkov: 4743 Aktiv.: 21.27
|
Objavljeno: Ned Nov 13, 2016 7:03 pm Naslov sporočila: |
|
|
Na stojalo napelji eno žico, pa detektiraj kdaj je spajkalo odloženo.
|
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.89 Kraj: Grosuplje
|
Objavljeno: Ned Nov 13, 2016 8:01 pm Naslov sporočila: |
|
|
Jani je napisal/a: |
...Sicer dodatne tipke za reset ne morem dodati, saj imam ohišje že končano Me pa prav nič ne moti, če po pretečenem času enostavno pritisnem na tipko izklop in ponovni vklop... Konec koncev ni prav veliko dnevov v letu, ko bi spajkal več kot tri ure skupaj...... |
Ja, tudi ON/OFF je rešitev
Ker je ohišje zelo lično narejeno, bi lahko malo delil kako si vse skupaj naredil, posebno pa čelno ploščo.
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
Jani Član
Pridružen-a: Ned 14 Dec 2003 22:48 Prispevkov: 460 Aktiv.: 2.06 Kraj: Bela krajina
|
Objavljeno: Ned Nov 13, 2016 9:05 pm Naslov sporočila: |
|
|
Hvala za pohvalo So mi kar krilca narasla..
Čelno ploščo sem zrisal v programu Front designer. Program je že precej star, je pa zelo enostaven. Še posebej, če narediš tu pa tam kakšno čelno ploščo.
V osnovi je ohišje zelo enostavno, saj je sestavljeno iz 6 stranic in 8 veznih elementov. Na sliki se jih malce vidi. Stranice so iz 2,5mm aluminija. Vse stranice razen prve, sem skrtačil in polakiral s prozornim lakom. Čelna plošča je pobarvana z belim sprejem (2x), nato pa sem gor nalepil natisnjeno nalepko. Tri tipke (gre za mikro tipkice) sem na zadnjo stran nalepil z epoksijem, nato pa jih toliko pobrusil, da so gledale desetinko milimetra čez aluminij. To sem naredil seveda pred lepljenjem nalepke. Tipkice se obnašajo zelo podobno kot folijska tipkovnica. Za takšno izdelavo sem se odločil zgolj zaradi tega, ker nisem imel primernih stikal. Res pa je, da teh tipk ne bom pritiskal 23x na dan, ampak le občasno. Ta spajkalnik bo namreč le kot rezerva.
Opis: |
|
Download |
Ime datoteke: |
Nalepka za spajkalnik.pdf |
Velikost datoteke: |
20.15 KB |
Downloadano: |
13 krat |
|
|
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: 75 dni
Powered by phpBB © 2001, 2005 phpBB Group
|