Sunteți pe pagina 1din 21

Lucrarea de laborator nr.

3
Tema : Dispozitive de actionare.
Obiective : 1. Intelegerea notiunii dispozitiv de actionare;
2. Intelegerea protocolului de comunicare prin interfata;
3. Proiectarea unui driver/librarii;
Problema : Sa se proiecteze un sistem care ar permite receptionarea caracterelor prin interfata
seriala si interpretarea lor ca comenzi de control pentru 2 motoare conectate la MCU prin
intermediul a 2 drivere LM293 sau LM298 (in Proteus). Sistemul va reprezenta un carut cu 2 roti
conectate (atasate) la motoarele controlate. Controlind cu vitezanmotoarelor se va obtine o
miscare a carutului inainte - inapoi, virare stinga sau dreapta.

Plan:
1. Definirea problemei :
Aplicatia prezinta o realizare a unui carut cu 2 roti, care poate fi controlat de la o interfata, cum
ar fi calculatorul. Pentru controlul rotilor va fi atasat un driver, din cele doua enumerate mai sus,
si deasemenea, realizata o interfata de control prin UART pentru a dirija rotile.

2. Generalitati.
Dispozitive de actionare vom numi dispozitivele care transforma o marime electrica intr-
una neelectrica, avind ca efect o influienta asupra mediului.
Dispozitiv de actionare mecanic:

Dispozitiv de actionare binar:

Pentru a efectua actionari asupra mediului de cele mai deseori este
necesar de o componenta de putere pentru a asigura functionarea normala a
dispozitivului de actionare.
Pentru dispozitivele cu o intrare binara ar putea fi folosite tranzistoarele
in calitate de chei electronice.
Semnalul parvenit de la sistem (MCU) va emite un semnal de control a
cheii electronice.


Iesiri analogice
Pentru a genera semnale analogice de la un sistem preponderent digital, de cele mai
dese ori se va utiliza un convertor digital analog.
De cele mai dese ori, problema generarii unui semnal analogic sau temporizat (PWM)
converge catre controlul unei valori digitale.
Controlul motoarelor pas cu pas
Cele mai utilizate sunt motoarele bipolare si unipolare
Stepper:
1. Unipolar
2. Bipolar

Regimul de half - step ne permite o pozitionare a motorului pas cu pas cu o precizie
dubla.
Regimul micro - step permite controlul polilor cu semnale analogice.

Motorul de curent continuu
In utilizarea puntii H este strict recomandat ca intre schimbarea
de poli sa se mentina un timp mort, in care nu sunt conectati ambii
tranzistori pe aceeasi ramura.
Pentru a conecta polul dintr-o extrema in alta, se va deconecta
cheia conectata, se va mentine timpul mort, dupa se va conecta
cheia cealalta.
Controlul vitezei se realizeaza prin comutarea unei chei, iar pe
ramura opusa la cheia respectiva vom aplica un semnal PWM,
factorul de umplere a caruia va reprezenta puterea motorului.


Motorul servo
Servo vom numi sistemele de miscare cu o pozitionare corecta. Lucreaza in modul
urmator :
pe intrare i se da pozitia dorita
motorul din acest sistem tinde la aceasta pozitie
Pentru hobisti, la sistemele servo intrarea de control va reprezenta un semnal RC, utilizat pe
larg pentru sistemele controlate la distanta.

3. Vom realiza implementarea grafica a sistemului, si anume realizarea schemelor bloc si
diagrame relevante la continutul aplicatiei si legaturii in ea a modulelor denumite.

Etapele de lucru:
1. Realizarea diagrama ierarhica.
2. Realizarea diagrama fluxului de date.
3. Realizarea diagrama de chemare.
4. Realizarea schemelor bloc.
5. Crearea librarii pentru Car.
6. Crearea librarii pentru UART.
7. Crearea librarii pentru Driver.

Diagra
ma
ierarhic
a




















Diagrama fluxului de date


Diagrama de chemare



4. Trecem la implementarea schemelor bloc a codului, si anume, realizarea in parte a
fiecarei functii si scrierea lor in limbajul C pentru MCU.

Motor_DC.c

void init_ports(void) //functia de
initializare a porturilor
{
DDRD=(1<<PD4)|(1<<PD5); //initializarea
pinilor 4 si 5
DDRC=0xff; //initializarea portului C
PORTC=0xff;}

