Kompu reguliuojamas varikliuko greitis(pamokėlė Nr 2)

Taigi pažaidus su LED’ais ir 7 segmentų ekraniukais, galima mėginti ką nors daryti ir su kompu ir AVR. 🙂 AVR kontroleris gali bendrauti su kompu per USART (angl. The Universal Synchronous and Asynchronous serial Receiver and Transmitter) kompuose būna COM portas kuris veikia tokiu pačiu protokolu. Tik jo logkiniai lygiai yra kitokie. Ten loginis “0” (LOW) yra +12v, o loginis “1” (HIGH) yra -12v. AVR dirba kitokiu lygiu, vadinamu TTL (Transistor–Transistor Logic) čia lygiai yra tokie: loginis “0” (LOW) yra 0v, o loginis “1” (HIGH) yra +5v. Taigi, kad galėtume sujungti kompą su AVR reikia lygių keitiklio. Tam tikslui yra sukurta įvairių mikroshcemų, tokiu kaip: MAX232 arba FT232. MAX232 keičia COM(RS232) lygį į TTL ir atvirkščiai. Tai yra kai COM jungtis duoda +12v – MAX232 išėjime turime 0v, o kai -12v tada išėjime yra +5v. O FT232 mikroschema dirba su USB, sukurdama virtualų COM portą kompiuteryje, bet jos išęjimai jau yra TTL lygio, todėl galima iškarto jungti prie AVR mikrokontrolerio. USART pagindiniai išėjimai yra TXD (Transmit Data) ir RXD (Receive Data) siūsti ir gauti duomenims. Taigi surinkau tokia schemutę:

pwm

Prie PIN1 ir PIN2  jungiamas varikliukas. O prie PIN3 jungiame TXD iš MAX232 arba FT232, prie PIN4 jungiama RXD. Taip gaunasi, kad RXD-TXD ir TXD-RXD, kad vienas kitam galį siūsti ir priimti duomenis 🙂 Ant PC0 kojos pajungtas Mosfet’as. Kadangi varikliukui sukti reikia didesnės srovės (o AVR tegali max 20mA) ir įtampa ant AVR kojos max tėra 5v o mano turimas varikliukas dirba su 12v. Taigi mosfetas čia gerai tinka, nes jis gali atlaikyti žymei didesne srovę ir įtampą. Kondensatorius reikalingas kad sulyginti statų signalą. Be kondensatoriaus veikia, bet gali girdėtis arba jaustis kad varikliukas sukasi su pertraukimais. O greitis reguliuojams keičiant įtampą. O čia jokiu potenciometrų nėra. Taigi įtampa valdoma PWM (Pulse-width modulation) impulso pločio moduliacija. Tai yra jei pusę laiko įtampa bus įjungta ir tiek pat laiko išjungta tai gausime dvigubai žemesnę įtampą.

Tokiu principu ir keičiama įtampa. AVR turi tam specialias kojas ir kelis būdus kaip paleisti PWM. Bet pradžiai gerai bus ir paprastas pavyzdukas keičiant delsimo laiką įjungtos ir išjungtos PC0 kojos.  Taigi reikia pasirašyti programą mikrokontroleriui:

#define F_CPU 7372800UL //aprašomas taktinis dažnis
#include <avr/interrupt.h> //naudosim interrupt'us
#include <util/delay.h> //naudosim delsimo biblioteką
#include <avr/io.h> // ir aišku pagrindinę biblioteką
 
volatile char z; //Duomenų kintamasis
 
#define USART_BAUDRATE 9600 //Naudojamas BAUD Rate
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) //formule apskaiciuojanti daliklį
 
void USART_Init(void) //USART Nustatymai
{
UBRRH = (BAUD_PRESCALE >> 8); //Į UBRR regsitrą patalpiname daliklio reikšmę
UBRRL =  BAUD_PRESCALE; //kadandi UBRR registras yra 16bit'ų todėl dedamas į H ir L
UCSRB |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); //Nustatome 1stop bit'ą ir 8bit duomenis
}
 
ISR(USART_RXC_vect) //Gavimo pertrauktis
{
z=UDR; //kintamajam priskiriam duomenų registro turinį
}
 
