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!
Softul de mai sus nu imi apartine in totalitate! Ar trebui compilat si testat.
Toate cele bune!
@dan