void pwm(void) //initializarea PWM
{
TCCR1A=(1<<COM1A1)|(0<<COM1A0)|
(1<<COM1B1)|(0<<COM1B0)|(1<<WGM10);
TCCR1B=(1<<WGM12)|(1<<CS11)|(1<<CS10);
}







int main(void)
{

init_ports(); //initializarea porturilor
USART_Init(51); //initializarea UART si vitezei de
transmitere
pwm(); //setarea PWM

sei(); //permiterea intreruperii

while(1){;} //bucla infinita

return 0;
}

















ISR(USART_RXC_vect)
//functia de intrerupere de
la UART
{
a=getch_Uart();
//atribuim variabilei a a
datelor din UART

if(a=='a') //daca
coincide cu a
Car_Turn_Left();
//intoarcem car-ul la stinga

if(a=='d') //daca
coincide cu d
Car_Turn_Right();
//intoarcem car-ul la
dreapta

if(a=='q') //daca
coincide cu q

Car_Speed_Up_Left(SPEE
D); //acceleram car-ul la stinga

if(a=='w') //daca coincide cu w
Car_Speed_Up(SPEED); //acceleram car-ul inainte

if(a=='x') //daca coincide cu x
Car_Speed_Dn(SPEED); //acceleram car-ul inapoi

if(a=='s') //daca coincide cu s
Car_Stop_Break(); //oprim car-ul

if(a=='e') //daca coincide cu e
Car_Speed_Up_Right(SPEED); //acceleram car-ul la dreapta

if(a=='z') //daca coincide cu z
Car_Speed_Dn_Left(SPEED); //acceleram car la stinga inapoi

if(a=='c') //daca coincide cu c
Car_Speed_Dn_Right(SPEED); //acceleram car dreapta inapoi

}


UART.c

void USART_Init(unsigned int baud)
{
UBRRH = (unsigned char)(baud>>8);
//setarea regimurilor de lucru
UBRRL = (unsigned char)baud; //sincron
sau asincron si viteza
//de
transmitere (avem Hight si Low)
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
//permiterea primirii si
//transmiterii de biti,
oprire la primirea unor date
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
//dimensiunea caracterului
}




unsigned char getch_Uart(void)
{
while(!(UCSRA&(1<<RXC)))
//conditia pentru registru liber
{;}
return UDR; //in registru se
transmite data
}









Car.c

void Car_Set_PWM_Right(int SPEED) //setarea PWM
a motorului drept
{
OCR1B=SPEED;
}
void Car_Set_PWM_Left(int SPEED) //setarea PWM a motorului sting
{
OCR1A=SPEED;
}


void Car_Speed_Up(int SPEED)
{

MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
//motorul 1 activ
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT&=~(1<<MOTOR_L_IN_2_PIN);
//motorul 2 inactiv
MOTOR_PORT&=~(1<<MOTOR_R_IN_2_PIN);

SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_LEFT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_DN=0;

SPEED_UP+=SPEED;//viteza de inaintare se incrementeaza,se mareste

if(SPEED_UP>=MAX_SPEED) //viteza de inaintare se mentine
SPEED_UP=MAX_SPEED; //la nivelul vitezei maxime

Car_Set_PWM_Right(SPEED_UP); //setarea PWM-urilor la viteza
Car_Set_PWM_Left(SPEED_UP); //maxima
}

void Car_Speed_Dn(int SPEED)
{
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN); //activarea motorului 2
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);
MOTOR_PORT&=~(1<<MOTOR_L_IN_1_PIN); //motorul 1 inactiv
MOTOR_PORT&=~(1<<MOTOR_R_IN_1_PIN);

SPEED_UP=0;
SPEED_RIGHT_UP=0;
SPEED_LEFT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_DN=0;
SPEED_DN+=SPEED; //viteza de inapoiere se incrementeaza
if(SPEED_DN>=MAX_SPEED)
SPEED_DN=MAX_SPEED;

Car_Set_PWM_Right(SPEED_DN);
Car_Set_PWM_Left(SPEED_DN);
}

void Car_Turn_Left(void)
{
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PI
N);
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PI
N);
MOTOR_PORT&=~(1<<MOTOR_L_IN_1_P
IN);
MOTOR_PORT&=~(1<<MOTOR_R_IN_2_P
IN);

SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_LEFT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_DN=0;

Car_Set_PWM_Right(MAX_SPEED);
Car_Set_PWM_Left(MAX_SPEED);
}


void Car_Turn_Right(void)
{
MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);
MOTOR_PORT&=~(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT&=~(1<<MOTOR_R_IN_1_PIN);

SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_LEFT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_DN=0;

Car_Set_PWM_Right(MAX_SPEED);
Car_Set_PWM_Left(MAX_SPEED);

}

void Car_Speed_Up_Left(int SPEED)
{
MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT&=~(1<<MOTOR_R_IN_2_PIN);

SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_DN=0;

SPEED_LEFT_UP+=SPEED; //viteza spre stinga se incrementeaza
if(SPEED_LEFT_UP>=MAX_SPEED)
SPEED_LEFT_UP=MAX_SPEED;//se mentine la viteza maxima

Car_Set_PWM_Right(SPEED_LEFT_UP);
Car_Set_PWM_Left(MAX_SPEED);
}

void Car_Speed_Up_Right(int SPEED)
{
MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT&=~(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);

SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_UP=0;
SPEED_LEFT_DN=0;

SPEED_RIGHT_UP+=SPEED;
if(SPEED_RIGHT_UP>=MAX_SPEED)
SPEED_RIGHT_UP=MAX_SPEED;

Car_Set_PWM_Right(MAX_SPEED);
Car_Set_PWM_Left(SPEED_RIGHT_UP);
}

void Car_Speed_Dn_Left(int SPEED)
{
SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_UP=0;

MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT&=~(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);


SPEED_LEFT_DN+=SPEED;
if(SPEED_LEFT_DN>=MAX_SPEED)
SPEED_LEFT_DN=MAX_SPEED;

Car_Set_PWM_Right(SPEED_LEFT_DN);
Car_Set_PWM_Left(MAX_SPEED);

}
void Car_Speed_Dn_Right(int SPEED)
{
MOTOR_PORT&=~(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);


SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_LEFT_UP=0;
SPEED_LEFT_DN=0;

SPEED_RIGHT_DN+=SPEED;
if(SPEED_RIGHT_DN>=MAX_SPEED)
SPEED_RIGHT_DN=MAX_SPEED;

Car_Set_PWM_Right(MAX_SPEED);
Car_Set_PWM_Left(SPEED_RIGHT_DN);
}

void Car_Stop_Break(void)
{

MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);


SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_UP=0;
SPEED_LEFT_DN=0;

Car_Set_PWM_Right(MAX_SPEED);
Car_Set_PWM_Left(MAX_SPEED);
}


5. Implementarea intregului cod pentru sistem si simularea lui, verificarea si optimizarea
pina la o compilare fara greseli.

Motor_DC.c
#include <avr/io.h> //biblioteca pentru atmega16
#include <avr/interrupt.h> //biblioteca pentru intreruperi

#include "UART.h" //biblioteca pentru UART
#include "Car.h" //biblioteca pentru motoare

unsigned char a; //introducem o variabila a
int SPEED=10; //introducem viteza

void init_ports(void) //functia de initializare a porturilor
{
DDRD=(1<<PD4)|(1<<PD5); //initializarea pinilor 4 si 5
DDRC=0xff; //initializarea portului C
PORTC=0xff;
}

void pwm(void) //initializarea PWM
{
TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<WGM10);
TCCR1B=(1<<WGM12)|(1<<CS11)|(1<<CS10);
}

int main(void)
{

init_ports(); //initializarea porturilor
USART_Init(51); //initializarea UART si vitezei de transmitere
pwm(); //setarea PWM

sei(); //permiterea intreruperii

while(1){;} //bucla infinita

return 0;
}

