PWM: Arduino kartınızla analog pinleri taklit etme

PWM sinyalleri

Arduino kartınızda kullanabileceğiniz dijital ve analog pinler ile elektronik projelerinizden verileri kontrol etmek veya almak için elektrik sinyalleri alabilir veya gönderebilirsiniz. Ek olarak, bu tür plakalarda çok ilginç başka sinyaller de var ve bunlar PWM, aslında analog olmadan bir analog sinyali taklit edebilir. Yani, analog sinyale benzer şekilde (aynı şekilde değil) hareket edebilen dijital pinlerdir.

Bu tür sinyaller, yalnızca dijital YÜKSEK ve DÜŞÜK sinyalleri, yani 1 veya 0, AÇIK ve KAPALI kullanmak istemediğinizde, aynı zamanda daha ileri gitmek ve açıklamak istediğinizde çok pratiktir. biraz daha karmaşık sinyaller. Örneğin, bir hızın modüle edilmesi mümkündür. DC motoruveya bir solenoid vb. için bir ışığın ışık yoğunluğu.

Analog ve dijital sistem

Analog ve dijital sinyal

Elektronik devreler iki büyük aileye veya kategoriye ayrılabilir: dijital ve analog. Dijital elektronikten bahsederken, işlenen bitlerin durumunu yorumlamak için ayrık değerlere sahip miktarları, yani düşük veya yüksek voltajlı elektrik sinyalleri ile temsil edilen ikili bir sistem kullanıyoruz. Öte yandan, bir analog devre söz konusu olduğunda, sürekli değerlere sahip nicelikler kullanılmaktadır.

Dijital sistemler içinde sırayla bulunabilir kombinasyonel tipte olanlar ve sıralı tipte olanlar. Yani, birincisi, sistemin çıktısının yalnızca girdilerin durumuna bağlı olduğu durumlardır. Öte yandan, sıralı olanlarda bellek elemanları dahil edilir ve çıktı, girişlerin mevcut durumuna ve depolanan önceki duruma bağlı olacaktır.

Analoglar söz konusu olduğunda, bu iki büyük grup veya varyant yoktur, çünkü burada bunlar her zaman bağlı olacak sürekli sinyallerdir. sinyal mevcut sistem. Örneğin, bir hoparlörde sağladığınız sinyal, yeniden oluşturmak istediğiniz sese bağlıdır. Aynı şey, aldığı sese bağlı olarak bir analog sinyal oluşturacak olan bir mikrofon için de geçerlidir. Elbette, bu blogda tanımladığımız ve analog sinyallerle hareket eden diğer birçok sensörle de görmüşsünüzdür (ve bu nedenle, daha sonra değerlerin Arduino IDE çizimlerinde hesaplanabilmesi veya koşullandırılabilmesi için bir formül oluşturulması gerekiyordu. ) ...

Birinin ve diğerinin bu özellikleri, bazılarının kendilerine avantajlar ve dezavantajlarhemen hemen her şeyde olduğu gibi. Örneğin, dijital olanlar daha ucuz, daha hızlı, daha kolay geliştirilebilir, bilgi daha kolay depolanabilir, daha yüksek doğrulukta, programlanabilir, gürültünün etkilerine karşı o kadar savunmasız değildir, vb. Ancak analoglarla daha karmaşık sinyallerle çalışabileceğiniz de doğrudur.

tarafından örnekDijital tip bir Hall etkisi sensörü, yalnızca yakındaki bir manyetik alanın varlığını veya yokluğunu algılayabilir. Bunun yerine, bir analog Hall etkisi sensörü bunu yapabilir ve ayrıca çıkışında ürettiği bir analog sinyal sayesinde söz konusu manyetik alanın yoğunluğunu belirleyebilir. Bu yüksek veya düşük voltaj sinyalini nasıl iyi yorumlayacağınızı bilerek, bu büyüklüğü kolayca bilebilirsiniz. Sıcaklık, zaman, basınç, mesafe, ses vb. Gibi analog bir sistemle niceliksel olarak ölçebileceğiniz çok sayıda doğada başka örnekleriniz var.

Analog ve dijital sinyal

Bununla birlikte, bir analog sinyal Zamanla ve sürekli olarak değişen bir voltaj veya elektrik akımı olacaktır. Grafiği çizilirse, analog sinyal tek frekanslı bir sinüs dalgası olacaktır.

Gibi dijital sinyal, zamana göre kademeli olarak değişen bir voltajdır. Yani, bir grafikte gösteriliyorsa, sürekli olarak değişmeyen, ancak adımlarda veya ayrı artışlarda değişen bir adım sinyali olacaktır.

