Sensörlü fırçasız motor komutasyonunda bekleme süresi.

Başlatan mr.selim, 02 Mart 2017, 20:01:56

mr.selim

Herkese iyi çalışmalar. Soru belkide bir çoğuna garip gelecek ama ben çok takıldım burdan da sormak istedim.

Fırçasız motoru şimdilik arduino da sürüyorum ir2103 lü devremiz, lab. tipi güç kaynağı ile şuan için sağlıklı çalışıyor. Komutasyonun içinde bulunan fonksiyonun çıkışında bir bekleme süremiz var. İşin ilginç yani ben bu bekleme süresini motorda nasıl tepki verdiğini hala çözemedim. 10 ms de titreme yapıyor 1ms de kalkışta zorlansada daha güzel ses çıkartıyor anca bunu 500us den daha ufak değerde tuttuğumda hem kalkışı zorlanıyor hemde çok akım çekmeye başlıyor ve güç kaynağı korumaya giriyor. Tamamen kaldırsam onu hiç kalkış olmayacak motoru yakacam diye endişe eder oldum. Pwm frekansı 4khz ayarlandı.  Sadece bu kısımda yardımcı olursanız sanırım devamında su yolunu bulacaktır. Teşekkürler iyi günler.

enum WheelDirection {		 // Yön belirleme ve durdurma.
C_CLOCKWISE,
CLOCKWISE,
DIR_STOP
};
void MoveWheel(WheelDirection (dir), int (speed))  		// komutasyon fonksiyonu
{
analogWrite(AfazPwm, 0); 		 //set motor to stop
analogWrite(BfazPwm, 0);
analogWrite(CfazPwm, 0);
digitalWrite(Afaz, HIGH);
digitalWrite(Bfaz, HIGH);
digitalWrite(Cfaz, HIGH);
int hall_a = digitalRead(hall_sensor_a);
int hall_b = digitalRead(hall_sensor_b);
int hall_c = digitalRead(hall_sensor_c);

if (dir == C_CLOCKWISE) 
{
if (hall_a == 1 && hall_b == 0 && hall_c == 0) {//001
analogWrite(CfazPwm, speed);
digitalWrite(Afaz, LOW);
}
else if (hall_a == 0 && hall_b == 1 && hall_c == 0) {//010
analogWrite(AfazPwm, speed);
digitalWrite(Bfaz, LOW);
}
else if (hall_a == 1 && hall_b == 1 && hall_c == 0) {//011
analogWrite(CfazPwm, speed);
digitalWrite(Bfaz, LOW);
}
else if (hall_a == 0 && hall_b == 0 && hall_c == 1) {//100
analogWrite(BfazPwm, speed);
digitalWrite(Cfaz, LOW);
} 
else if (hall_a == 1 && hall_b == 0 && hall_c == 1) {//101
analogWrite(BfazPwm, speed);
digitalWrite(Afaz, LOW);
}
else if (hall_a == 0 && hall_b == 1 && hall_c == 1) {//110
analogWrite(AfazPwm, speed);
digitalWrite(Cfaz, LOW);
} }   
         // 	delay(10);		                 // (ms) en çok gürültü
	//     delay(1);                         // (ms) tiz ses ideali bu gibi
                delayMicroseconds(250);       // (us) kalkışta daha çok zorlanma
}
void setup()
{ Serial.begin(115200);
  TCCR2B = TCCR2B & B11111000 | B00000010; // 3.9khz 3 & 11 frekans belirleme
  TCCR1B = TCCR1B & B11111000 | B00000010; // 3.9khz 9 & 10
  // TCCR1B = TCCR1B & B11111000 | B00000001; // 32khz
  // TCCR2B = TCCR2B & B11111000 | B00000001; // 32khz
pinMode(Afaz, OUTPUT);
pinMode(AfazPwm, OUTPUT);
pinMode(Bfaz, OUTPUT);
pinMode(BfazPwm, OUTPUT);
pinMode(Cfaz, OUTPUT);
pinMode(CfazPwm, OUTPUT);
pinMode(hall_sensor_a, INPUT);
pinMode(hall_sensor_b, INPUT);
pinMode(hall_sensor_c, INPUT);

}
void loop()
{
sensorValue = analogRead (PotPin);
outputValue = map(sensorValue, 0, 1023, 25, 230);
Cn = outputValue; //MOTOR DRIVE 
WheelDirection dir; // dir ile geri dönüş
if (Cn > 0)
dir = C_CLOCKWISE;
MoveWheel(dir, Cn);  }

skara1214

Sensörler düzgün yerdemi?  Yani sensör konumlamasi düşünse bekleme süresine ne gerek var?
Herkes ölür ama herkes gerçekten yaşamaz

mr.selim

