Sunteți pe pagina 1din 12

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatică și Microelectronică

Departamentul Microelectronică și Inginerie Biomedicală

RAPORT

La lucrarea de laborator Nr:4

La disciplina Sisteme electronice incorporate

Tema:Dirijarea functionarii a doua motoare prin intermediul driverului L293D.

A efectuat: st.gr.ISBM-172 Rotari Nicu

A verificat: lect.univ. Verjbitchii Valeriu

Chișinău 2020
Scopul lucrarii: Să se proiecteze un sistem care ar permite recepționarea comenzilor prin
interfața serială (USART) și interpretarea lor ca comenzi de control a 2 motoare în curent
continuu.Motoarele vor fi controlate prin intermediul driverului L293.

Notă: Se consideră că motoarele sunt plasate pe un caruț,iar actiunile rotilor vor determina
direcțiile de mișcare a carului. Setul de comenzi recepționat prin USART va implica schimbarea
vitezelor roților conform funcțiilor atașate comenzilor respective.

Noțiuni teoretice:
Descriere generală a modulului UART:
Modulul UART este o periferie foarte puternică şi folositoare în orice proiect AVR. El poate
fi folosit pentru a testa codul, interacţiunea cu utilizatorul, sau chiar pentru transmiterea/primirea
datelor de la PC. Mai jos este aratată schema arhecturală a unui UART din cadrul
microcontrollerului AT90S2313:

UART poate fi configurat să transmită 8 sau chiar 9 biţi. El filtrează datele primite şi
deasemenea detectează condiţii de supraîncărcare sau erori, are trei întreruperi. Din desen se
vede că transmiţătorul şi receprotul utilizează acelaşi registru UDR (UART Data Register). În
realitate se utilizează doar aceeaşi adresă, dar nu şi acelaşi registri, UDR este divizat în 2 regiştri
– de transmisie şi recepţie. Receptorul şi transmiţătorul mai utilizează împreună şi generatorul de
Baud Rate, funcţia căruia este explicată mai jos.

Generatorul de Baud Rate defineşte viteza de lucru al UART. Spre deosebire de timer
clock, care poate fi prescalat ordinar, clock-ul de la UART poate fi divizat foarte precis, ca
rezultat se obţine un transfer de date curat şi fără erori.
Formula de calcul a ratei baud depinde de valoarea din UBRR:

De exemplu avem o frecvenţă de ceas de 8MHz şi dorim un baud de 9600, din această formulă
obţinem UBRR de 51.083333333, adică 51. Eroarea pe care o obţinem este rata baud reală
divizată la cea dorită, adică 9615/9600 ce ne dă o eroare de 0,16%. Cu toate acestea transmisia v-
a funcţiona, dar nu perfect. De aceea putem întîlni cristale oscilatoare cu frecvenţe deosebite ca
de ex. 7,3728 MHz. Utilizînd acest oscilator v-om obţine UBRR = 47 şi o eroare egală cu zero.

Schema bloc:
Listingul programului:
______________________________________main()______________________________________

/*
* main.c
*
* Created: 07.04.2019 22:58:43
* Author: Vica
*/

#include "dcm_handler.h"
#include "uart.h"

int main()
{
char ch;
/*make PORT C as output for IN1, IN2, IN3, and IN4*/
DDRC = 0xFF;
//PORTC = 0x00;
/*make OC1A as output*/
DDRD |= (1<<PD5);
/*make OC1B as output*/
DDRD |= (1<<PD4);
PORTD = 0x00;
pwm_init();
USART_Init(12);

//UART_TxChar('c');
while(1)
{
scanf("%c",&ch);
_delay_ms(10);

switch(ch)
{
case 'c':{run_clockwise();speed_up(1023);
_delay_ms(3000);slow_down(1023);}; break;
case 'a':{run_anticlockwise();speed_up(1023);
_delay_ms(3000);slow_down(1023);};break;
case 's':{stop_running();};break;
case 'l':{turn_left();speed_up(1023);};break;
case 'r':{turn_right();speed_up(1023);};break;
default:{stop_running();};

};

_________________________________UART.h_________________________________

#ifndef USART_H
#define USART_H

void USART_Init(unsigned int baud);


void USART_Transmit(unsigned char data);
unsigned char USART_Receive(void);

#endif /*USART_H*/
_____________________________________USART.c____________________________________

##include <avr/io.h>
#include <stdio.h>
#include "uart.h"
static FILE mystdout = FDEV_SETUP_STREAM(USART_Transmit,USART_Receive, _FDEV_SETUP_RW);

void USART_Init(unsigned int baud)


{
stdout=&mystdout;
stdin=&mystdout;

UBRRH=(unsigned char)(baud>>8);
UBRRL=(unsigned char) baud;
UCSRA = (1<<U2X);
UCSRB=(1<<RXEN)| (1<<TXEN);
UCSRC=(1<<URSEL)| (1<<USBS)| (3<<UCSZ0);
}

void USART_Transmit(unsigned char data)


{
while(!(UCSRA& (1<<UDRE)));
UDR=data;
}

unsigned char USART_Receive(void)


{
while(!(UCSRA& (1<<RXC)));
return UDR;
}___________________________________DCM_HANDLER.h_____________________________
/*
* dcm_handler.h
*
* Created: 07.04.2019 23:11:34
* Author: Vica
*/

#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#ifndef DCM_HANDLER_H_
#define DCM_HANDLER_H_

void pwm_init(void);
void speed_up(uint8_t TCNTn_counter);
void slow_down(uint8_t TCNTn_counter);
void stop_running(void);
void run_clockwise(void);
void run_anticlockwise(void);
void turn_left(void);
void turn_right(void);

#endif /* DCM_HANDLER_H_ */
________________________________ DCM_HANDLER.c____________________________

/*
* dcm_handler.c
*
* Created: 07.04.2019 23:13:44
* Author: vica
*/

#include "dcm_handler.h"

/************************************************************************/
/* Function: pwm_init() */
/* Return Type: void */
/* Description: This function initializes the TIMER0 and TIMER2 in */
/* fast pwm mode with non-inverted output and sets OC0 with OC2 pins as */
/* output. */
/************************************************************************/

void pwm_init()
{
//TCCR0 = (1<<COM01) | (1<<WGM00) | (1<<WGM01) | (1<<CS00);
//TCCR2 = (1<<COM21) | (1<<WGM20) | (1<<WGM21) | (1<<CS20);
TCCR1A = (1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);
TCCR1B = (1<<WGM12)|(0<<WGM13)|(0<<CS12)|(1<<CS11)|(0<<CS10);
OCR1A = OCR1B = 0x00;
}

/************************************************************************/
/* Function: set_duty_cycle() */
/* Return Type: void */
/* Description: This function manipulates with the duty */
/* cycle by increasing OCRn register inside an iterating statement */
/* Parameters : this function takes one argument which set the counter. */
/* */
/************************************************************************/

void speed_up(uint8_t TCNTn_counter)


{
uint8_t duty_cycle = 0;
while (duty_cycle < TCNTn_counter)
{
OCR1A = duty_cycle;
OCR1B = duty_cycle;
duty_cycle += 55;
};
}

/************************************************************************/
/* Function: slow_down() */
/* Return Type: void */
/* Description: This function manipulates with the duty */
/* cycle by increasing OCRn register inside an iterating statement */
/* Parameters : this function takes one argument which tells what timer */
/* to choose so that it could be initialized. */
/************************************************************************/
void slow_down(uint8_t TCNTn_counter)
{

while (TCNTn_counter > 0)


{
OCR1A = TCNTn_counter;
OCR1B = TCNTn_counter;
TCNTn_counter -= 55;
};
}

/************************************************************************/
/* Function: stop_running() */
/* Return Type: void */
/* Description: This function will reset all the IN pins of L298. */
/* Parameters : It takes no parameters. */
/************************************************************************/

void stop_running()
{
OCR1A &=~(OCR1A);
OCR1B &=~(OCR1B);
PORTC = 0x00;
}

/************************************************************************/
/* Function: run_clockwise() */
/* Return Type: void */
/* Description: This function will set the IN1 and IN3 pins of L298 to */
/* get both DCM running */
/* Parameters : It takes no parameters. */
/************************************************************************/

void run_clockwise()
{
PORTC = 0b00000101;
}

/************************************************************************/
/* Function: run_anticlockwise() */
/* Return Type: void */
/* Description: This function will set the IN2 and IN4 pins of L298 to */
/* get both DCM reverse */
/* Parameters : It takes no parameters. */
/************************************************************************/

void run_anticlockwise()
{
PORTC = 0x0A;
}

/************************************************************************/
/* Function: turn_left() */
/* Return Type: void */
/* Description: This function will set the IN1 and IN4 pins of L298 to */
/* get both DCM turn left */
/* Parameters : It takes no parameters. */
/************************************************************************/
void turn_left()
{
PORTC = 0x09;
}

/************************************************************************/
/* Function: turn_right() */
/* Return Type: void */
/* Description: This function will set the IN2 and IN3 pins of L298 to */
/* get both DCM turn right */
/* Parameters : It takes no parameters. */
/************************************************************************/

void turn_right()
{
PORTC = 0x06;
}

Schema electrica proectata in Proteus:


Concluzii:
In urma efectuarii acestei lucrari de laborator am studiat interfata serial USART si modul de
interactiune intre motoare. Am studiat modul de a transmite comenzi de la interfata serial catre
motor si am vazut cum putem controla motorul cu ajutorul draiverului L293D.

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