Picproje Elektronik Sitesi

ENDÜSTRiYEL OTOMASYON => Güç Elektroniği => Konuyu başlatan: berkay_91 - 08 Temmuz 2020, 01:52:28

Başlık: Mosfetleri A4988 ile Sürmek
Gönderen: berkay_91 - 08 Temmuz 2020, 01:52:28
Merhaba, 4 adet mosfet (IRL540N) ve mikrodenetleyici kullanarak unipolar step motor sürücüsü yaptığımda hız kontrolünü pottan aldığım bilgiyi dijitale çevirerek, i/o pinlerindeki delay süresine eşitleyerek sağladım... mosfetleri Atmega8A da belirlediğim 4 adet pini sırası ile high low yaparak sürdüm ancak dönme fonksiyonlarındaki analog okuma yüzünden pinlerin eşit zaman aralıklarında tetiklenememesi problemi yüzünden motorda dönüş esnasında titremeler olmuştu. bunun üzerine mosfetleri A4988 ile tetiklemek nasıl olur diye sormak istiyorum?

Doğrudan A4988 modülü ile step motoru kontrol etmek istemiyorum çünkü kendisi yüksek akım sağlayamıyor, mosfetleri A4988 ile sürdüğümde bu modülü mikrodenetleyicide oluşturduğum PWM sinyalleri ile kontrol edeceğim yani hız kontrolünü PWM sinyallerinin frekansını değiştirerek yapmak istiyorum, böylelikle analog okuma esnasında PWM sinyalleri üretilmeye devam edeceği için yukarıda anlattığım ilk sorunla karşılaşmayacağımı düşünüyorum...

bazı arkadaşlar Mosfet sürücü diye bir şey var duydun mu? diyecek biliyorum, onlara şimdiden şu soruyu sormak istiyorum derdim sadece tek bir pinden PWM sinyalleri üretip bu sinyallerin frekansını değiştirerek step motorda hız kontrolü yapmak ve bunu yaparken potansiyometre kullanmak, bu mekanizmayı mosfet sürücüler ile nasıl sağlarım?

#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>

volatile int v[4] = {3, 6, 12, 9}, temp;

int Read_adc();
void saga_don();
void sola_don();
void adc_init();
void gecikme(int);

int Read_adc() {
  ADCSRA |= 0x40; // start the adc conversion
  while (ADCSRA & 0x40);
  return ADCW; // ADCW = adc low bits + adc high bits
}

void saga_don() {
  while (bit_is_clear(PINB, 4)) {
    for (int i = 0; i <= 3; i++) {
      PORTB = v[i];
      gecikme(temp);
      _delay_us(1800);
    }
    temp = Read_adc();
  }
  PORTB = 0x00;
  _delay_ms(500);
}

void sola_don() {
  while (bit_is_clear(PINB, 5)) {
    for (int j = 3; j >= 0; j--) {
      PORTB = v[j];
      gecikme(temp);
      _delay_us(1800);
    }
    temp = Read_adc();
  }
  PORTB = 0x00;
  _delay_ms(500);
}

void adc_init() {
  ADMUX = 0x45;
  ADCSRA = 0x83;  // prescalar is used 8
}

void gecikme(int z) {
  for (int k = 0; k <= z; k++)
    _delay_us(15);
}

int main() {
  DDRB = 0x0f;
  adc_init();

  while (1) {
    if (bit_is_set(PINB, 5)) 
      saga_don();
    else if (bit_is_set(PINB, 4))
      sola_don();

    temp = Read_adc();
    _delay_ms(50);
  }
  return 0;
}



Başlık: Ynt: Mosfetleri A4988 ile Sürmek
Gönderen: berkay_91 - 08 Temmuz 2020, 19:56:37
Güncel
Başlık: Ynt: Mosfetleri A4988 ile Sürmek
Gönderen: sadogan - 08 Temmuz 2020, 20:51:33
Delaylardan kurtulmalısın.
Timer kullanarak çözebilirsin.
Başlık: Ynt: Mosfetleri A4988 ile Sürmek
Gönderen: berkay_91 - 08 Temmuz 2020, 22:38:10
timer kullansam bile sorun ADC okuması için geçen sürenin motorun akışını bozması
Başlık: Ynt: Mosfetleri A4988 ile Sürmek
Gönderen: tunayk - 08 Temmuz 2020, 23:37:56
Adc okuma süresi motor çevrim süresi yanında hiç birşey. Motor sürme pin değişimlerini timer ve interrupt ile yapmadığınız sürece dikiş tutturamazsınız. Adc de yine interrupt ile okunur. Böylece herşeye  zaman yeter.