Analog sinyalden dijitale veya tam tersine giden devreler olduğunu bilmelisiniz. Bunlar dönüştürücüler DAC (Dijitalden Analog Dönüştürücü) ve ADC (Analogdan Dijitale Dönüştürücü) olarak bilinirler. Ve bugün kullandığımız TV, bilgisayar vb. Gibi birçok cihazda çok yaygındır. Onlarla, bu ekipman tarafından kullanılan dijital sinyalleri, analog olarak çalışan diğer çevre birimleri veya parçalarla çalışmak için elektronik bir düzeye dönüştürebilirsiniz.

tarafından örnek, bir ses kartı ile çalışan analog sinyallere sahip bir hoparlör veya mikrofon veya analog monitör bağlantı noktaları için ünlü RAMDAC yongasına sahip dijital grafik kartları ... Arduino'da bu tip dönüştürücüler, ileride göreceğimiz gibi birden fazla proje için de kullanılıyor. ..

PWM nedir?

grafik görev döngüsü

Rağmen PWM (Darbe Genişlik Modülasyonu) veya darbe genişlik modülasyonu, bir dijital tabana sahiptir, sinyalinin şekli bir şekilde "kare" analog sinyale benzer. Daha önce yorumladığım gibi, bir analog sistemi taklit etmek için dijital darbeler aracılığıyla sinyali değiştirmeye izin verir. Aslında isme bakarsanız, dijital darbelerin genişliği aracılığıyla size zaten ne yaptığına dair ipuçları veriyor.

Bu için faydalıdır Arduino Projelerinize ekleyebileceğiniz birçok otomatizm veya elektronik bileşen olduğundan ve gerçek bir analog sinyal sağlayamazlar, ancak bu PWM'yi çalıştırmak için kullanıyorlar. Ayrıklaştırılmış bir analog sinyal de kullanamazlar, yani voltaj sıçramalarına dijital olana benzemek için giderler. Yapabilecekleri, bu özel sinyali üretmek için dijital tipte bir dijital çıktı -Vcc veya Vcc kullanmaktır ...

Bu nedenle, PWM, Arduino ve diğer sistemlerin bu tür sinyallerle birlikte çalışabileceği bir tür "hile" dir. ne tam olarak analog ne de geleneksel dijital. Bunu mümkün kılmak için, her zaman ilgiye bağlı olarak bir dijital çıkışı belirli bir süre aktif veya kapalı tutarlar. Bu, darbeleri aynı genişliğe sahip olan dijital saat veya ikili kod sinyalinden çok uzaktır.

Arduino ile projelerinizde, zaman içinde sabit bir darbe tetik frekansının korunduğu bu tür PWM sinyallerini kontrol edebilirsiniz, ancak bu darbelerin genişliği değişkendir. Aslında, döngünün toplamına göre bir sinyal yüksek tutulduğunda buna Görev Döngüsü denir. Bu nedenle, Görev Döngüsü% olarak verilmiştir.

Bir PWM'de, bir analog sinyalde olduğu gibi, birkaç voltaj değeri arasında çalışmadığınızı ve bunlar arasında dalgalandığını unutmayın. PWM durumunda, dijital tarzda bir kare sinyaldir ve maksimum değeri Vcc olan. Örneğin, 3V'luk bir güç kaynağıyla çalışıyorsanız, 3V veya 0V darbeleri verebilirsiniz, ancak 1V veya gerçek bir analogda olduğu gibi başka bir ara değer veremezsiniz. Bu durumda değişen, o yüksek Vcc değerinde% 30 veya daha fazla güç vermek için% 60 oranında tutabileceğimiz darbe genişliğidir.

Ancak dikkatli olun, çünkü bir cihaz bir Vcc sınırını destekliyorsa ve PWM ile aşılırsa hasar görebilir. Bu nedenle, üreticiler tarafından sağlanan veri sayfalarının değerlerine her zaman saygı duyulması gerekecektir. Ayrıca DC motorlar gibi bazı cihazlarda, röleler, elektromıknatıslar vb., bir Görev Döngüsünden sonra gerilimin çekilmesi, endüktif yüklerin hasara neden olabileceği anlamına gelebilir. Bu yüzden korumaları zamanında.

Arduino'da PWM

Arduino I2C veriyolu

Artık nasıl çalıştığını bildiğinize göre, Arduino dünyasındaki PWM'nin özel durumunu görelim ...

PWM: Arduino'da pin çıkışı

