Analog girişe göre 1-0 çıkış oranını değiştirmek.

Başlatan Melih1802, 08 Kasım 2015, 21:05:19

Melih1802

Arduino kurcalarken aklıma bir şey takıldı, Potansiyometre ile PWM duty oranını değiştirebiliyoruz, fakat ben bu çıkışın "0" kısmını potansiyometre ile kontrol ederek çok daha fazla uzatmak istersem nasıl yapmam gerekecek.

Standart pwm; _-_-_-_   -_-_-_- gibi.
Fakat benim yapmak istediğim "0" oranı pot tan ayarlanabilen __-_____-_____________-______________________________- gibi.

z

Pulse duration podulation yapmak istiyorsun.

pwm de duty değerine istediğin 1 süresini yükle.

Pwm frekansını belileyen registere istediğin değeri yükleyerek 0 süresini değiştirebilirsin. Artık duty ile değil timer taşma registeri ile oynayacaksın.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

OG

Anladığım kadarı ile
1 süresi sabit, 0 değişecek
bas:
PORT H
delay H süresi
PORT L
ADC oku
süre daha uzun gerekiyorsa okunanı bir sabit ile çarp, eldeki deger L suresi
delay L süresi
tekrar basa git
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Melih1802

Arkadaşlar bir kod satırı olsa daha kolay anlayabilirdim.

JOKERAS

Alıntı yapılan: Melih1802 - 08 Kasım 2015, 21:05:19
Arduino kurcalarken aklıma bir şey takıldı, Potansiyometre ile PWM duty oranını değiştirebiliyoruz, fakat ben bu çıkışın "0" kısmını potansiyometre ile kontrol ederek çok daha fazla uzatmak istersem nasıl yapmam gerekecek.

Standart pwm; _-_-_-_   -_-_-_- gibi.
Fakat benim yapmak istediğim "0" oranı pot tan ayarlanabilen __-_____-_____________-______________________________- gibi.
Melih1802 yapmak isteğiniz şey sanırım frekansı değiştirmek.PFM(Pulse Frekans Mode)
O işi modül olarak içinde barındıran işlemciler var,öyle hatılrıyom.
OG usta yazmış işte.



while(1) {
   AdcVal = Adc();
   LATBits.RA0 = 1;
   Delay(10);                 //Rising edge. _--                _--
   LATBits.RA0 = 0;
   Delay((AdcVal + 1)); //Falling edge.      ________      ________
   
}
Adc potunu oynadıkça Fall time değişir,Fall time uzadıkça frekans düşer.









Melih1802

Bu özelliği içinde barındıran Arduino var mı!.

Kabil ATICI

istediğini kullan, uno, mega....


@JOKERAS programı arduino için uyarlanırsa, aşağı yukarı aşağıdaki gibi bir kod olur...

yazılımsal olarak pwm üreten bir kod...
int pwm_pin=2; //pwm çıkış bacağı....
int pot_pin=A0;// potun bağlı olduğu bacak...
void setup() {
  // put your setup code here, to run once:
pinMode (pwm_pin,OUTPUT); ///pwm bacağı çıkışı olarak atanmış...
}

void loop() {
  // put your main code here, to run repeatedly:
int pot_deger;
pot_deger=analogRead(pot_pin);
digitalWrite (pwm_pin,HIGH);
delay (10);
digitalWrite(pwm_pin,LOW);
delay(pot_deger+1);
}


normalde bu işlem uno işlemcisi olan atmega328p ile donanımsal olarak da mümkündür. Ama bunun için doğrudan işlemcinin timer1 registerleri ile işlem yapabilmeniz ve kodlayabilmeniz gerekir.

En geniş olanağa sahip timer 1'dir ama bu timer arduino içinde delay fonksiyonunu oluşturmak için kullanılmaktadır.
ambar7

Melih1802

Bu kodlarla, HIGH süresi 1 sn LOW süresi pot ayarına bağlı olarak 0...60 sn arasında değişecek mi.

mehmet

Abi; transistör ile sinyali terslerseniz. Duty
oranı da 1 - 60 sn. arasında kalsa nasıl
olur?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

mehmet

Bu olabilir sanırım, ancak delay anlarında
işlemci hiç bir şey yapmaz. Bunu aşmak için
başka şeyler yapmak gerekecektir.

#define LED           13   // Led pini, hazır led
#define ENAZ_SIFIR    10
#define IGNE          100

uint16_t analogOku = 0;     // Analog okunacak degisken

void setup() 
{
  pinMode(LED, OUTPUT);     // Led pinini cikis yapıyoruz
  digitalWrite(LED, LOW);   // Pini sifira cekiyoruz
}

void loop() 
{
  analogOku = analogRead(A0);        // Sifir nolu analog pini okuyoruz(0..1023)
  digitalWrite(LED, HIGH);          // Ledi yakıyoruz
  delay(IGNE);                      // 100ms bekliyoruz 
  digitalWrite(LED, LOW);           // Ledi sonduruyouz 
  delay(analogOku + ENAZ_SIFIR);    // Analogdan okunan degeri gecikme olarak kullaniyoruz
                                    // +deger ile pottan okunan deger sifir oldugunda sinyalin
                                    // bozulmasini onlemek için ilave ediyoruz.
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

mehmet

Bu da "delay" fonksiyonu olmadan yapılan. Dolayısıyla
istenilen yere başka işlemlerde eklenebilir...
#define LED 13

unsigned long zamanOnce = 0;
unsigned long zamanSonra = 0;

uint8_t durum = 0;
uint8_t igne = 100;

void setup() 
{
  pinMode(LED, OUTPUT);     // Led pinini cikis yapıyoruz
  digitalWrite(LED, LOW);   // Pini sifira cekiyoruz
}

void loop() 
{
  zamanSonra = millis(); // o anki zaman mili saniye cinsinden alınıyor
  
  if((zamanSonra - zamanOnce) > igne) 
  {
    if(durum == 0)
    {
      digitalWrite(LED, LOW);
      durum = 1;
    }
  }
  //if(zamanSonra - zamanOnce > analogRead(A0) + (igne * 2))        //Bu durumda yaklaşık 1saniye
  if(zamanSonra - zamanOnce > (analogRead(A0) + (igne * 2)) * 3)   // istediğimiz sayı ile çarparsak yaklaşık olarak o kadar saniye elde ederiz (burada ~3 saniye)
  {
     if(durum == 1)
     {
      digitalWrite(LED, HIGH);
      durum = 0;
     }
     zamanOnce = zamanSonra; // eski zaman guncelleniyor
  }
  
  /*
   * Burada baska işlemler için devam edilebilir
   */
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Melih1802

#12
Arduino için mi bu kodlar.

mesaj birleştirme:: 13 Kasım 2015, 00:08:09

Çalıştı tam istediğim gibi.

mehmet

@Melih1802 Abi,  yine aklına takılan olursa
bakarız. Kolaylıklar.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr