Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino - tutorijali, pitanja, primjeri i projekti
Izvinjavam se, greska, sta sam ja pisao, nije push-pull izlaz nego totem-pole, shvatili ste nasta mislim.
Da, verovatno je to sve uzrok zbog napona saturacije donjeg tranzistora koji pri manjim naponima tj strujama kroz njega ima veci Vcesat.
Stavicu 680R pull-down za te linije kao sto je Macola predlozio, to je oko 7mA po liniji, valjda nije mnogo ...
Reply
Vidi kakva je situacija sa visim naponom napajanja, pa stavi razdelnik napona da prilagodis, ako ti to resava posao. Takodje, pogledaj strujne karakteristike izlaza tog enkodera.
Reply
Da li bi mozda bolja varijanta bila da stavim redno dve antiparalelne brze Si diode i "oduzmem" tih spornih 0.6V?
Reply
Stavi samo jednu i pull down posle nje da povuce ulaz na nulu kada ti enkoder daje nulu. Kada je jedinica onda ces na ulazu imati napon umanjen zacpad napona da toj diodi.
Reply
Hmm onda ispada da je mozda neko idealno resenje za ovaj slucaj kombinacija dioda i otpornika.
Ne svidja mi se varijanta da imam visoku ulaznu impedansu u MAX za jednu polovinu tog totem-pole izlaza, pogorsava se imunost na smetnje tako da dolazimo do varijante da se posle izlaza ipak stavi bilo pull-up ili pull-down da drzi nisku impedansu a iza toga staviti jednu redno Schotky diodu i onda sam ispostovao sve uslove Wink
Reply
Nemas visoku impedansu. Totem-pole uvek ima definisano stanje na izlazu. Izlaz enkodera ide na diodu, a posle diode pull-down otpornik. On ti na ulazu u MAX obezbedjuje uvek logicku nulu kada nema enkodera. Postavi 1k i nema sanse neka smetnja da ti preko diode aktivira ulaz. Nike bas higijenski da na totem-pole postavljas pull-up/down, posto je njegov izlaz uvek definisan, ukoliko nije bus-driver, pa postoji i stanje visoke impedanse.
Reply
Ali nije mi onda "terminiran" enkoder za oba logicka stanja nego samo za jedno, to mi malo bode oci, mozda je nebitno ali kad ga vec resavam da resim to kako treba.
Reply
Pa ne treba terminacija za enkoder, kada daje stabilno stanje na izlazu. Terminacija je za dugacke linije na velikim brzinama. Sa tim pull-down imas stabilno stanje (0) na ulazu u max kada nema enkodera. Trebao bi ti otpornik da imas pnp ili npn izlaz. Ovako ne. Uvek ce da ti daje 0 ili 1 na izlazu. Nema tri-state kod njega.
Reply
Terminacija ti treba ako je duzika voda veca od tri talasne duzine pri datoj brzini komunikacije. Ona se radi samo na pocetnom i krajnjem segmentu. To znaci da i na enkoderu treba da radis terminaciju, a nemas velike frek i duzine. Kod diferencijalne komunikacije je stvar drugacija od ovoga. Ovde nema terminacija. Samo imas stabilno stanje na ulazu koje ti daje enkoder, a ako nema enkodera, pull-down ti obezbedjuje stabilno stanje. Totem-pole na izlazu ima dva tranzistora. Moze biti ukljucen jedan ili drugi. Nema nedefinisanog stanja. Diodom si sprecio onih 0.6V da ti daje lazno stanje, a sa pull-down imas definisanu nulu, posto tada dioda ne provodi. Kada je na izlazu enkodera 1 onda ce na ulazu da bude napon (na pull-down) otporniku koje jednak naponu na izlazu enkodera minus pad napona na direktno polarisanoj diodi. Znaci uvek imas stabilno stanje.
Reply
Zavrsio sam sastavljenje prototip plocice, evo kako je ispalo to sve.
LCD se tera preko RS232 (ukupno 4 zice, napajanje i RX/TX, ostale su visak), beli kabal je od RS485 mreze i vidi se i USB adapter, crni kabal je od enkodera, crvenim kablom je povezan Black Magic Probe - programator/debuger.
To je celo HW razvojno okruzenje (3 x STM32F103) ...

HW radi odlicno, nemam ni jednu zamerku trenutno. SW je u razvoju ...

BTW: posto me uzasno nerviraju ove zice od enkodera i mreze koje se kace na kleme, napravio sam "kuciste konektora" od raster PCB i na njih zaletovao PIN letvice i napravio "konektor" i to zastitio termo buzirom. Unutra su postavljeni i terminatori + mehanicko ucvrscenje kabla. Dakle koriste se pin letvice sa 2.54 rasterom sto se uklapa u raster klema (vodite racuna da ima tih klema i sa drugim rasterom), koristi se svaki drugi pin.
To je ispalo odlicno za ove potrebe razvoja gde cesto moram to vise puta sve da zakacim/raskacim pa da nosim na sto gde mi je lemilica i alat ako trebam neku intervenciju da odradim.


Attached Files Thumbnail(s)

Reply
Koji ti je ovo USB adapter?
Reply
To je USB<>RS485 adapter sa CH340 chipsetom, uzeo kod "alice1101983" naseg proverenog prodavca ; )
http://www.ebay.com/itm/311589494672
Reply
Testirao sam enkoder, radi kao zmaj.

