Şemadaki adc karşılaştırıcıyı modifiye etmek.

Başlatan Mr.Thinking, 06 Ekim 2022, 17:42:49

Mr.Thinking

Aşağıdaki bldc motor sürücü şemasında sensör yerine, tasarımcının da tabiri ile back-emf için adc karşılaştırıcı dirençler kullanılmış. Devredeki motor 12 volt olduğundan bu dirençler de ona göre hesaplanmış.
Fakat ben asenkron 3 faz 220 volt bir motor kullanmak istiyorum. Tüm risklerine rağmen 220volt için bu dirençleri nasıl hesaplamalıyım?

ego=1/Knowledge

bulut_01

YENİLMEZ..

Mr.Thinking

#2
ego=1/Knowledge

power20

#3
DC 12V yerine DC 311V verilecek.
Üretilecek dalgayı 3 faz ac (sanayi elektriği)  gibi yapacağız. bldc motor sürmek ile 3 faz gerilim üretmek farklı bir iş

 Mosfetler  değişecek.. izolasyon eklenecek.

Kısaca çok iş var direnç değiştirmekle olmaz

Mr.Thinking

Sadece ilk sorumun cevabına yanıt alsam olmaz mı? Lütfen
ego=1/Knowledge

power20

Gerilim bölücü emf voltajını 4.3 de bölerek karta uyguluyor. Motorun emf'sini bölerek kartın besleme sınırlarına getiriyor.

3 faz motorun emf değeri nedir? Onu da bölelim aynı voltaj olacak şekilde karta girelim. Kafadan dirençleri 20 kat arttıralım oranı tutturabiliriz

Mr.Thinking

Alıntı yapılan: Kılıç - 06 Ekim 2022, 18:23:13Gerilim bölücü emf voltajını 4.3 de bölerek karta uyguluyor. Motorun emf'sini bölerek kartın besleme sınırlarına getiriyor.

3 faz motorun emf değeri nedir? Onu da bölelim aynı voltaj olacak şekilde karta girelim. Kafadan dirençleri 20 kat arttıralım oranı tutturabiliriz

orada bir de uno nun 6 numaralı pinine giren bir düğüm noktası var. Tasarımcı bu düğüm noktasına sanal doğal nokta demiş. Orası ne olacak?
ego=1/Knowledge

Erhan YILMAZ

Basit gerilim bölücü formülü ile hesaplayabilirsin. 10K'ya R1 de 33K'ya da R2 de Vemf=12V de. Vin(Arduino)=12V*R1/(R1+R2)=2.79V olur. Vemf'yi 220V yap ona göre Vin'i 2.79V yapacak R1 ve R2 dirençlerini bulman gerek. Mesela R2=8K, R1=680k olsa Vin=220V*8K/(680k+8K)=2.56V olur.

Mr.Thinking

#8
Alıntı yapılan: Erhan YILMAZ - 06 Ekim 2022, 19:44:28Basit gerilim bölücü formülü ile hesaplayabilirsin. 10K'ya R1 de 33K'ya da R2 de Vemf=12V de. Vin(Arduino)=12V*R1/(R1+R2)=2.79V olur. Vemf'yi 220V yap ona göre Vin'i 2.79V yapacak R1 ve R2 dirençlerini bulman gerek. Mesela R2=8K, R1=680k olsa Vin=220V*8K/(680k+8K)=2.56V olur.
Ah keşke bu kadar basit olsa. Bir smps tasarımında +310 voltu iki sıra parlalel olmak uzere seri bağlı 3 adet 680k direnç ve sonunda da değerini hatirlamadigim bir gerilim bölücü dirençle smps entegresi ne bara gerilimi bilgisi okutulmustu. Bunu açıklar mısınız? Neyin nesi? Keşke hesapladiginiz kadar basit olsa zaten yaparım. Ama ortada çok değişik bir yapı var.
ego=1/Knowledge

power20

#9
 6 numaralı pinine giren bir düğüm noktası ve 33k dirençleri aynı kalacak Sadece motordan gelen 33k ve toprağa giden 10k değişecek.


Bu motorla yeni motorun EMF değerleri arasındaki farkı bilemediğimiz için hesap yapılamaz. EMF değeri besleme değeri gibi değildir.  Motor 12V beslemeli olsa da bobine kısa süreli gerilim verilse oluşan EMF belki 100Vtur. 3 faz motorda ise 1000V olabilir. sadece ismi belli olan motor için buradan hesap yapılmaz.

EMF ile bobinin uygulanan gerilime verdiği tepki ölçülüyor.

Mr.Thinking

