Şimdi Ara

Oransal Geribesleme (P) ile DC motor kontrolü..

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
4
Cevap
0
Favori
1.510
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Öncelikle Hepinize hayırlı akşamlar dilerim.


    Açık çevrim olarak çalıştırabildiğim , ve çıkışta hızını motorun arkasındaki encoder ile çalıştırabildiğim bi motor sürme devrem var... 16f877 PIC kullanıyorum , motoru pwm çıkışına bağladığım transistör ile sürüyorum , motorun çıkışında bulunan encoder ile saniyede gelen pulse sayısına bağlı olarak pic'e hız okutup LCD'ye bastırabiliyorum RPM değerini...

    Şu anda benim referans değer ile encoder'dan okunan hız bilgisi arasındaki hatayı hesaplayarak , sistemin o hatayı otomatik olarak düzeltmesini sağlamak (P KONTROL MANTIĞI İLE)...

    Yazdığım program ve proteus şeması aşağıdadır , sistem bir türlü kararlı çalışmıyor...

    Sistemin matematiksel modellenmesi ile ilgili bi kaç bilgi vereyim..

    Motor 12V DC gerilim ile çalışıyor.
    Encoder 1 turda 24 pulse veriyor.
    Motor 12V %100 doluluk oranında verildiğinde yaklaşık 3000 Devir/dk ile dönüyor.
    Buradan 12V DC'de 3000*24 Pulse / dakika = 3000*24/60) Pulse / Saniye = 1200 Pulse / saniye ediyor.
    Devir/dk ile pulse/saniye arasında Dev/dk = Pulse/sn * 2.5 denklemi elde edilmiş vaziyette.
    Ben gelen pulse ları 2.5 saniyede bi saydırdığım için , elde ettiğim toplam pulse sayısı Devir/Dakika'ya eşit oluyor.
    Motor sürülürken PWM doluluk oranı ayarlanıyor[0-299 arası] .
    Örneğin Duty Cycle 150 iken motor 1500 RPM ile , duty cycle 200 iken motor 2000 RPM ile , duty cycle 299 iken motor 2990 RPM ile (yaklaşık 3000) dönüyor , Yani lineer bi sistem oluşturulmuş vaziyette.


    Yardımcı olabilecek arkadaşlara şimdiden teşekkür ediyorum.

    Program ve Proteus şemasının olduğu link-->http://www.dosyaupload.net/90bitirmeNEW.rar



    CCS C ile yazılmış program da aşağıdaki gibidir..

    ****************************************************************************************************************************
    // Program;Kubilay Hocam için özen ile yazılmıştır,eşi benzeri bulunamaz.
    #include <16f877.h>
    #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

    #use delay (clock=4000000)

    #define use_portb_lcd TRUE
    #include <lcd.c>

    #use fast_io(a)
    #use fast_io(b)
    #use fast_io(c)

    #priority timer0,timer1 //Timer0(pulse sayma),Timer1(zaman)'dan daha öncelikli.

    int timer_flag=0;
    int16 dutinew;
    int16 hata=0;
    int16 duti=200; //Değişkenler Tanımlanıo.
    int32 time=0;
    int32 pulse=0;
    int32 rpm=0;

    #int_timer1
    void zaman()
    {
    set_timer1(3036);
    time++;
    if(time==5) //62500*8*5 uS = 2.5 saniye
    {
    timer_flag=1;
    }
    }

    #int_TIMER0
    void timer0(void)
    {
    set_timer0(255); // (256-255)*1=1 , her seferde bi kesme oluşuo
    pulse++;
    }

    void main ( )
    {
    setup_psp(PSP_DISABLED);
    setup_spi(SPI_SS_DISABLED);
    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_CCP2(CCP_OFF);

    setup_ccp1(CCP_PWM); // CCP1 birimi PWM çıkışı için ayarlandı
    set_pwm1_duty(duti); // PWM1 çıkışı görev saykılı belirleniyor

    set_tris_b(0x00); // b portu komple çıkış
    set_tris_c(0x00); // c portu komple çıkış
    set_tris_a(0x13); // RA0 ve RA1 ra4 pinleri giriş

    output_b(0x00);

    setup_timer_2(T2_DIV_BY_1,74,1); // 13.333 kHZ , 0<DutyCycle<299
    //74*4+3=299
    setup_timer_0(RTCC_ext_l_to_h | RTCC_DIV_1); //her pulse da 1 kesme
    setup_timer_1(T1_internal | T1_DIV_BY_8); // 0.5 sn de bi kesme

    set_timer1(3036);
    set_timer0(255);

    enable_interrupts(INT_TIMER0); //timer0 kesmesi aktif , zaman sayiyo
    enable_interrupts(INT_timer1); // timer1 kesmesi aktif , pulse sayıyo
    enable_interrupts(GLOBAL); // aktif edilen kesmeler etkinleştiriliyo

    lcd_init();

    while(1) // Sonsuz döngü
    {



    if(timer_flag==1)
    {
    rpm=pulse; // 2.5 sn de gelen Pulse sayisi , RPM'e esittir.

    hata=duti-(rpm/10);
    dutinew=hata+duti; //yeni duty degeri
    if(dutinew>=298)
    dutinew=298;
    if(dutinew<25)
    dutinew=25;

    set_pwm1_duty(dutinew); //yeni duty degeri yukleniyor

    printf(lcd_putc,"\fHiz=%ld R=%ld\nHata=%ld",rpm,duti*10,hata*10); // lcdye yazdirma
    time=0; pulse=0; rpm=0; timer_flag=0; // bi sonraki 2.5 sn için değişkenler sıfırlanıyo
    }

    if (input(pin_a0)) // Eğer RA0 girişine bağlı butona basılırsa
    {
    delay_ms(20); // Buton arkı önleme gecikmesi
    while(input(pin_a0)); // Basılı butondan el çekile kadar bekle
    duti+=10; // duti=duti+10 anlamındadır.

    if (duti>=298) // duty değeri 298'den büyükse duti 298 olsun
    duti=298;

    set_pwm1_duty(duti); // PWM1 çıkışı görev saykılı belirleniyor
    }

    if (input(pin_a1)) // Eğer RA1 girişine bağlı butona basılırsa
    {
    delay_ms(20); // Buton arkı önleme gecikmesi
    while(input(pin_a1)); // Basılı butondan el çekile kadar bekle
    duti-=10; // duti=duti-10 anlamındadır.

    if (duti<40) // duti değeri 40'den küçük ise duti 40 olsun
    duti=40;

    set_pwm1_duty(duti); // PWM1 çıkışı görev saykılı belirleniyor
    }
    }

    }

    ****************************************************************************************************************************



    < Bu mesaj bu kişi tarafından değiştirildi forumaniaDo -- 28 Haziran 2010; 23:48:37 >







  • yok mu hiç bi fikri olan arkadaşlar ?

    dutinew=Kp*hata; mı yapmam lazım acaba ? kitaplarda öğretilen oransal mantıktaki gibi..?

    fakat
    Durum1: referans değer 2000 ise ve motor 500 rpm ile dönüyosa
    Durum2: referans değer 2000 ise ve motor 1950 rpm ile dönüyosa

    bu iki durumu aynı anda kapsayacak bi Kp katsayısı seçmek imkansız gibi gözüküyo bana ..?
  • up..
  • Sanırım program (ç)alıntı yarı ingilizce yarı türkçe acayip bir şey olmuş.oransal kontrolde P=hata X oransal kazanç tır.internette,kitapta her yerde aynıdır.Sadece oransal kontrolle kararlı bir sistem elde edemezsiniz denkeme I terimi eklemeniz lazım.bknz : integral kontrol
  • Yapay Zeka’dan İlgili Konular
    Dc Motor Hız Kontrol Devresi
    2 yıl önce açıldı
    12v dc motor seçimi?
    10 yıl önce açıldı
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.