Code:
const byte interruptA = 2;
const byte interruptB = 3;
int puls;

void setup() {
 pinMode(interruptA, INPUT_PULLUP);
 pinMode(interruptB, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(interruptA), enkoderA, RISING);
 attachInterrupt(digitalPinToInterrupt(interruptB), enkoderB, RISING);
 Serial.begin(9600);
}

void loop() {
 Serial.println(puls);
}

void enkoderA() {
 if(digitalRead(3) == LOW) {
   puls++;
}
 else {
   puls--;
 }
}
void enkoderB(){
 if(digitalRead(2) == LOW) {
   puls--;
}
 else {
   puls++;
 }
}
Ovo je sada u kvadratnom modu, ako sam upravu, jer na krug imam 800 pulsa, da li je moguće da se spusti na 400 pulsa bez dodatne matematike?
Reply
Za pola u drugoj funkciji izbaci ++/--, ostavi funkciju i definiciju pina.
Reply
Inace znas kako to tek lepo radi kada tu brojacku funkciju radi Timer modul na STM32 u pravom enkoder modu, postoji slicna funkcija koja samo broji cele krugove a ovo ++/-- za impulse radi hardware na osnovu kretanja enkodera, veoma precizno i brzo to radi, ne moze da omasi i to brzine preko nekoliko MHz.
Kod SW implementacije sa interaptima na pinovima moze u nekom trenutku doci do zagusenja procesora ako se impulsi desavaju mnogo cesto, zavisi od brzine procesora i latence izmedju spoljneg interapta i funkcije koja radi ++/-- i onda ne moze puno stvari u pozadini da se radi koje su potrebne za neku logiku rada cele masine i kontrolera.
Kod HW implementacije u sustini nema interapta kada se dobijaju impulsi sa enkodera, interni HW tajmer to broji i zna da li je napred ili nazad sto je divna mogucnost i postoji interupt rutina koja se desava kada brojac odbroji jedan ceo krug (overflow) sto je daleko sporiji dogadjaj koji treba da se obradjuje i ne tako cesto kao sto su impulsi od enkodera kojih moze da bude bas dosta ako se recimo koristi 8000 impulsa po krugu i sve to se vrti sa recimo 1000RPM, pa izracunaj...
Za ove interapte (za krugove ili impulse) se dodeljuje najveci prioritet u programu dok svi ostali imaju nizi i tako se drzi stvar pod kontrolom, brojanje impulsa i pracenje/preracunavanje pozicije je osnovni zadatak koji radi na takvim spravama, sve ostalo se doraduje i pravi po potrebi, KBD, LCD, FRAM, 232, 485 i tako dalje, sve to moze da stane u kontroler kada se ovo sa impulsima rascisti da radi HW.
Poterao sam to prvo bio na Arduino sa STM32, posle sam prepisao to na bare-metal sa svojim bibliotekama i to radi ko zmaaaajjj, sve mi radi u "multitaskingu" sa DMA kontrolerima i 64bit SW tajmerima Smile
Reply
Nije lose da se spomene da za Arduino i u ovom slucaju enkoder kod kojih je u 'igri' veca brzina ocitavanja da se znatno ubrzava ocitavanje datog pina ako se umesto digitalRead() funkcije korist bitRead() funkcija.
Evo i zanimljivog linka gde je to testirano...
Reply
Mislim da je to za mikija banalna stvar, ali za mene korisna informacija.
Nema dodatnih linija koda ako se koristi bitRead() umjesto digitalRead(), tj. samo se zamjeni to dvoje?

@mikikg
Probao sam ono kako si naveo gore da u drugoj funkciji obrišem samo puls++/--, to radi, valjda neću imati problema sa brzinom čitanja pulsa, nadam se, jer će uz taj enkoder biti vezan LCD (preko I2C) i jedan relej i senzor za nuliranje (po Macolinom savjetu)?

Ne vezano za ovo, jedan stariji majstor mi je rekao da memoriju riješava sa 1.5V baterijom i koja se mjenja na godišnjem nivou, kakav je to način pamćenja podataka, kako to radi?
Reply
(09-22-2017, 08:59 PM)Makso Wrote: Mislim da je to za mikija banalna stvar, ali za mene korisna informacija.
Nema dodatnih linija koda ako se koristi bitRead() umjesto digitalRead(), tj. samo se zamjeni to dvoje?

[Image: nanopdf_by_pighixxx-d7thgif.png]

Iz slike se vidi pinout za Nano. U tvom slucaju posto koristis digital pin 2 i 3 onda bi ti komanda bila slicna jer ti digitalni pinovi pripadaju PORT-u D i to istim redosledom 2 i 3.
Znaci da bi if(digitalRead(2) == HIGH) zamenio komandom if(bitRead(PORTD,2))

Ovo sa bitRead() funkcijom sam informativno spomenu sto ne znaci da je tebi kod tvog resenja to potrebno.....
Reply
Kako se riješava ispisivanje broja na display-u, npr. kada ide brojanje od 0 pa do 100, i sada kad vratim nazad na 99 na display-u ostane 990, tj. kako se briše treća cifra, isto tako kada se sa 10 vrati na 9 ostane 90 na display-u?
Reply
Uspio sam nekako, ali i dalje mi nije jasno kao to radi?

Ispod lcd.prin(a); sam dodao samo lcd.print(" "); i to sada radi kako treba ali nije mi ništa jasno?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)