İlk gönderdiğim şemanın yazılımı aşağıdadır. Devreye enerji verildiğinde yazılımda motor belli bir minumum devirde hemen dönmeye başlıyor. Bu yazılıma bir start bir stop tuşu ile başlatma ve durdurma ve saniyede 10 devir gibi çok düşük devirde ve soft bir şekilde rampalanarak başlaması için ne gibi eklemeler ve nerede ne değişiklikler yapmalıyız. Bilen arkadaşlar yardımcı olabilir mi?
/* Sensorless brushless DC (BLDC) motor control with Arduino UNO (Arduino DIY ESC).
 * This is a free software with NO WARRANTY.
 * https://simple-circuit.com/
 */
 
 
#define SPEED_UP          A0          // BLDC motor speed-up button
#define SPEED_DOWN        A1          // BLDC motor speed-down button
#define PWM_MAX_DUTY      255
#define PWM_MIN_DUTY      50
#define PWM_START_DUTY    100
 
byte bldc_step = 0, motor_speed;
unsigned int i;
void setup() {
  DDRD  |= 0x38;           // Configure pins 3, 4 and 5 as outputs
  PORTD  = 0x00;
  DDRB  |= 0x0E;           // Configure pins 9, 10 and 11 as outputs
  PORTB  = 0x31;
  // Timer1 module setting: set clock source to clkI/O / 1 (no prescaling)
  TCCR1A = 0;
  TCCR1B = 0x01;
  // Timer2 module setting: set clock source to clkI/O / 1 (no prescaling)
  TCCR2A = 0;
  TCCR2B = 0x01;
  // Analog comparator setting
  ACSR   = 0x10;           // Disable and clear (flag bit) analog comparator interrupt
  pinMode(SPEED_UP,   INPUT_PULLUP);
  pinMode(SPEED_DOWN, INPUT_PULLUP);
}
// Analog comparator ISR
ISR (ANALOG_COMP_vect) {
  // BEMF debounce
  for(i = 0; i < 10; i++) {
    if(bldc_step & 1){
      if(!(ACSR & 0x20)) i -= 1;
    }
    else {
      if((ACSR & 0x20))  i -= 1;
    }
  }
  bldc_move();
  bldc_step++;
  bldc_step %= 6;
}
void bldc_move(){        // BLDC motor commutation function
  switch(bldc_step){
    case 0:
      AH_BL();
      BEMF_C_RISING();
      break;
    case 1:
      AH_CL();
      BEMF_B_FALLING();
      break;
    case 2:
      BH_CL();
      BEMF_A_RISING();
      break;
    case 3:
      BH_AL();
      BEMF_C_FALLING();
      break;
    case 4:
      CH_AL();
      BEMF_B_RISING();
      break;
    case 5:
      CH_BL();
      BEMF_A_FALLING();
      break;
  }
}
 
void loop() {
  SET_PWM_DUTY(PWM_START_DUTY);    // Setup starting PWM with duty cycle = PWM_START_DUTY
  i = 5000;
  // Motor start
  while(i > 100) {
    delayMicroseconds(i);
    bldc_move();
    bldc_step++;
    bldc_step %= 6;
    i = i - 20;
  }
  motor_speed = PWM_START_DUTY;
  ACSR |= 0x08;                    // Enable analog comparator interrupt
  while(1) {
    while(!(digitalRead(SPEED_UP)) && motor_speed < PWM_MAX_DUTY){
      motor_speed++;
      SET_PWM_DUTY(motor_speed);
      delay(100);
    }
    while(!(digitalRead(SPEED_DOWN)) && motor_speed > PWM_MIN_DUTY){
      motor_speed--;
      SET_PWM_DUTY(motor_speed);
      delay(100);
    }
  }
}
 
void BEMF_A_RISING(){
  ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative input
  ACSR |= 0x03;            // Set interrupt on rising edge
}
void BEMF_A_FALLING(){
  ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative input
  ACSR &= ~0x01;           // Set interrupt on falling edge
}
void BEMF_B_RISING(){
  ADCSRA = (0 << ADEN);   // Disable the ADC module
  ADCSRB = (1 << ACME);
  ADMUX = 2;              // Select analog channel 2 as comparator negative input
  ACSR |= 0x03;
}
void BEMF_B_FALLING(){
  ADCSRA = (0 << ADEN);   // Disable the ADC module
  ADCSRB = (1 << ACME);
  ADMUX = 2;              // Select analog channel 2 as comparator negative input
  ACSR &= ~0x01;
}
void BEMF_C_RISING(){
  ADCSRA = (0 << ADEN);   // Disable the ADC module
  ADCSRB = (1 << ACME);
  ADMUX = 3;              // Select analog channel 3 as comparator negative input
  ACSR |= 0x03;
}
void BEMF_C_FALLING(){
  ADCSRA = (0 << ADEN);   // Disable the ADC module
  ADCSRB = (1 << ACME);
  ADMUX = 3;              // Select analog channel 3 as comparator negative input
  ACSR &= ~0x01;
}
 