Arduino kartlarında, donanım PWM'sini uygulayan birkaç pin bulabilirsiniz. Bunları PCB'nin kendisinde tanımlayabilirsiniz çünkü sembol ~ (küçük başlı) pim numaralandırması ile birlikte. Arduino kodundaki yazılımla da yapılabilir, ancak bu, mikro denetleyiciyi aşırı yükleyecektir, bu, yerel olarak ve donanımla yapılabildiğinde saçma bir şeydir ...

  • Arduino UNO, Mini ve Nano- 6, 8, 3, 5, 6 ve 9 pinlerinde 10 adet 11-bit PWM çıkışınız var ve bu ~ rakamın hemen önünde olacak.
  • arduino Mega- Bu en güçlü Arduino kartında 15 adet 8-bit PWM çıkışına sahipsiniz. 2'den 13'e ve 44'den 46'ya kadar iğnelerdedir.
  • Arduino Ödenmesi: bu durumda 13 adet 8-bit PWM çıkışı vardır. Bunlar, 2 ila 13 pinlerindedir ve ayrıca 12-bit çözünürlüklü DAC tarafından ayrılan diğer iki analog çıkıştadır.

Bu tip PWM çıkışlarında 8 bitlik veya 12 bitlik vb. Çözünürlükten bahsettiğinizde, sahip olduğunuz manevra odasından bahsediyorsunuz. İle 8 bit 256 seviyeye sahiptir Aralarında değişiklik yapabilirsiniz ve 12 bit 4096 seviyeye kadar çıkar.

Zamanlayıcılarla Kontrol

Donanım PWM kontrolü için, Arduino zamanlayıcıları kullanacak onun için. Her mevcut Zamanlayıcı 2 veya 3 PWM çıkışına hizmet edebilir. Her çıkış için bir karşılaştırma kaydı bu sistemi tamamlar, böylece zaman kayıt değerine ulaştığında, çıkışın durumu veya değeri bu Görev Döngülerini durdurmak için değiştirilir. Aynı Zamanlayıcı tarafından kontrol edilen iki çıkış olmasına rağmen, aynı frekansı paylaşmalarına rağmen her ikisinin de farklı Görev Döngüleri olabilir.

Her bir PWM pini ile ilişkili Zamanlayıcılar durumunda, bu değişecektir. Arduino kartının türüne bağlı olarak sahip olduğun:

  • Arduino UNO, Mini ve Nano:
    • Zamanlayıcı0 - 5 ve 6
    • Zamanlayıcı1 - 9 ve 10
    • Zamanlayıcı2 - 3 ve 11
  • arduino Mega:
    • Zamanlayıcı0 - 4 ve 13
    • Zamanlayıcı1 - 11 ve 12
    • Zamanlayıcı2 - 9 ve 10
    • Timer3 - 2, 3 ve 5
    • Timer4 - 6, 7 ve 8
    • Timer5 - 44, 45 ve 46

Önceden ölçeklendirilmiş kayıt, zamanı bir tam sayıya böler ve Zamanlayıcı, ilişkili PWM çıkışlarının her birini kontrol etmek için gerisini yapar. Kayıt defteri değerini değiştirmek, frekansı değiştirebilir. frekans Zamanlayıcıya ve plakaya bağlı olarak da farklı olacaktır:

  • Arduino UNO, Mini ve Nano:
    • Timer0: 1, 8, 64, 256 ve 1024'ün ön ölçeklendirmesine izin verir. Frekans 62.5 Khz'dir.
    • Timer1: 1, 8, 64, 256 ve 1024 ön ayarlı. 31.25 Khz frekanslı.
    • Timer2: Timer1'e eşittir, yalnızca öncekilere ek olarak 32 ve 128'lik bir ön ölçeklendirme ekler.
  • arduino Mega:
    • Zamanlayıcı0, 1, 2: yukarıdakiyle aynı.
    • Timer3, 4 ve 5: 31.25 Khz frekanslı ve 1, 8, 64, 256 ve 1024 önceden ölçeklendirilmiş.

Uyumsuzluklar ve çatışmalar

Zamanlayıcı çıktılarla ilişkili yalnızca o işlev için değil, başkaları tarafından da kullanılır. Bu nedenle, başka bir işlev tarafından kullanılıyorsa, birini veya diğerini seçmelisiniz, ikisini aynı anda kullanamazsınız. Örneğin, projelerinizde bulabileceğiniz bazı uyumsuzluklar şunlardır:

  • Servo kütüphanesi: Servo motorları kullandığınızda, Zamanlayıcılar yoğun bir şekilde kullanılır ve bu da çatışmalara neden olabilir. Özellikle UNO, Nano ve Mini için Timer1'i kullanın, yani bu kitaplıkla bir çizim kullanırken 9 ve 10 pinlerini kullanamazsınız. Mega'da servo sayısına bağlı olacaktır ...
  • SPI: Arduino kartında SPI iletişimi kullanılıyorsa, pin 11 MOSI işlevi için kullanılıyor. Bu nedenle bu PWM pini kullanılamaz.
  • ton: bu işlev, çalışmak için Timer2'yi kullanır. Yani eğer kullanılırsa, 3 ve 11 (veya Mega için 9 ve 10) pinlerini işe yaramaz hale getiriyorsunuz.

Arduino ile uygulamalı test

LED'li Arduino PWM şematik

PWM'nin Arduino'da nasıl çalıştığını yerinde görmek istiyorsanız, yapabileceğiniz en iyi şey bir voltmetre veya multimetre Kullanmayı seçtiğiniz PWM pini ile Arduino kartının toprak pimi veya GND'si arasında (voltajı ölçme işlevinde). Böylelikle ölçüm cihazının ekranında, bu PWM hilesi sayesinde dijital bir çıkış ile gerilimin nasıl değiştiğini görebileceksiniz.

Voltmetre / multimetreyi, ışığın yoğunluğunun nasıl değiştiğini görmek için bir LED ile, bir DC motorla veya istediğiniz herhangi bir başka elemanla değiştirebilirsiniz. Daha fazlasını içermeyen bir LED ile Fritzing ile diyagramda basitleştirdim, ancak bir multimetrenin uçlarını da temsil edebileceğini bilin ...

Bir LED kullanıyorsanız, katot ve GND'deki direnci hatırlayın.

Daha kaynak kodu Her şeyin çalışmasını sağlamak için Arduino kartı mikrodenetleyicisini kontrol etmek için, bunu Arduino IDE'ye eklemelisiniz (bu durumda PWM pin 6'yı kullandım. Arduino UNO):

const int analogOutPin = 6;
byte outputValue = 0;  
 
void setup()
{  
   Serial.begin(9600);        
   pinMode(ledPIN , OUTPUT); 
 
   bitSet(DDRB, 5);       // LED o voltímetro
   bitSet(PCICR, PCIE0);       
   bitSet(PCMSK0, PCINT3);     
}
 
void loop() 
{
   if (Serial.available()>0)  
   {
      if(outputValue >= '0' && outputValue <= '9')
      {
         outputValue = Serial.read();   // Leemos la opción
         outputValue -= '0';      // Restamos '0' para convertir a un número
         outputValue *= 25;      // Multiplicamos x25 para pasar a una escala 0 a 250
         analogWrite(ledPIN , outputValue);
      }
   }
}  
 
ISR(PCINT0_vect)
{
   if(bitRead(PINB, 3))
   { 
      bitSet(PORTB, 5);   // LED on 
   }
   else
   { 
      bitClear(PORTB, 5); // LED off  
   } 
} 
Değerlerle oynamanızı ve görmenizi tavsiye ederim ışık veya voltmetre üzerindeki sonuçlar. Program 0'dan 9'a kadar değerler alabilir, böylece her şeyin nasıl değiştiğini görebilirsiniz. Daha fazla bilgi için size tavsiye ederim arduino kursu ücretsiz indirmeye sahip olduğumuz ...

Bir yorum bırak seninkini

Yorumunuzu bırakın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar ile işaretlenmiştir *

*

*

  1. Verilerden sorumlu: Miguel Ángel Gatón
  2. Verilerin amacı: Kontrol SPAM, yorum yönetimi.
  3. Meşruiyet: Onayınız
  4. Verilerin iletilmesi: Veriler, yasal zorunluluk dışında üçüncü kişilere iletilmeyecektir.
  5. Veri depolama: Occentus Networks (AB) tarafından barındırılan veritabanı
  6. Haklar: Bilgilerinizi istediğiniz zaman sınırlayabilir, kurtarabilir ve silebilirsiniz.

  1.   Jose dijo

    Merhaba iyi günler. Öncelikle en yenisi için bu açıklamaya adanan zaman için teşekkür etmek istiyorum.
    Size bir sorgu yapmak istiyorum. Kodu, Arguino Mega için bir proteus 8 emülatöründe çalıştırmaya çalışıyorum. Pin 6'ya bir voltmetre bağladım, Proteus bir seri bağlantı noktasına bağlı, ancak farklı voltajların çıkması için nasıl veya neyin değişeceğini bilmiyorum. Derlenmesini sağlamak için kodda küçük ayarlamalar yapmak zorunda kaldım. Yardımın için çok teşekkürler