Translate

Cara Membuat Alat Kendali Motor DC Dengan PID Control

Cara Membuat Alat Kendali Motor DC Dengan PID Control


           Di malam setengan sore ini saya akan menjelaskan mengenai bagaimana cara mengakses motor DC menggunakan PID kontrol, jadi set poin yang diinginkan adalah berupa RPM (rotasi per menit), bisa juga berupa parameter lain, disini saya menggunakan motor DC maksimal 1000 Rpm dan optocoupler untuk decodernya, kemudian driver motor yang dipakai adalah L293 yang murah meriah namun powerful dalam aksinya. Untuk lebih jelasnya berikut skema dan programnya.



a. Minimm System





b.  Motor DC 1000 Rpm





c. Optocoupler Module






d, Driver L293






e. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 12000000

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2

'setting pwm
Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Down
Config Timer0 = Timer , Prescale = 256

Dim Kp As Single
Dim Ki As Single
Dim Kd As Single
Dim Setpoint As Single
Dim P As Single
Dim Pi As Single
Dim Pid As Single
Dim I As Single
Dim D As Single
Dim Error As Single
Dim Errorx As Single
Dim Sum_err As Single

Ddrb.0 = 1
Ddrb.1 = 1

Cls
Cursor Off

'=========== set counter ==========

Ch Alias Pind.2

Config Pind.2 = Output
Config Ch = Input
Config Int0 = Falling

Const Debouncetime = 1

Dim Wtime As Byte
Dim Encounter As Integer
Dim Rpm As Integer
Dim Detak As Byte
Dim Detik1 As Integer
Dim Detik As Byte

Set Ch

On Int0 Getencoder
On Ovf0 Int_timer0

Wtime = 100
Encounter = 0

Enable Interrupts
Enable Int0
Enable Timer0

'=================================
Kp = 0.9                                                    ' Proportional factor
Ki = 0.1                                                    ' Integration factor
Kd = 1.9                                                    ' derrivative factor

Setpoint = 700

Do

Portb.0 = 0
Portb.1 = 1

Error = Setpoint - Rpm

P = Error * Kp

Sum_err = Error + Errorx
I = Ki * Sum_err

D = Error - Errorx

Pi = P + I
Pid = Pi + D
Pid = Pid / 10

If Pid > 255 Then
Pid = 255
End If

Pwm1a = Pid

Upperline
Lcd "Lubang = " ; Encounter ; "  " ; Detik

Lowerline
Lcd "RPM = " ; Rpm ; "  " ; Pid

Print Rpm

Errorx = Error

Loop

Getencoder:
  Waitms Debouncetime
  If Ch = 0 Then
     Incr Encounter

  End If
  Gifr = 64
Return

Int_timer0:
Incr Detak

If Detak > 0 Then
Detak = 0
Incr Detik1
End If

'nilai 197 adalah nilai counter untuk mencapai satu detik

If Detik1 > 197 Then
Detik1 = 0

Incr Detik

'mengubah ke RPM
'dikalikan 60 untuk mendapatkan nilai per menit
'dibagi 20 yaitu lubang encoder yang dipakai

Rpm = Encounter * 60
Rpm = Rpm / 10
Encounter = 0

End If

Return




f. VIDEO HASILNYA










No comments:

Post a Comment