Sari la conținut

Postări Recomandate

Dupa ce am mai studiat si am vazut proiectul de pe forum cu sursa de alimentare, am incercat sa scriu un program pentru ATtiny2313 (cam mare pentru aplicatie, dar stiam cel mai multe despre el :D). Programul trebuie sa permita actionarea unui motor pas cu pas pana la introducerea unui curent pe pinii portului a si e scris in bascom (fiindca la basic ma descurc cel mai bine, dintre limbajele cu care pti programa un microcontroller).

asa ca programul arata cam asa:

 

Config Portb = Output 'seteaza portul b ca iesire

Portb = 0 'seteaza toti pinii portului b la 0

 

Config Porta = Input 'seteaza portul a ca intrare

Porta = 0 'seteaza toti pinii portului a la 0

 

Do 'defineste o bucla

 

Portb = 128 'in binar 10000000, prinul pin cu valoarea 1

 

For I = 1 To 10 'face o bucla cu 10 ciclii pentru a intarzia executia (am inteles ca daca semnalul e prea rapid, nu functioneaza motorul)

I = I + 1

Next I 'inchide bucla

 

Portb = 64 ''in binar 1000000, al doilea pin cu valoarea 1

 

For I = 1 To 10 'aceeasi bucla

I = I + 1

Next I

 

Portb = 32 'in binar 100000, al treilea pin cu valoarea 1

 

For I = 1 To 10

I = I + 1

Next I

 

Portb = 16 'in binar 100000, al patrulea pin cu valoarea 1

 

Loop Until Porta =7 'aici cred ca e gresit (de fapt sunt aproape sigur)

'programul trebuie sa ruleze pana cand pe toti pinii portului a (intare) au valoarea 111

 

Am facut acest topic pentru ca as dori, inainte sa il incarc, sa imi spuna cineva daca am gresit pe undeva (am pus comentariile si pentru cei care nu cunosc limbajul, poate primesc ajutoar macar cu algoritmul).

Link spre comentariu
https://www.tehnium-azi.ro/forums/topic/2021-soft-uri/
Distribuie pe alte site-uri

Nu ma pricep foarte bine la uC dar am vazut ca ATtiny2313 are la portul B mai multe iesiri: 0...7. Ar trebui sa definesti care din aceste iesiri le foloseste pt. comanda motorului pas cu pas. Mai trebuie si o intarziere pe undeva intre impulsurile generate pe cele 4porturi, plus ca trebuie sa stabilesti si frecv. de c-da a motorului, mult sub frecv. de ceas a uC-ului.

 

Uite un exemplu de implementare soft a PWM-ului in BASIC si realizare a impulsurilor pe cele 4 porturi B0...B3 a lui ATtiny2313:

program PWM_Test			 ' Cu ATtiny2313 

dim  current_duty as byte
current_duty1 as byte
current_duty2 as byte
current_duty3 as byte

main:
 DDD0_bit = 0					' Set PORT.D0 pin 0 as input - Intre D0-D1 se conecteaza un buton pentru a creste factorul de umplere PWM
 DDD1_bit = 0					' Set PORT.D1 pin 1 as input
 DDD2_bit = 0					' Set PORT.D2 pin 0 as input - Intre D2-D3 se conecteaza un alt buton pentru a scade factorul de umplere PWM
 DDD3_bit = 0					' Set PORT.D3 pin 1 as input

 current_duty  = 127		   ' Aici am setat valoarea initiala a factorului de umplere - n= 0...255 se poate pune orice valoare (127 inseamna 50% fact. de umplere)
 current_duty1 = 127		  ' Idem
 current_duty2 = 127		  ' Idem
 current_duty3 = 127		  ' Idem

 DDB0_bit = 1					' Seteaza PORTB pin 0 ca iesire pentru PWM (vezi datasheet ATtiny2313)
 DDB1_bit = 1					' Seteaza PORTB pin 1 ca iesire pentru PWM (vezi datasheet ATtiny2313)
 DDB2_bit = 1					' Seteaza PORTB pin 2 ca iesire pentru PWM (vezi datasheet ATtiny2313)
 DDB3_bit = 1					' Seteaza PORTB pin 3 ca iesire pentru PWM (vezi datasheet ATtiny2313)

PWM_Init(_PWM_PHASE_CORRECT_MODE, _PWM_PRESCALER_8, _PWM_NON_INVERTED, 127)
PWM1_Init(_PWM1_PHASE_CORRECT_MODE, _PWM1_PRESCALER_8, _PWM1_NON_INVERTED, 127)
PWM2_Init(_PWM2_PHASE_CORRECT_MODE, _PWM1_PRESCALER_8, _PWM1_NON_INVERTED, 127)
PWM3_Init(_PWM3_PHASE_CORRECT_MODE, _PWM1_PRESCALER_8, _PWM1_NON_INVERTED, 127)

 while TRUE						  ' Inchide bucla