ISR(USART_RXC_vect) //functia de intrerupere de la UART
{
a=getch_Uart(); //atribuim variabilei a a datelor din UART

if(a=='a') //daca coincide cu a
Car_Turn_Left(); //intoarcem car-ul la stinga

if(a=='d') //daca coincide cu d
Car_Turn_Right(); //intoarcem car-ul la dreapta

if(a=='q') //daca coincide cu q
Car_Speed_Up_Left(SPEED); //acceleram car-ul la stinga

if(a=='w') //daca coincide cu w
Car_Speed_Up(SPEED); //acceleram car-ul inainte

if(a=='x') //daca coincide cu x
Car_Speed_Dn(SPEED); //acceleram car-ul inapoi

if(a=='s') //daca coincide cu s
Car_Stop_Break(); //oprim car-ul

if(a=='e') //daca coincide cu e
Car_Speed_Up_Right(SPEED); //acceleram car-ul la dreapta

if(a=='z') //daca coincide cu z
Car_Speed_Dn_Left(SPEED); //acceleram car la stinga inapoi

if(a=='c') //daca coincide cu c
Car_Speed_Dn_Right(SPEED); //acceleram car dreapta inapoi

}

UART.h
#ifndef UART_H
#define UART_H //biblioteca pentru UART

void USART_Init(unsigned int); //initializarea UART
unsigned char getch_Uart(void); //transmiterea datelor la UART

#endif

UART.c
#include <avr/io.h>
#include "UART.h"

void USART_Init(unsigned int baud)
{
UBRRH = (unsigned char)(baud>>8); //setarea regimurilor de lucru
UBRRL = (unsigned char)baud; //sincron sau asincron si viteza
//de transmitere (avem Hight si Low)
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //permiterea primirii si
//transmiterii de biti, oprire la primirea unor date
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);//dimensiunea caracterului
}

unsigned char getch_Uart(void)
{
while(!(UCSRA&(1<<RXC))) //conditia pentru registru liber
{;}
return UDR; //in registru se transmite data
}

Car.h
#ifndef CAR_H
#define CAR_H //biblioteca pentru motoare a car-ului

void Car_Speed_Up(int); //accelerarea inainte
void Car_Speed_Dn(int); //accelerarea inapoi
void Car_Turn_Left(void); //rotirea spre stinga
void Car_Turn_Right(void); //rotirea spre dreapta
void Car_Speed_Up_Left(int); //accelerarea spre stinga inainte
void Car_Speed_Up_Right(int); //accelerarea spre dreapta inainte
void Car_Speed_Dn_Left(int); //accelerarea spre stinga inapoi
void Car_Speed_Dn_Right(int); //accelerarea spre dreapta inapoi
void Car_Stop_Break(void); //oprirea car-ului

#endif

Car.c
#include <avr/io.h>
#include "Car.h" //Biblioteca pentru motoare
#include "Drive.h" //biblioteca pentru drivere a motoarelor

#define MAX_SPEED 254 //definirea vitezei maxime

int SPEED_UP=0; //anularea tuturor vitezelor, initializarea
int SPEED_DN=0;
int SPEED_RIGHT_UP=0;
int SPEED_LEFT_UP=0;
int SPEED_RIGHT_DN=0;
int SPEED_LEFT_DN=0;

void Car_Set_PWM_Right(int SPEED) //setarea PWM a motorului drept
{
OCR1B=SPEED;
}
void Car_Set_PWM_Left(int SPEED) //setarea PWM a motorului sting
{
OCR1A=SPEED;
}

void Car_Speed_Up(int SPEED)
{

MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN); //motorul 1 activ
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT&=~(1<<MOTOR_L_IN_2_PIN); //motorul 2 inactiv
MOTOR_PORT&=~(1<<MOTOR_R_IN_2_PIN);

SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_LEFT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_DN=0;

SPEED_UP+=SPEED;//viteza de inaintare se incrementeaza,se mareste

if(SPEED_UP>=MAX_SPEED) //viteza de inaintare se mentine
SPEED_UP=MAX_SPEED; //la nivelul vitezei maxime

Car_Set_PWM_Right(SPEED_UP); //setarea PWM-urilor la viteza
Car_Set_PWM_Left(SPEED_UP); //maxima
}

void Car_Speed_Dn(int SPEED)
{
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN); //activarea motorului 2
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);
MOTOR_PORT&=~(1<<MOTOR_L_IN_1_PIN); //motorul 1 inactiv
MOTOR_PORT&=~(1<<MOTOR_R_IN_1_PIN);

SPEED_UP=0;
SPEED_RIGHT_UP=0;
SPEED_LEFT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_DN=0;
SPEED_DN+=SPEED; //viteza de inapoiere se incrementeaza
if(SPEED_DN>=MAX_SPEED)
SPEED_DN=MAX_SPEED;