void AH_BL(){
  PORTD &= ~0x28;
  PORTD |=  0x10;
  TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
  TCCR2A =  0x81;         //
}
void AH_CL(){
  PORTD &= ~0x30;
  PORTD |=  0x08;
  TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
  TCCR2A =  0x81;         //
}
void BH_CL(){
  PORTD &= ~0x30;
  PORTD |=  0x08;
  TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
  TCCR1A =  0x21;         //
}
void BH_AL(){
  PORTD &= ~0x18;
  PORTD |=  0x20;
  TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
  TCCR1A =  0x21;         //
}
void CH_AL(){
  PORTD &= ~0x18;
  PORTD |=  0x20;
  TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
  TCCR1A =  0x81;         //
}
void CH_BL(){
  PORTD &= ~0x28;
  PORTD |=  0x10;
  TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
  TCCR1A =  0x81;         //
}
 
void SET_PWM_DUTY(byte duty){
  if(duty < PWM_MIN_DUTY)
    duty  = PWM_MIN_DUTY;
  if(duty > PWM_MAX_DUTY)
    duty  = PWM_MAX_DUTY;
  OCR1A  = duty;                   // Set pin 9  PWM duty cycle
  OCR1B  = duty;                   // Set pin 10 PWM duty cycle
  OCR2A  = duty;                   // Set pin 11 PWM duty cycle
}
ego=1/Knowledge

Mr.Thinking

#11
Aşağıda ki ise projenin videosudur.

https://www.youtube.com/watch?v=2q0zsLUPKCY
ego=1/Knowledge

power20


yas

Devrenin eksikleri konusunda tartışmaya girmeden, şemada işaretli yerdeki 3 adet 33k direnç ile oluşturulan yıldız noktasının adc ile takip edilmesinin amacı yükün dengeli çalışıp çalışmadığını kontrol etmek için sağlama amaçlı kullanılıyor olabilir. Eğer A,B,C fazlarının sinyalleri aynı formada ve aralarında açı 120° ise bu yıldız noktadaki vektörel toplam sanal bir referans noktası olacaktır (bir nevi nötr gibi). Bu noktadaki potansiyel takip edilerek asimetri bozukluğu olup olmadığı teorik olarak takip edilebilir.
Not: İşin teorisi ile uygulama pratiği bazen tamamen örtüşmez. İllaki donanımsal iyileştirmelere ihtiyaç duyulacak yazılımla yapılacak iyileştirmelerin bir sınırı var. Sonuçta yerinde olmayan donanım söz konusu.

Erhan YILMAZ

Alıntı yapılan: Mr.Thinking - 06 Ekim 2022, 20:23:08Ah keşke bu kadar basit olsa. Bir smps tasarımında +310 voltu iki sıra parlalel olmak uzere seri bağlı 3 adet 680k direnç ve sonunda da değerini hatirlamadigim bir gerilim bölücü dirençle smps entegresi ne bara gerilimi bilgisi okutulmustu. Bunu açıklar mısınız? Neyin nesi? Keşke hesapladiginiz kadar basit olsa zaten yaparım. Ama ortada çok değişik bir yapı var.

Ne dediğini tam olarak anlamadım. Devre şeması varsa iyi olur.

Demek istediğim mantık gerilim bölücü mantığı. https://www.ti.com/lit/ug/tidueq9a/tidueq9a.pdf?ts=1665232318984 (Sayfa 14) Ti referans tasarım 54V BLDC. Bunlarda aynı gerilim bölücü mantığını kullanmışlar.

https://github.com/ErhanYILMAZ/emob_bldc/blob/main/design/hardware/altium/outputs/pdf/PDF/Schematic.pdf
Bende aynı tasarımı infineon mcu için yaptım. Benzer şekilde gerilim bölücü yapısını kullandım (Sayfa 4) çalışmıştı sensörsüz.

Hatta burada buldum. Tam senin aradığını nxp yapmış. 400V faz gerilimini gerilim bölücü ile 3.235V'a düşürmüş.

https://www.nxp.com/docs/en/user-guide/3PHACBLDCHVPSUG.pdf Sayfa 36