(08-10-2017, 09:39 PM)Makso Wrote: Ja stalno razmišljam šta bih mogao odraditi, i odlučio sam da idem na remen koji će biti fiksan a na njemu šetati enkoder sa određenom remenicom.
I onda u jednom momentu proleti mi slika kroz glavu, da bih onda mogao tu i postaviti višeobrtni potenciometar sa remenicom od 10cm obima i tako da bih dobio 1000m na 10 krugova remenice a i potenciometar je sa 10 obrtaja, a ovde na makazama je hod manji od 1000mm, tu bih izbjegao sve probleme što me muče sa memorijom, ali opet neko je elegantnije i bolje i ozbiljnije riješenje sa enkoderom?
Naravno da može ako se zadovoljavaš tolerancijom takvih potenciometara.
Obično su oni koji spadaju među skupe i odlične, sa toleranciom od 0.5%.
Prevedeno to je greška od 5mm po metru i zavisi od temperature, vlage...
Na boljima piše i stabilnost linearnosti i to je obično lošija cifra od ove prve, što ti tek pravi problem u opsegu od tih 1000mm.
Čini mi se da nisi baš najbolje razumeo šta sam ti pisao.
Relativni (inkrementalni) enkoder je veoma lako očitavati bilo kojim pa i najprostijim MCU.
Teže je čitanje sve četiri ivice ali to ti nije neophodno za makaze sa dovoljnom rezolucijom od recimo 0.1mm (koju sa potenciometrom ni pomoću crtanog filma ne možeš postići). Biće savršeno dovoljno očitavanje jedne ivice i smera.
------------------------------------------------------
Sada pažljivo čitaj ovo što pišem jer ću ti saopštiti kompletan "recept" za takvo merenje sa delovima tipičnog koda u C jeziku. ("ovo govorim samo jedan put" - iz serije Alo, alo :- )
Već sam radio takve stvari i na abkant presama i na makazama.
Pošto nisi baš precizno opisao mehanizam koji pokreće vretena, dopustiću sebi da pretpostavim jedan od tipičnih mehanizama tog tipa kod Jeljšingrad makaza koje sam viđao.
Dakle: zavisno od starosti i tipa makaza, elektromotor sa reduktorom iz kog izlazi lančanik ili zupčasta remenica, na koju je spregnut ili lanac ili zupčasti kajiš sa relativnim španovanjem pomoću kog se može namestiti paralelnost graničnika, tj. faze oba vretena.
Motor je jednobrzinski kod najstarijih mašina, dvo ili tro-brzinski kod tipova srednje starosti, ili pogonjen frekventnim regulatorom kod novijih tipova.
Naravno u svim slučajevima je obezbeđena promena smera motora.
Kada je prisutan elektromotorni pogon, obavezno su prisutni i limit prekidači koji sprečavaju odlazak ose preko dozvoljenih granica, koje bi mogle zaglaviti ili oštetiti vretena. Dodaš još jedan blizu jednog od krajnjih, na strani koja ti odgovara i taj će ti biti "home".
1)
Prva i najbezbolnija solucija (osim možda ekonomskog dela te solucije, ali je to pitanje ako računaš i potrošeno vreme) je kupiti neki od "pametnih" brojača koji mogu čitati i skalirati inkrementalni enkoder. Takva solucija ti obezbeđuje završetak zadatog posla u okviru od nekoliko sati, jer se najviše svodi na mehaničko sprezanje inkrementalnog enkoder, malo vezivanja žica i programiranje gotovog "pametnog" brojača.
Na primer, možeš upotrebiti neki od Omronovih countera iz serije H7xx, od kojih većina ima mogućnost priključenja inkrementalnog enkodera, preskaler za kalibraciju mere u željenu skalu sa decimalnim mestom koje izabereš.
Naravno da imaju i reset input koji služi za nulovanje. Da ne kopam po Omron uputstvima, jednostavno se obratiš nekom od Omron zastupnika koji je najbliži tvom gradu i tražiš im brojač koji podržava inkrementalni enkoder. Njihov inženjering će ti odgovoriti odmah na zahtev i isporučiti odgovarajući brojač.
Takvih brojača ima i od drugih proizvođača svakako...
Ako izabereš taj put, onda na tu sajlu koja sada pokreće mehanički brojač spregneš spojnicom inkrementalni enkoder i potom ga priključiš na pametni brojač. Brojaču nakalibrišeš preskaler tako da za pređeni put od 1000mm pokaže na primer 1000,0 (rezolucija 0.1mm).
Inkrementalni enkoderi (čak i oni jevtini) bez problema podržavaju i do 6000 RPM tako da sigurno nećeš imati problema sa brzinom okretanja te sajle. "Pametni" brojači obično podržavaju do bar 10KHz impulsa na ulazima.
Naravno, ručnim okretanjem (delovanjem na ventilator tog motora u isključenom stanju, a kočnici dovedeš napon da ti oslobodi motor...) saznaš koliko krugova treba za 1mm ili slično tome, ili pogledaš koliko krugova okrene sajla za jedan milimetar ili neku drugu poznatu meru, tako što skineš taj mehanički i okrećeš ga ručno.
Onda izabereš enkoder koji nema preterano veći broj impulsa od potrebnog, da ti frekvencija ne pređe mogućnosti pametnog brojača.
Takvi brojači imaju i programabilne izlaze koje možeš podesiti na neku akciju kod postizanja željene mere...
2)
Ako upotrebiš svoj MCU sa displejem i nekim tvojim programom, onda je takođe lako čitati jednu ivicu enkodera, čim dobiješ onu rezoluciju koja piše na enkoderu, na primer 100 impulsa po krugu ako tako piše na njemu ili bilo koju drugu prema kupljenom enkoderu.
Potrebna ti je neka interrupt rutina koja je izazvana promenom stanja na nekom od pinova MCU koji su predisponirani za tu svrhu.
Evo ovako nešto bi ti to izgledalo u C jeziku:
Code:
#define scale_fact 1234 //neki faktor za skaliranje brojaca
#define ofs_counter 1234 //neki ofset koji ce da ti namesti pocetnu velicinu
long raw_count; //varijabla u kojoj se nalazi sirovo stanje tvog brojaca
long calcul_count; //varijabla u kojoj je izracunata vrednost brojaca za prikazivanje u potrebnoj velicini
void HW_interrupt_handler(void){
/* interrupt handler na promenu stanja nekog specijalizovanog pina koji je vezan na na primer A izlaz enkodera */
if(bit_dozvole_hw_isr && bit_dogadjaja){ //ako je odobren i dogodio se A input
if(B_input)raw_count--; //ako vec postoji B onda je smer ka umanjenju
else raw_count++; //inace je vec prvi bio A i to je povecanje
//ako ti treba suprotan smer brojanja, zameniti žice A i B
}
bit_dogadjaja=0; //pocisti bit dogadjaja da bi mogao opet da uhvatiš sledeci
}
void calculate_counter(void){
calcul_count = raw_count/ scale_fact;
}
void main(void){
//tvoj glavni porogram
//... potrebne inicijalizacije MCU i ostalo oko toga
while(1){ //beskonacna petlja gde se vrti tvoj program
calculate_counter(); //proracunaj izlaznu velicinu za LCD
lcd_present(calcul_count); //prikazi je
if(calcul_count > preset_value) uradi_nesto(); //neka akcija komparacije stanja u odnosu na zadatak
if(taster_nulovanja) nulovanje(); //neka operacija automatskog nulovanja na primer...
if(home_prekidac && Z_input){ //ako je nagazen home prekidac nuluj i dodaj ofset za pocetnu vrednost
raw_count=0; // pocisti sirovu vrednost
calc_count +=ofs_counter; /* unesi ofset a u sledecoj iteraciji ce funkcija za racunanje sadrzati tu vrednost
i ako je raw_count poceo od nule */
}
}
}
Evo to je neki jednostavan i linearan primer od koga možeš započeti.
Svakako da možeš u program uglaviti i dodatne operacije automatskog pozicioniranja na neke zadate vrednosti, posebno ako raspolažeš frekventnim regulatorom za pogon motora graničnika.
Onda pozicioniranje vršiš na primer dvojnim ili trojnim nagibom, gde ti kod približavanja željenoj veličini motor radi većom brzinom a kada je blizu malom i tačnije.
Može se spakovati i automatsko nulovanje prvi put i slično tome...
Nadam se da sam ti pomogao.
Pozdrav,
Macola
P.S.
Zaboravih:
Čitava operacija nulovanja ti se sastoji od toga da jednom "pregaziš" preko "home" prekidača a nulovanje će ti važiti dok je mašina pod napajanjem.