Motorun kendi sensörleri var hocam. Bekleme süresi kısaldıkça motorun kalkınmaması çok zorlanıyor. Ölü zaman eklemeyi tam bilemediğim eklemiştim bunu en azından biraz zaman girsin araya diye ama sonra süre kısalınca motorda zorlanmalar oluyor.

mr.selim


Cemre.

@skara1214 hocamın dediği gibi sensörler doğru yerleştirilmişse komüstasyonda bir gecikme olmasının bir anlamı yok. Aksine yapılacak gecikme motorun sarsıntılı çalışmasına sebep olabilir. Benim tahminim kesme kullanılmadan yazılan programda sizin söylediğinizin aksine program içinde gecikmeler oluşuyor olması. Eğer imkan varsa motor dönerken PWM çıkışları ve hall sensör girişleri yüksek örnekleme hızında bir lojik analizör ile kontrol edilebilirse sorunu daha iyi anlayabiliriz. Tabi deneyi yaparken eklediğiniz gecikmeyi de hesaba katmak gerekiyor.

Ben çok yakın zamanda yaptığım deneyde tüm hall sinyallerini STM32'nin XOR (Encoder-Hall Effect) özelliğini kullanarak okudum. Bu sayede XOR çıktısının her yükselen kenarının bir komütasyon anına denk geldiği gerçeğine dayanarak komütasyon kesmesine gittim. Bahsettiğiniz sorunların hiçbirini yaşamadım.

mr.selim

Süreyi kısalttıkça motor kalkınması çok zorlanıyor tamamen kaldırmaya endişe etmemin sebebi o aslında. Gecikme sürelerini nasıl hesaplıcam her adım için süreleri tek tek toplamam saçma olsa gerek. Hall sensörlerin okumasını kesmelerle yapsam bu sorunu aşarmıyım ?

STM bilsem keşke de tam öğrenemedim arduino da daha yavaş işliyor da olabilir. Lojik analizör haftaya kadar elimde olucak inş. Görmem gereken şey yükselen kenarların birbirine eşit olduğu süreler mi olacak ?

Cemre.

Görmeniz gereken şey "HALL sensörlerin durumu değiştiği andan itibaren ne kadar süre sonra PWM çıkışlarınız konum değiştirebiliyor?".

Eğer bu süre fazla ise zaten sorun var demektir.

Tabii bu yanıtlar hall sensörlerin çok iyi konumlandırıldığı varsayımı ile veriliyor. Hata varsa zaten sizin de hata oranında düzeltme yapmanız doğru olan, daha önce de belirtildiği gibi.

Arduino'da deadtime insertion özelliği var mı bilemiyorum, bu nedenle anahtarlama frekansını düşük tutmanız iyi olmuş. Ancak donanıma daha iyi müdahale edebileceğiniz bir platformda çalışmak işinizi kolaylaştırır diye tahmin ediyorum.

Bu arada Arduino ile de lojik analizör yapılabiliyor. Bununla ilgili bir konu açmıştım forumda. Geçici olarak bir çözüm sunabilir.
https://www.picproje.org/index.php/topic,65943.msg513637.html

Kolay gelsin.

mr.selim

Alıntı yapılan: Cemre. - 02 Mart 2017, 21:10:20
Görmeniz gereken şey "HALL sensörlerin durumu değiştiği andan itibaren ne kadar süre sonra PWM çıkışlarınız konum değiştirebiliyor?".

Eğer bu süre fazla ise zaten sorun var demektir.

Tabii bu yanıtlar hall sensörlerin çok iyi konumlandırıldığı varsayımı ile veriliyor. Hata varsa zaten sizin de hata oranında düzeltme yapmanız doğru olan, daha önce de belirtildiği gibi.

Arduino'da deadtime insertion özelliği var mı bilemiyorum, bu nedenle anahtarlama frekansını düşük tutmanız iyi olmuş. Ancak donanıma daha iyi müdahale edebileceğiniz bir platformda çalışmak işinizi kolaylaştırır diye tahmin ediyorum.

Bu arada Arduino ile de lojik analizör yapılabiliyor. Bununla ilgili bir konu açmıştım forumda. Geçici olarak bir çözüm sunabilir.
https://www.picproje.org/index.php/topic,65943.msg513637.html

Kolay gelsin.

Bu süre ne kadardan fazla ise sorun çıkartır ?

dead time olayı arduino da yok gibi o yüzden ir2103 kullanmıştım kendi içindeki var düşük frekansda sorun yaşamam belki diye ama tutturamadım sanırım.
motor yeni diye biliyorum umarım doğru biliyoruzdur başkaa motorlarda da denemeye çalışıcam. Stm i öğrenmeye çalışıcam, bir aylık bir süre ile temel seviye kurtarır mı beni dersiniz ?

cevaplarınız için teşekkür ederim.


