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.
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.
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
https://code.google.com/p/arduino-pwm-frequency-library/downloads/list
Sanırım bu işine yarayacak Melih Abi...
Arkadaşlar bir kod satırı olsa daha kolay anlayabilirdim.
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.
Bu özelliği içinde barındıran Arduino var mı!.
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.
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.
Abi; transistör ile sinyali terslerseniz. Duty
oranı da 1 - 60 sn. arasında kalsa nasıl
olur?
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.
}
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
*/
}
Arduino için mi bu kodlar.
mesaj birleştirme:: 13 Kasım 2015, 00:08:09
Çalıştı tam istediğim gibi.
@Melih1802 Abi, yine aklına takılan olursa
bakarız. Kolaylıklar.