Sari la conținut
ELFORUM - Forumul electronistilor

Adaptare driver la controller UC100


Incepator92

Postări Recomandate

Buna ziua si sarbatori fericite.

Am achizitionat un controller UC100 si un breakout board avand deja driverele si motoarele recuperate din altceva.

Am zis, de ce sa nu le folosesc pentru contruirea unui cnc ? dar, m-am lovit de urmatoarea problema.

Driverele pe care le am eu functioneaza cu pulse,dir dar pentru a schimba sensul de rotatie pe dir, trebuie aplicat acelasi semnal pe

care il aplici pe pulse altfel nu merge, am zis ca acest lucru se rezolva simplu cu un 4066.

O alta problema consta in faptul ca controlerul UC100 furnizeaza pe iesirile de pulse un semnal dreptunghiular cu factor de umplere foarte mic aprox 10% iar driverul pe care il am se asteapta cam la 50% motiv pentru care merge cam sacadat probabil impulsurile fiind scurte, pe o parte din acestea nu le interpreteaza. Cum as putea transforma semnalul furnizat de UC100 intr-un semnal dreptunghiular cu factor de umplere 50% sau macar sa mai latesc un pic frontul pozitiv ? Am pus mai jos datasheetul driverului pe care il am deja :

http://berger-positec.at/files/d550_gb.pdf

 

Link spre comentariu
  • Răspunsuri 4
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Salut!

 

O alta problema consta in faptul ca controlerul UC100 furnizeaza pe iesirile de pulse un semnal dreptunghiular cu factor de umplere foarte mic aprox 10% iar driverul pe care il am se asteapta cam la 50% motiv pentru care merge cam sacadat probabil impulsurile fiind scurte, pe o parte din acestea nu le interpreteaza. Cum as putea transforma semnalul furnizat de UC100 intr-un semnal dreptunghiular cu factor de umplere 50% sau macar sa mai latesc un pic frontul pozitiv ?

 

Mai intai stabilesti cat va fi Fclk maxim pe care il vei folosi. Fclk este frecventa maxima pe care o vei avea la intrarea de STEP a driverului. Aceasta depinde de viteza cu care vei misca motoarele, lucru care depinde de faptul daca faci sau nu microstepping (driverele par ca pot doar half step doar ca nu am citit cu atentie datasheet-ul) si de cat de rigid este routerul CNC, dar mai ales de puterea motoarelor.

 

In fine, iti faci calculul si sa zicem ca ajungi la un Fclk ~ 25Khz => Thigh ~20us si Tlow ~20us pentru un factor de umplere de 50% la aceasta frecventa.

 

In acest moment, folosindu-te de intreruperea externa a unui controler, sa zicem ATTINY2313A (setat sa lucreze la frecventa maxima de 20MHz), pe fiecare tranzitie LOW-HIGH pe pinul de intrerupere generezi un puls cu durata de 20us pe un pin digital setatat ca OUTPUT. In principiu ar fi ideal ca sa ai un ATTINY2313 pentru fiecare axa, iar toate controlerele sa lucreze din acelasi clock extern de 20MHz.

 

Un program simplu ar fi ceva de genul:

// pin PD3 is the STEP input from the breakout box// any pin on PORTB is the STEP output, that it will gave a pulse for every LOW to HIGH transition on the PD3#define NOP __asm__ __volatile__ ("nopnt")/* pulse_width value will depend on how much the pulse width on PORTB should be.   For 20us pulse it should be about 50ns (instruction clock of Attiny2313A clocked at 20MHz) multiplied by 400 (20 instruction clock    for 1us * 20us) = 20000   There is also the time to enter the interrupt and of setting and clearing PORTB but it should not count much to the total   But due of the fact that a decision (the while cycle) will take 2 instruction clock's and there is also a subtraction (i--),    I will divide that value by ~3.*/#define pulse_width	6500	void init();volatile int i;ISR(INT1_vect){	PORTB = 1;	// set Pulse_Out HIGH	i = pulse_width;	while (i--){ NOP;}	PORTB = 0;	// set Pulse_Out LOW}void init(){	DDRB = 0;		// PORTB are OUTPUT's;	PORTB = 0;		// PORTB is LOW; disable Pulse_Out	DDRD &= ~(1 << PD3);		// PD3 (INT1) is input	PORTD |= (1 << PD3);		// PD3 (INT1) pull-up activated	for (int x = 0; x < 10; x++) // a little delay to let everything settle at start-up	{		NOP;	}	MCUCR = 0x0C; // activate RISING edge detection on INT1	GIMSK = 0x80; // activate only INT1	sei();		  // activate interrupts}int main(){	init();	while (1);}

Sigur, poti folosi un timer ca sa generezi pulsul de 20us in loc de a pune controlerul sa stea degeaba (NOP).

Valoarea "pulse_width" o determini cu un osciloscop, o ajustezi pana pulsul tau ajunge la durata dorita.

Editat de mars01
Link spre comentariu

Salut mai am o intrebare.

Pentru cei cu experienta cum vad rezolvarea urmatoarei probleme.

CNC-ul pe care il contruesc va trebui sa taie cu o piatra diamantata sticla.

Mecanismul pe care il am este pneumatic deci capul de taiere trebuie sa coboare si sa isi schimbe unghiul in functie de directia de deplasare.Partea mecanica nu e o problema.

Nu stiu cum sa interfatez softul cu partea hardware ca sa faca aceste operatiuni automat . Softul pe care l-am cumparat deja este UCCNC. Cum ar trebui gandite fisierele

de taiere a sticlei ?

Multumesc !

Link spre comentariu

Salut eu voi incerca totusi sa il rezolv in felul acesta.

O sa folosesc primele doua axe pentru deplasare pe verticala si respectiv orizontala iar pinii de DIR ale urmotoarelor doua axe vor actiona electrovalvele.

Deci voi folosi 4 axe, acum ramane sa studiez un pic de GCode.

Am rezolvat problema cu driverele. Multumesc mars01.

Daca stie cineva cam cum ar trebui conceput fisierul de taiere pentru aceasta aplicatie in GCode va rog sa ma ajutati.

Editat de Incepator92
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări