Šoreiz autors aplūko servo motoru vadības iespējas, izmantojot ATMEGA328P sērijas mikrokontrolleri.
Kā jau iepriekš tika aplūkots, tad servo motoru vadībai ir nepieciešams speciāls vadības signāls, kur aizpildījuma koeficients tiek mainīts robežās no 5 līdz 10 %, kur kopējais signāla periods ir 20 ms, kas nozīmē to, ka augsts signāla līmenis saglabājas 1-2 ms.
Izmantojot autora izveidoto elektrisko principiālo shēmu servo motoru vadībai (skatīt 1.1.att.), servo motoru ir iespējams pagriezt dažādās pozīcijās, kuru noteikšanai tiek izmantotas spiedpogas, kur katra no tām atbilst vienai pozīcijai (0, +45º, +90º, -45º, -90º).
1.1.att. Servo motoru regulators, izmantojot ATMEGA328P
R1-R6 rezistori tiek izmantoti augsta signāla līmeņa piesaistei pie mikrokontrollera ieejām, protams, var izmantot arī iekšējos augsta signāla līmeņa piesaistes rezistorus.
5 spiedpogas tiek izmantotas servo motora pozīcijas iestatīšanai, bet vēl viena spiedpoga tiek izmantota mikrokontrollera atiestatīšanai.
5 spiedpogas tiek izmantotas servo motora pozīcijas iestatīšanai, bet vēl viena spiedpoga tiek izmantota mikrokontrollera atiestatīšanai.
Izmantojot LM7805 sērijas lineāro sprieguma stabilizatoru, tiek nodrošināta mikrokontrollerim un servo motoram nepieciešamā 5 V elektrobarošana, kad ierīces darbībai tiek izmantota 9 V baterija.
C1-C3 kondensatori paredzēti parazītiskās induktivitātes un tās ietekmes mazināšanai.
Nemainīgas servo motora pozīcijas indikācijai tiek izmantota D1 gaismas diode, kuras aizsardzībai tiek izmantots R7 rezistors, kurš ierobežo strāvu caur gaismas diodi.
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void Timer_Init();
void Wait_1s();
void Servo_0_pos();
void Servo_pos_90_degrees();
void Servo_neg_90_degrees();
void Servo_pos_45_degrees();
void Servo_neg_45_degrees();
void LED_blinking();
void main(){
DDRB = 0xFF;
DDRD = 0xE0;
Timer_Init();
while(1){
_delay_ms(10);
if(!(PIND & (1<<PIND0))){
Servo_0_pos();
}
else if (!(PIND & (1<<PIND1))){
Servo_pos_45_degrees();
}
else if (!(PIND & (1<<PIND2))){
Servo_pos_90_degrees();
}
else if (!(PIND & (1<<PIND3))){
Servo_neg_45_degrees();
}
else if (!(PIND & (1<<PIND4))){
Servo_neg_90_degrees();
}
else{
LED_blinking();
}
}
}
void Timer_Init(){
// TIMER1 iestatijumi
TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
// Neinvertets PWM
// Neinvertets PWM
TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10);
// dalitajs = 64, rezims -> 14 (atrais PWM)
// dalitajs = 64, rezims -> 14 (atrais PWM)
ICR1=2499; // fPWM = 50Hz (periods = 20 ms)=8 MHz/2499=3,2 KHz
// Ja tiek izmantots 64 dalitajs, tad 3,2 KHz /64=50 Hz
} // OCR1/ICR1*100 => aizpildijuma koeficients, %
void Wait_1s(){
_delay_ms(1000);
}
void Servo_pos_90_degrees(){
OCR1A=250; //+90 degree -> 10 % -> 2 ms
}
void Servo_neg_90_degrees(){
OCR1A=115; //-90 degree -> 5 % -> 1 ms
}
void Servo_neg_45_degrees(){
OCR1A=155;
}
void Servo_pos_45_degrees(){
OCR1A=218;
}
void Servo_0_pos(){
OCR1A=186; //0 degree -> 7,5 % -> 1,5 ms
}
void LED_blinking(){
PORTD &= ~(1<<PD5);
_delay_ms(100);
PORTD |= (1<<PD5);
_delay_ms(200);
}