if (PIND0_bit <> 0) then		   ' Detecteaza daca PORTD pin 0 este apasat
  Delay_ms(40)						' O mica intarziere pentru a reprima efectul deboucing
  Inc(current_duty)				   ' Incrementeaza factorul de umplere
  PWM_Set_Duty(current_duty)  ' Seteaza incrementarea fact. de umpl.
end if

if (PIND1_bit <> 0) then		  ' Detecteaza daca PORTD pin 1 este apasat
  Delay_ms(40)					' O mica intarziere pentru a reprima efectul deboucing
  Dec(current_duty)			   ' Incrementeaza factorul de umplere
  PWM_Set_Duty(current_duty1)	  ' Seteaza incrementarea fact. de umpl.
end if

if (PIND2_bit <> 0) then		  ' Detecteaza daca PORTD pin 2 este apasat
  Delay_ms(40)					' O mica intarziere pentru a reprima efectul deboucing
  Inc(current_duty1)			  ' Incrementeaza factorul de umplere
  PWM1_Set_Duty(current_duty2)	' Seteaza incrementarea fact. de umpl.
end if

if (PIND3_bit <> 0) then		  ' Detecteaza daca PORTD pin 3 este apasat
  Delay_ms(40)					' O mica intarziere pentru a reprima efectul deboucing
  Dec(current_duty1)			  ' Incrementeaza factorul de umplere
  PWM1_Set_Duty(current_duty3)	' Seteaza incrementarea fact. de umpl.
end if

 wend

end. ' sfarsit program comanda motor pas cu pas

 

Ar mai trebui facuta intarziere intre PWM asa cum mi-a spus un prof la facultate! Dar cred ca m-am blocat cu BASIC-ul aici. In C cred ca ma descurcam mai bine! scratch_one-s_head.gif

 

Softul de mai sus nu imi apartine in totalitate! Ar trebui compilat si testat.

 

Toate cele bune!

@dan

Editat de dan_e
Link spre comentariu
https://www.tehnium-azi.ro/forums/topic/2021-soft-uri/#findComment-18880
Distribuie pe alte site-uri

Protul b are 8 iesiri din ce am inteles din datasheet. PEntru semnal, moi folosi numai pini 1, 2, 3, si 4. Delayul se face din buclele for...next. acolo se trece prin acele instructiuni de 10 ori, dar asta se poate modifica usor.

Nu spun ca sunt mare expert, dar am inteles ca se seteaza toti pinii pe out din primele 2 linii, iar bitii reprezinta starea pinilor (1 sau 0 logic).

Nu sunt sigur de algoritm si nici de sintaxa, asa ca am apelat la un mic ajutor de pe forum

Link spre comentariu
https://www.tehnium-azi.ro/forums/topic/2021-soft-uri/#findComment-18890
Distribuie pe alte site-uri

Nu cunosc BASIC dar uitandu-ma putin in help-ul compilatorului mikroBASIC for AVR care mai mult ca sigur a fost folosit de utilizatorul @dan_e in editarea programului de mai sus.; am observat cateva greseli in acel program:

- compilatorul nu poate recunoaste PWM2_Init si PWM3_Init. Recunoaste doar rutinele PWM_Init si PWM1_Init;

- defazarea semnalelor PWM se poate face foarte simplu, lucru valabil si in mikroC for AVR, astfel:

 

PWM_Init(_PWM_PHASE_CORRECT_MODE, _PWM_PRESCALER_8, _PWM_NON_INVERTED, 127) 'Semnal PWM defazat la 180grade, factor de umplere 50%

 

PWM_Init(_PWM_PHASE_CORRECT_MODE, _PWM_PRESCALER_8, _PWM_INVERTED, 127) 'Semnal PWM defazat la 360grade, factor de umplere 50%

 

- atentie! Utilizarea PWM_Init se face doar pe porturile de iesire "care au suport PWM" (nu stiu daca este tocmai cea mai plauzibila explicatie!). Spre exemplu, la uC ATtiny2313, pot fi setate ca PWM output doar 4 porturi PWM: PB2, 3, 4 si PD5 (cel putin asa reiese din datasheet).

 

Programul de c-da PWM se poate face setand pentru inceput ca iesiri aceste porturi. Variatia turatiei motorului se poate face schimband factorul de umplere a semnalelor PWM la f=const si/sau f=variabil. Deci PWM reprezinta modulatia in latime a impulsurilor.

 

Numai bine

Link spre comentariu
https://www.tehnium-azi.ro/forums/topic/2021-soft-uri/#findComment-18902
Distribuie pe alte site-uri

@adry,

 

Compilatoarele pentru microcontrolere sunt niste "corcituri", cum le spui, deoarece ele adapteaza si chiar creeaza noi instructii (functii, rutine...) pentru a te ajuta la programare uC. Deci, aceste compilatoare sunt creeate in corelatie cu structura interna a microcontrolerelor utilizate. Nu se poate folosi compilatoare uzuale de Basic sau C/C++, deoarece uC nu le poate intelege codul masina generat de acestea. Din acest motiv au aparut corciturile - nu e un termen frumos dar uite ca l-ai folosit.

 

