Mosfetleri A4988 ile Sürmek

Başlatan berkay_91, 08 Temmuz 2020, 01:52:28

berkay_91

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;
}



sadogan

Delaylardan kurtulmalısın.
Timer kullanarak çözebilirsin.

berkay_91

timer kullansam bile sorun ADC okuması için geçen sürenin motorun akışını bozması

tunayk

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.