mr.selim

Alıntı yapılan: bulutay - 02 Mart 2017, 23:05:21
süreyi kaldır


belirttiğim gibi ilk kalkışta zırıltı çıkarıyor ve akım çekiyor

Cemre.

Alıntı yapılan: mr.selim - 02 Mart 2017, 22:39:32
Bu süre ne kadardan fazla ise sorun çıkartır ?

dead time olayı arduino da yok gibi o yüzden ir2103 kullanmıştım kendi içindeki var düşük frekansda sorun yaşamam belki diye ama tutturamadım sanırım.
motor yeni diye biliyorum umarım doğru biliyoruzdur başkaa motorlarda da denemeye çalışıcam. Stm i öğrenmeye çalışıcam, bir aylık bir süre ile temel seviye kurtarır mı beni dersiniz ?

cevaplarınız için teşekkür ederim.

Motorun çalışma prensibini düşünün.

Motor herhangi bir pozisyonda iken herhangi iki ucuna gerilim uygulayın. Rotor en uygun pozisyona doğru hareket edecek ve orada kilitlenecektir. Bu sırada sargılardan kısa devre akımı akacaktır.

Siz uygulamanızda rotor en uygun pozisyona geldiğinde bir sonraki fazı enerjilendirmek yerine bir süre daha bekliyorsunuz. Rotorun ataleti sayesinde bu pozisyon geçildiyse bu kez kısa bir süre dönüş yönüne ters yönde moment üretilecek ve rotor bu sürenin uzunluğuna göre fren yapacak hatta ters yöne dönecektir. Bu şekilde bir çalışma asla istemeyeceğimiz bir durum. Bu yüzden hiç gecikme olmadan sıradaki fazı enerjilendirecek bir yapıyı oturtmak zorundasınız. STM veya Arduino kısmını bilemeyeceğim.

mr.selim

Alıntı yapılan: Cemre. - 02 Mart 2017, 23:41:17
Motorun çalışma prensibini düşünün.

Motor herhangi bir pozisyonda iken herhangi iki ucuna gerilim uygulayın. Rotor en uygun pozisyona doğru hareket edecek ve orada kilitlenecektir. Bu sırada sargılardan kısa devre akımı akacaktır.

Siz uygulamanızda rotor en uygun pozisyona geldiğinde bir sonraki fazı enerjilendirmek yerine bir süre daha bekliyorsunuz. Rotorun ataleti sayesinde bu pozisyon geçildiyse bu kez kısa bir süre dönüş yönüne ters yönde moment üretilecek ve rotor bu sürenin uzunluğuna göre fren yapacak hatta ters yöne dönecektir. Bu şekilde bir çalışma asla istemeyeceğimiz bir durum. Bu yüzden hiç gecikme olmadan sıradaki fazı enerjilendirecek bir yapıyı oturtmak zorundasınız. STM veya Arduino kısmını bilemeyeceğim.

Haklısınız olması gereken o ancak benim kafamı karıştıran 1ms olunca güzel çalışmaya başlaması ama bunu 250 us yapınca zırıldamanın artması ? motor 1ms önce olunça rahat kalkış yapamıyor yoksa eklemicektim.

Merak ettiğim birşey daha var. Bekleme sürelerinin hiç olmaması analog okuma ve yazmada döngü içinde (pwm ve hall okumada) sıkıntı çıkarır mı ?

Cemre.

Güzel çalışmaya başlaması ne demek?
Bu tip açık çevrim kontrollü sürüş tekniklerinde motor kalkış akımının yüksek olması olağan bir durum. Söylediklerinizin olması ya da olmaması için bir sürü neden var.

mr.selim

Alıntı yapılan: Cemre. - 02 Mart 2017, 23:51:59
Güzel çalışmaya başlaması ne demek?
Bu tip açık çevrim kontrollü sürüş tekniklerinde motor kalkış akımının yüksek olması olağan bir durum. Söylediklerinizin olması ya da olmaması için bir sürü neden var.

İşte açık çevrime göre güzel hiç yoktan iyi bir kalkış oluyor anlamında güzel dedim. evet bir sürü neden olabiliyor ama ben 3 farklı süre için dedim bunları zaten geriye kalan herşey eşit durumda. Süreyi kaldırıp ölçüm yapmak gerek en iyisi. Teşekkürler cevaplarınız için

Cemre.

Geriye kalan herşeyin eşit olduğundan emin misiniz? Rotorun ilk enerjilendirme anındaki pozisyonu bile bu farkları yaratabilecekken bence emin olmayın.

Yazılımsal olarak hall sensörlerin son halini bir değişkene kaydedip eger bir değişiklik yoksa fonksiyondan çıkacak bir gelistirme yaparsanız muhtemelen gecikme ekleme vs sorununu çözer.