Inca ceva: cand vrei sa programezi un uC iti alegi un compilator "corcitura" si ii studezi help-ul cu instructiunii. Utilizezi numai aceste instructiuni pentru realizarea programului. Apropo, codul scris in BASIC de tine, in ce compilator l-ai scris ?

 

Semnalul PWM pentru c-da motorului pas cu pas trebuie "defazat" pe canalele de c-da pentru altfel nu vei face sa se functioneze motorul. Tu ce incerci sa faci e ca si cum ai incerca sa alimentezi un motor trifazat pe toate fazele monofazat fara sa defazezi semnalele! Asadar, alege un compilator - spre exemplu, am recomandat la mai multi suita mikro C sau Basic (este si Pascal) deoarece daca le inveti pe acestea, utilizand niste compilatoare gen mikroC pentru PIC, vei putea foarte simplu sa transpui un program pentru AVR-uri intr-unul pentru PIC, fara mari bataii de cap, asa cum se intampla cat utilizam compilatoare din ansambler.

Link spre comentariu
https://www.tehnium-azi.ro/forums/topic/2021-soft-uri/#findComment-18904
Distribuie pe alte site-uri

Am revenit cu un update la soft :D. Am descoperit o metoda de defazare foarte simpla dar ramae sa imi confirmati daca e si corecta:

 

Config Portb = Output 'seteaza portul b ca iesire

Portb = 0 'seteaza toti pinii portului b la 0

 

Config Porta = Input 'seteaza portul a ca intrare

Porta = 0 'seteaza toti pinii portului a la 0

 

Do 'defineste o bucla

 

Portb = 128 'in binar 10000000, prinul pin cu valoarea 1

 

For I = 1 To 10 'face o bucla cu 10 ciclii pentru a intarzia executia (am inteles ca daca semnalul e prea rapid, nu functioneaza motorul)

I = I + 1

Next I 'inchide bucla

 

Portb = 64 ''in binar 1000000, al doilea pin cu valoarea 1

 

For I = 1 To 15 'aceeasi bucla

I = I + 1

Next I

 

Portb = 32 'in binar 100000, al treilea pin cu valoarea 1

 

For I = 1 To 20

I = I + 1

Next I

 

Portb = 16 'in binar 100000, al patrulea pin cu valoarea 1

 

Loop Until Porta =7 'aici cred ca e gresit (de fapt sunt aproape sigur)

'programul trebuie sa ruleze pana cand pe toti pinii portului a (intare) au valoarea 111

 

Practic, am definit intre comenzile de iesire pe bobine niste bucle pentru a incetini putin procesul. Si in bucle am modificat timpii cat sta acolo.

Link spre comentariu
https://www.tehnium-azi.ro/forums/topic/2021-soft-uri/#findComment-19025
Distribuie pe alte site-uri

@adry,

 

Incearca sa implementezi intr-un compilator solutia expusa de tine. Ceea ce ai prezentat mai sus este doar un simplu extras (sau "filozofie") care din punct de vedere practic s-ar putea sa nu dea rezultatele scontate. Dupa aceea ar trebui sa realizezi un montaj test, cu microcontrolerul ales. Sa stii ca, am realizat de-a lungul timpului, diferite programe pentru microcontrolere, care chiar daca dupa compilare nu prezentau erori, dupa implementarea in uC montajul nu functiona exact cum teoretic as fi vrut. Sunt cazuri si cazuri si nu ar trebui sa privesti totul superficial.

 

Numai bine

Link spre comentariu
https://www.tehnium-azi.ro/forums/topic/2021-soft-uri/#findComment-19030
Distribuie pe alte site-uri

Este implementata intr-un compilator dar ai compilat programul ? Sigur nu ai obtinut erori ?

 

ATtiny2313 se poate rescrie de foarte multe ori. Dar inainte sa realizezi in proportie de 100% programul studiaza cu mare atentie datasheet-ul acestui microcontroler si incearca sa-ti insusesti anumite parti "hardware" din acest microcontroler, cum functioneaza porturile, ce stari pot avea aceste porturi etc. Incearca sa nu te limitezi numai la software.

 

Spre exemplu, nu stiu daca e chiar cazul uC Attiny, dar in anumite uC-uri se poate activa blocul PWM pentru generarea semnalului de baza, urmand ca acesta sa fie decalat "software", dupa un anumit altgoritm, pe porturile de iesire. Modulatia vectoriala sau fazoriala este o tehnica de actualitate in controlul convertoarelor si masinilor electrice care se poate implementa software (necesita uC cu cel putin 32kb flash) in acest scop. Totusi, aceste notiuni necesita cunoasterea altor notiuni de matematica, pe care din pacate nu ai ajuns sa le inveti. Iti inteleg dorinta ta sa inveti anumite lucruri dar sa nu uiti faptul ca intelegerea in totalitate a lor necesita parcurgerea altor notiunii pe care le inveti la un anumit moment in viata.

 

Numai bine

Link spre comentariu
https://www.tehnium-azi.ro/forums/topic/2021-soft-uri/#findComment-19049
Distribuie pe alte site-uri

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
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock