PID Kontrol CCS Kodları

Başlatan mekatronica, 08 Nisan 2012, 01:47:13

mekatronica

Merhaba PID kontrol ve PWM kullanan bir motor sürücüsü tasarlayacağım fakat PID konusunda çok bilgim yok bu konuda yardım edebilirmisiniz?

pax



mekatronica

Çok teşekkür ederim fakat anlamadığım nokta daha farklı her iki motor için ayrı ayrı pid yapmamız gerekmiyor mu?

pax

#4
yapılabilir. sonuçta pid algoritmasını 1 motor için yazabilirseniz diğer motor için de ayrı bir algoritma hazırlayabilirsiniz. motor sürücüsünü ne için kullanacağınıza bağlı. çünkü motor sürücüsüne PID sonucunda elde ettiğiniz doğrulama verisini PWM olarak gönderirsiniz. iki motorun PWM i farklı değer de hesaplanabileceği gibi aynı değer de olabilir. yapacağınız işe göre durum değişir.

mhmtklhci

arkadaşlar bu konularda yeniyimde PID kontrolu nedir ?

EmaNet


mekatronica

.
Alıntı yapılan: EmaNet - 08 Nisan 2012, 23:22:42
PID Kontrol işini görecektir.

http://www.koumekatronik.com/media/kunena/attachments/775/HAFTA13.pdf

EmaNet çok teşekkür ederim aradığım bütün sorulara cevap oldu herşey için çok teşekkürler

EmaNet

Önemli değil. Problemi çözdüğüne çok sevindim.

datasheet

Alıntı yapılan: EmaNet - 08 Nisan 2012, 23:22:42
PID Kontrol işini görecektir.

http://www.koumekatronik.com/media/kunena/attachments/775/HAFTA13.pdf

şu pdf e bakamadım sayfa silinmiş ,arkadaşlar örnek bir kod eklermisiniz ?

pisayisi

Misra c tabanlı bir pid algoritması

#include"pid.h"
//²ÉÓÃÔöÁ¿Ê½¼ÆËã,²ÉÑùÖÜÆÚΪTʱ¼ä,Êä³öÔò²ÉÓÃλÖÃʽµÄÊä³öĞÎʽ,
//¢Ù:Y=P*E+I*(E+E1+E2)+D*((E-2*E1+E2));  //ĞŞÕıÖµ=±ÈÀı·Å´ó+»ı·Ö·Å´ó+΢·Ö·Å´ó
//¢Ú:Y = P + I + D;
//P = kp * e(n);
//I = Ki *( e(n) + e(n-1) + e(n-2) );
//D = Kd * ( e(n)-e(n-1) );
//¼´:y=P*E+I*(E+E1+E2)+D*(E-E1);

double PID_ADJ(PID *S, double x, double y)//Óõķ½·¨¢Ú
{
	double Out = 0;
	
	S->Err2 = S->Err1;
	S->Err1 = S->Err;
	S->Err = S->SetPoint - y;

	Out = x + S->P * S->Err + S->I * (S->Err + S->Err1 + S->Err2) + S->D * (S->Err - 2 * S->Err1 + S->Err2);
	return (Out);
}

void PID_Init(PID *S, double Piont, double P, double I, double D)
{
	S->SetPoint = Piont; //Ä¿±êÖµ
	S->P = P;	 //±ÈÁĞϵÊı
	S->I = I;	 //΢·Ö
	S->D = D;	 //»ı·Ö
	S->Err = 0.0;  //µ±Ç°Îó²î
	S->Err1 = 0.0; //ÉÏ´ÎÎó²î
	S->Err2 = 0.0;//ÉÏÉÏ´ÎÎó²î	
}


#ifndef _PID_H_
#define _PID_H_

#include"sys.h"

typedef struct PID
{
	double SetPoint;  //É趨Ŀ±ê

	double P;//±ÈÀı³£Êı
	double I; //»ı·Ö³£Êı
	double D;//΢·Ö³£Êı

	double Err;
	double Err1; //Error[-1]
	double Err2; //Error[-2]
}PID;

void PID_Init(PID *S, double Piont, double P, double I, double D);
double PID_ADJ(PID *S, double x, double y);


#endif
Murat

Okan AKÇA

Bu günlerde bende pid üzerine motor kontrol ünitesi tasarlamaktayım  bütün işleri kendi yazdıgım  kodlarla pid  olarak çalıştırıyorum.

Murat Mert

Alıntı yapılan: cyclone - 06 Şubat 2013, 17:31:47
Bu günlerde bende pid üzerine motor kontrol ünitesi tasarlamaktayım  bütün işleri kendi yazdıgım  kodlarla pid  olarak çalıştırıyorum.

ne tür motorlar kullanıyorsunuz?
mert07

Okan AKÇA

fırcalı dc motor kullanıyoruz hocam 80w 3350 devir 30nm tork

Mucit23

Hocam Pid ile ilgili bende bir çalışma yapacam. Bu katsayılar benim kafamı karıştırıyor. Bende ufak 12V ufak bir motorun devrini sabitlemeye çalışacağım. Pid işlemi sonucunda elimde 0-1000 arası bir değer olmalı. Devir ise 500 ile 3000 arasında değişebilir.

Çıkışın bu aralıkta olmasını nasıl belirliyoruz?
Katsayılar nasıl nasıl belirleniyor ?

Cevaplarsanız sevinirim.