Car_Set_PWM_Right(SPEED_DN);
Car_Set_PWM_Left(SPEED_DN);
}

void Car_Turn_Left(void)
{
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT&=~(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT&=~(1<<MOTOR_R_IN_2_PIN);

SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_LEFT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_DN=0;

Car_Set_PWM_Right(MAX_SPEED);
Car_Set_PWM_Left(MAX_SPEED);
}

void Car_Turn_Right(void)
{
MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);
MOTOR_PORT&=~(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT&=~(1<<MOTOR_R_IN_1_PIN);

SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_LEFT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_DN=0;

Car_Set_PWM_Right(MAX_SPEED);
Car_Set_PWM_Left(MAX_SPEED);

}

void Car_Speed_Up_Left(int SPEED)
{
MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT&=~(1<<MOTOR_R_IN_2_PIN);

SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_DN=0;

SPEED_LEFT_UP+=SPEED; //viteza spre stinga se incrementeaza
if(SPEED_LEFT_UP>=MAX_SPEED)
SPEED_LEFT_UP=MAX_SPEED;//se mentine la viteza maxima

Car_Set_PWM_Right(SPEED_LEFT_UP);
Car_Set_PWM_Left(MAX_SPEED);
}

void Car_Speed_Up_Right(int SPEED)
{
MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT&=~(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);

SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_UP=0;
SPEED_LEFT_DN=0;

SPEED_RIGHT_UP+=SPEED;
if(SPEED_RIGHT_UP>=MAX_SPEED)
SPEED_RIGHT_UP=MAX_SPEED;

Car_Set_PWM_Right(MAX_SPEED);
Car_Set_PWM_Left(SPEED_RIGHT_UP);
}

void Car_Speed_Dn_Left(int SPEED)
{
SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_UP=0;

MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT&=~(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);


SPEED_LEFT_DN+=SPEED;
if(SPEED_LEFT_DN>=MAX_SPEED)
SPEED_LEFT_DN=MAX_SPEED;

Car_Set_PWM_Right(SPEED_LEFT_DN);
Car_Set_PWM_Left(MAX_SPEED);

}
void Car_Speed_Dn_Right(int SPEED)
{
MOTOR_PORT&=~(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);


SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_LEFT_UP=0;
SPEED_LEFT_DN=0;

SPEED_RIGHT_DN+=SPEED;
if(SPEED_RIGHT_DN>=MAX_SPEED)
SPEED_RIGHT_DN=MAX_SPEED;

Car_Set_PWM_Right(MAX_SPEED);
Car_Set_PWM_Left(SPEED_RIGHT_DN);
}

void Car_Stop_Break(void)
{

MOTOR_PORT|=(1<<MOTOR_L_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_1_PIN);
MOTOR_PORT|=(1<<MOTOR_L_IN_2_PIN);
MOTOR_PORT|=(1<<MOTOR_R_IN_2_PIN);


SPEED_UP=0;
SPEED_DN=0;
SPEED_RIGHT_UP=0;
SPEED_RIGHT_DN=0;
SPEED_LEFT_UP=0;
SPEED_LEFT_DN=0;

Car_Set_PWM_Right(MAX_SPEED);
Car_Set_PWM_Left(MAX_SPEED);
}

Drive.h
#ifndef DRIVE_H
#define DRIVE_H //biblioteca pentru drivere la motoare

#include <avr/io.h>

//initializarea porturilor si pinilor
#ifndef MOTOR_DDR
#define MOTOR_DDR DDRC
#endif

#ifndef MOTOR_PORT
#define MOTOR_PORT PORTC
#endif

#ifndef MOTOR_PIN
#define MOTOR_PIN PINC
#endif

#ifndef MOTOR_L_IN_1_PIN
#define MOTOR_L_IN_1_PIN 0
#endif

#ifndef MOTOR_L_IN_2_PIN
#define MOTOR_L_IN_2_PIN 1
#endif

#ifndef MOTOR_R_IN_1_PIN
#define MOTOR_R_IN_1_PIN 2
#endif

#ifndef MOTOR_R_IN_2_PIN
#define MOTOR_R_IN_2_PIN 3
#endif

#endif

Drive.c

6.Crearea schemei cu modulele functionale in Proteus si simularea codului pentru a
verifica functionalitatea sistemului.

S-ar putea să vă placă și