int main(void)
{
sei(); //įjungiam globaliasias pertrauktis
USART_Init(); //sukonfiguruojame USART
DDRC=1; //PC0 bus kaip išėjimas valdyti Mosfet'o GATE
while(1) //Amžinas ciklas
  {
  PORTC=1; //Įjungiame PC0 koją
  _delay_ms(z); //ir laikome įjungtą tokį laiko tarpą kokį gauname iš kompo
  PORTC=0; //išjungiame PC0 koją
  _delay_ms(100-z); //laikome išjungtą koją 100-z laiko tarpą
  }
return 0;
}

Kvarcas parenkamas dėl to toks nestandartinis, kag gerai gautųsi BAUD RATE, kuris skaiciuojamas pagal formulę

BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

tik šioje formulėje saičiuojamas daliklis, kuris patalpinamas UBRR registre mano atveju tas UBRR skaičius yra 47 . Gautas taip : 47=(7372800/(9600*16))-1

betvarke

Taigi viską pasidarius AVR pusėje reikia imtis kompo pusės 🙂 Programai pasirašyti aš naudojau Delphi6 ir pasidariau tokią programėlę:

fan

Programoje reik pasirinkti COM portą ir paspausti Open.. tada susijungia su AVR na ir su tuo šliaužikliu reguliuojamos apsukos 🙂 Delphi kodo pavyzdį kaip COM apsirašyti buvau radęs kažkur kitur 🙂 ten buvo Fiat diagnostikos apatarui programos pavizdys.. Taigi iš jos išsitraukiojau ko man reikės 🙂

unit Unit1;
 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Gauges;
 
var
hCommFile : THandle;
DCB : TDCB; // structure for rs232
read_Error : boolean; // RS232 Read error by timeout
RS232_Buffer : array [0..255] of byte; // buffer for incoming bytes
 
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
Button1: TButton;
Gauge1: TGauge;
Label1: TLabel;
TrackBar1: TTrackBar;
Button2: TButton;
procedure TrackBar1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
Procedure Open_COMM;
var portas:pchar;
begin
// change COM1 if another port will be used
if form1.RadioButton1.Checked = true then portas:='COM1'
else if form1.RadioButton2.Checked = true then portas :='COM2'
else if form1.RadioButton3.Checked = true then portas :='COM3'
else if form1.RadioButton4.Checked = true then portas :='COM4';
hCommFile := CreateFile(portas , GENERIC_READ or GENERIC_WRITE,
0 , Nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
GetCommState(hCommFile,DCB); // set comm parameter
with DCB do
begin
Baudrate:= CBR_9600;
ByteSize:= 8;
Parity := NOPARITY;
end;
SetCommState(hCommFile,DCB);
if hCommFile = INVALID_HANDLE_VALUE then // error at open port
begin
ShowMessage('COM klaida');
exit;
end;
if hCommFile &lt;&gt; INVALID_HANDLE_VALUE then // ok at open port
begin
exit;
end;
end;
 
Procedure close_COMM;
begin
closeHandle(hCommFile);
end;
 
Procedure clearBuffers;
begin
purgecomm(hcommfile,PURGE_TXCLEAR);
purgecomm(hcommfile,PURGE_RXCLEAR);
end;
 
Procedure write_RS232 ( tosend:byte);
Var sent:dword;
begin
WriteFile (hCommFile,tosend,1,sent,nil);
end;
 
Function read_RS232(Timeout_value:word) : byte;
var
TimeOutBuffer:PCOMMTIMEOUTS;
bytesread:dword;
read_byte:byte;
begin
//timeout parameter setting
GetMem(TimeoutBuffer,sizeof(COMMTIMEOUTS));
GetCommTimeouts (hCommFile,TimeoutBuffer^);
TimeoutBuffer.ReadTotalTimeoutMultiplier:=0;
TimeoutBuffer.ReadTotalTimeoutConstant:=timeout_Value;
SetCommTimeouts (hCommFile,TimeoutBuffer^);
ReadFile(hCommFile,Read_byte,1,bytesread,nil);
if (BytesRead = 0)
then begin
Read_RS232:= 0;
read_error := true;
end
else begin
read_error := false;
Read_RS232:= read_byte;
end;
end;
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Gauge1.Progress:=TrackBar1.Position;
clearbuffers;
write_rs232(TrackBar1.Position);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Open_COMM;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
Close_COMM;
end;
 
end.

Delphi Projektą galite parsisiųsti iš čia.

Tags: , , , , ,

Leave a Reply

You can add images to your comment by clicking here.

Spam Protection by WP-SpamFree