PWM: meniru pin analog dengan papan Arduino anda

Isyarat PWM

Dengan pin digital dan analog, yang boleh anda gunakan di papan Arduino, anda boleh menerima atau menghantar isyarat elektrik untuk mengawal atau memperoleh data dari projek elektronik anda. Selain itu, terdapat isyarat lain yang sangat menarik dalam plat jenis ini, dan itu adalah PWM, yang boleh meniru isyarat analog tanpa benar-benar analog. Maksudnya, mereka adalah pin digital yang boleh bertindak dengan cara yang serupa (tidak sama) sebagai isyarat analog.

Jenis isyarat ini sangat praktikal untuk apabila anda bukan sahaja mahu menggunakan isyarat digital TINGGI dan RENDAH, iaitu 1 atau 0, AKTIF dan MATI, tetapi anda ingin melangkah lebih jauh dan menerangkan isyarat yang agak lebih kompleks. Sebagai contoh, adalah mungkin untuk memodulasi kelajuan a Motor DC, atau intensiti cahaya cahaya, untuk solenoid, dll.

Sistem analog vs digital

Isyarat analog vs digital

Litar elektronik boleh dibahagikan kepada dua keluarga atau kategori besar: digital dan analog. Semasa bercakap mengenai elektronik digital, kita menggunakan kuantiti dengan nilai diskrit, iaitu sistem binari yang diwakili oleh isyarat elektrik voltan rendah atau tinggi untuk menafsirkan keadaan bit yang ditangani. Sebaliknya, ketika menggunakan rangkaian analog, kuantiti dengan nilai berterusan digunakan.

Dalam sistem digital boleh didapati secara bergiliran jenis gabungan dan jenis urutan. Artinya, yang pertama adalah output di mana output sistem hanya bergantung pada keadaan input. Sebaliknya, dalam urutan, elemen memori disertakan, dan output akan bergantung pada keadaan input semasa dan keadaan sebelumnya yang disimpan.

Dalam kes analog tidak ada dua kumpulan besar atau varian ini, kerana di sini mereka adalah isyarat berterusan yang akan selalu bergantung isyarat sistem semasa. Sebagai contoh, dalam pembesar suara, isyarat yang diberikan kepadanya akan bergantung pada suara yang ingin anda hasilkan semula. Begitu juga dengan mikrofon, yang akan menghasilkan isyarat analog bergantung pada suara yang diterimanya. Tentunya anda juga pernah melihatnya dengan banyak sensor lain yang telah kami jelaskan di blog ini dan bertindak dengan isyarat analog (dan oleh itu, formula harus dibuat sehingga kemudian nilainya dapat dikira atau dikondisikan dalam sketsa Arduino IDE ) ...

Ciri-ciri ini satu dan yang lain menjadikan beberapa mempunyai ciri-ciri mereka kelebihan dan kekurangan, seperti biasa dalam hampir semua perkara. Sebagai contoh, yang digital cenderung lebih murah, lebih cepat, lebih mudah dikembangkan, maklumat dapat disimpan dengan lebih mudah, mereka mempunyai ketepatan yang lebih besar, mereka dapat diprogramkan, mereka tidak begitu terdedah kepada kesan bunyi bising, dll. Tetapi juga benar bahawa dengan analog anda boleh beroperasi dengan isyarat yang lebih kompleks.

Oleh ejemplo, sensor kesan Hall jenis digital hanya dapat mengesan kehadiran atau ketiadaan medan magnet yang berdekatan. Sebaliknya, sensor kesan Hall analog dapat melakukannya dan juga menentukan ketumpatan medan magnet tersebut berkat isyarat analog yang dihasilkannya pada outputnya. Dengan mengetahui cara mentafsirkan isyarat voltan yang lebih besar atau lebih rendah, anda dapat mengetahui besarannya dengan mudah. Anda mempunyai contoh lain dalam pelbagai sifat yang boleh anda ukur secara kuantitatif dengan sistem analog, seperti suhu, masa, tekanan, jarak, bunyi, dll.

Isyarat analog vs digital

Yang dikatakan, a isyarat analog Ia akan menjadi voltan atau arus elektrik yang berubah mengikut masa dan berterusan. Sekiranya digambarkan, isyarat analog akan menjadi gelombang sinus frekuensi tunggal.

Sebagai isyarat digital, adalah voltan yang berubah secara bertahap mengikut masa. Artinya, jika dilambangkan pada grafik, itu akan menjadi isyarat langkah yang tidak berubah secara berterusan, tetapi perubahan dalam langkah atau kenaikan diskrit.

Anda harus tahu bahawa ada litar untuk beralih dari isyarat analog ke isyarat digital atau sebaliknya. Ini penukar mereka dikenali sebagai DAC (Digital-to-Analog Converter) dan ADC (Analog-to-Digital Converter). Dan ia sangat biasa di banyak peranti yang kita gunakan hari ini, seperti TV, komputer, dll. Dengan mereka, anda boleh menukar isyarat digital yang digunakan oleh peralatan ini ke tahap elektronik untuk bekerja dengan periferal atau bahagian lain yang berfungsi secara analog.

Oleh ejemplo, pembesar suara atau mikrofon dengan isyarat analog yang berfungsi dengan kad suara, atau kad grafik digital yang mempunyai cip RAMDAC yang terkenal untuk port monitor analog ... Di Arduino jenis penukar ini juga digunakan untuk pelbagai projek, seperti yang akan kita lihat ...

Apa itu PWM?

kitaran tugas grafik

Walaupun PWM (Modulasi Lebar Nadi), atau modulasi lebar denyut, mempunyai asas digital, bentuk isyaratnya menyerupai isyarat analog yang agak "persegi". Ia membolehkan melalui pulsa digital mengubah isyarat untuk meniru sistem analog seperti yang telah saya komen sebelumnya. Sebenarnya, jika anda melihat namanya, itu sudah memberi anda petunjuk tentang apa yang dilakukannya, melalui lebar denyut digital.

Ini bermanfaat untuk Arduino kerana terdapat banyak automatik atau komponen elektronik yang boleh anda tambahkan pada projek anda dan itu tidak mampu memberikan isyarat analog yang benar, tetapi mereka menggunakan PWM ini untuk beroperasi. Mereka juga tidak dapat menggunakan isyarat analog diskretis, iaitu, ke lompatan voltan menyerupai isyarat digital. Apa yang dapat mereka lakukan ialah menggunakan output digital -Vcc atau Vcc dari jenis digital untuk menghasilkan isyarat pelik ini ...

Oleh itu, PWM adalah sejenis "tipu daya" yang dengannya Arduino dan sistem lain dapat beroperasi dengan jenis isyarat yang mereka tidak cukup analog dan juga digital konvensional. Untuk menjadikannya mungkin, mereka memastikan output digital tetap aktif untuk waktu atau mati tertentu, bergantung pada minat setiap masa. Ini jauh dari jam digital atau isyarat kod binari, yang nadi mempunyai lebar yang sama.

Dalam projek anda dengan Arduino, anda dapat memeriksa jenis isyarat PWM ini di mana frekuensi pemicu denyut tetap dikekalkan dari masa ke masa, tetapi lebar denyutan ini berbeza-beza. Sebenarnya, ia disebut Duty Cycle apabila isyarat tetap tinggi sehubungan dengan jumlah kitaran. Oleh itu, Duty Cycle diberikan dalam%.

Ingat bahawa dalam PWM anda tidak berfungsi seperti dalam isyarat analog, di antara beberapa nilai voltan dan ia berubah-ubah di antara mereka. Dalam kes PWM, ia adalah isyarat persegi dalam gaya digital dan yang nilai maksimumnya adalah Vcc. Sebagai contoh, jika anda bekerja dengan bekalan kuasa 3V, anda boleh memberikan denyutan 3V atau 0V, tetapi tidak 1V atau nilai perantaraan lain seperti yang berlaku dalam analog sebenar. Yang berbeza-beza dalam hal ini adalah lebar nadi, yang dapat kita simpan 30% pada nilai Vcc tinggi itu, atau 60% untuk memberikannya lebih banyak kekuatan, dll.

Tetapi berhati-hatilah, kerana jika peranti menyokong had Vcc dan terlampaui dengan PWM, ia boleh rosak. Oleh itu, selalu perlu untuk menghormati nilai lembaran data yang disediakan oleh pengeluar. Juga, dalam beberapa peranti seperti motor DC, geganti, elektromagnet, dsb., penarikan voltan selepas Duty Cycle boleh bermakna bahawa beban induktif boleh menyebabkan kerosakan. Itulah sebabnya mengapa perlindungan tepat pada masanya.

PWM di Arduino

Bas Arduino I2C

Sekarang setelah anda mengetahui cara kerjanya, mari kita lihat kes PWM khusus di dunia Arduino ...

PWM: pinout di Arduino

Di papan Arduino, anda boleh menemui beberapa pin yang menggunakan perkakasan PWM. Anda boleh mengenalinya di PCB itu sendiri kerana mempunyai simbol ~ (kepala kecil) bersama dengan penomboran pin. Ini juga dapat dilakukan oleh perisian dalam kod Arduino, tetapi itu akan membebani mikrokontroler dengan pekerjaan, sesuatu yang tidak masuk akal ketika dapat dilakukan secara asli dan oleh perkakasan ...

  • Arduino UNO, Mini dan Nano- Anda mempunyai 6 output PWM 8-bit pada pin 3, 5, 6, 9, 10, dan 11, yang akan mempunyai ~ tepat di hadapan nombor.
  • arduino mega- Pada papan Arduino yang paling kuat ini, anda mempunyai 15 output PWM 8-bit. Mereka berada di pin 2 hingga 13 dan 44 hingga 46.
  • Arduino Kerana: dalam kes ini terdapat 13 output PWM 8-bit. Mereka berada pada pin 2 hingga 13, ditambah dua output analog lain yang ditentukan oleh DAC dengan resolusi 12-bit.

Apabila anda bercakap mengenai resolusi 8-bit atau 12-bit, dan lain-lain, dalam output PWM jenis ini, anda merujuk kepada ruang manuver yang anda miliki. Dengan 8 bit mempunyai tahap 256 di mana anda boleh berbeza-beza, dan 12 bit naik ke tahap 4096.

Kawal dengan Pemasa

Untuk kawalan PWM perkakasan, Arduino akan menggunakan pemasa untuk ia. Setiap Pemasa yang hadir dapat melayani 2 atau 3 output PWM. Daftar perbandingan untuk setiap output melengkapkan sistem ini sehingga apabila waktu mencapai nilai daftar, keadaan atau nilai output diubah untuk menghentikan Siklus Duti tersebut. Walaupun terdapat dua output yang dikendalikan oleh Timer yang sama, keduanya dapat mempunyai Duty Cycles yang berbeza, walaupun mereka mempunyai frekuensi yang sama.

Sekiranya Timer dihubungkan dengan setiap pin PWM, ia akan berbeza bergantung pada jenis papan Arduino yang awak ada:

  • Arduino UNO, Mini dan Nano:
    • Pemasa0 - 5 dan 6
    • Pemasa1 - 9 dan 10
    • Pemasa2 - 3 dan 11
  • arduino mega:
    • Pemasa0 - 4 dan 13
    • Pemasa1 - 11 dan 12
    • Pemasa2 - 9 dan 10
    • Pemasa3 - 2, 3 dan 5
    • Pemasa4 - 6, 7 dan 8
    • Pemasa5 - 44, 45 dan 46

Daftar preskripsi akan membahagikan masa dengan bilangan bulat dan Pemasa melakukan selebihnya untuk mengawal setiap output PWM yang berkaitan. Mengubah nilai pendaftaran boleh mengubah frekuensi. The kekerapan Mereka juga akan berbeza bergantung pada Pemasa dan plat:

  • Arduino UNO, Mini dan Nano:
    • Pemasa0: membolehkan preskala 1, 8, 64, 256 dan 1024. Kekerapannya ialah 62.5 Khz.
    • Pemasa1: dengan pratetap 1, 8, 64, 256 dan 1024. Dengan frekuensi 31.25 Khz.
    • Timer2: sama dengan Timer1, hanya itu juga menambah prescaling 32 dan 128 sebagai tambahan kepada yang sebelumnya.
  • arduino mega:
    • Pemasa0, 1, 2: sama seperti di atas.
    • Pemasa3, 4, dan 5: dengan kekerapan 31.25 Khz dan berukuran 1, 8, 64, 256 dan 1024.

Ketidakserasian dan konflik

Pemasa dikaitkan dengan output bukan hanya untuk fungsi itu, juga digunakan oleh orang lain. Oleh itu, jika mereka digunakan oleh fungsi lain, anda mesti memilih antara satu atau yang lain, anda tidak boleh menggunakan keduanya pada masa yang sama. Contohnya, ini adalah beberapa ketidaksesuaian yang dapat anda temui dalam projek anda:

  • Perpustakaan servo: Ketika anda menggunakan motor servo, Timer digunakan secara intensif, yang dapat menyebabkan konflik. Khususnya gunakan Timer1 untuk UNO, Nano dan Mini, iaitu, anda tidak boleh menggunakan pin 9 dan 10 semasa anda menggunakan lakaran dengan perpustakaan tersebut. Di Mega ia akan bergantung pada jumlah perkhidmatan ...
  • SPI: Jika komunikasi SPI digunakan pada papan Arduino, pin 11 digunakan untuk fungsi MOSI. Itulah sebabnya pin PWM tidak dapat digunakan.
  • Nada: fungsi ini menggunakan Timer2 untuk beroperasi. Oleh itu, jika ia digunakan, anda tidak akan menggunakan pin 3 dan 11 (atau 9 dan 10 untuk Mega).

Ujian hands-on dengan Arduino

Skema Arduino PWM dengan LED

Sekiranya anda ingin melihat di tempat bagaimana PWM berfungsi di Arduino, perkara terbaik yang boleh anda lakukan ialah menyambungkan petunjuk pengukuran voltmeter atau multimeter (berfungsi untuk mengukur voltan) antara pin PWM yang telah anda pilih untuk digunakan dan pin ground atau GND papan Arduino. Dengan cara ini, pada layar alat ukur anda akan dapat melihat bagaimana voltan berubah dengan output yang digital berkat trik PWM ini.

Anda boleh mengganti voltmeter / multimeter dengan LED untuk melihat bagaimana intensiti cahaya berbeza, dengan motor DC, atau dengan elemen lain yang anda mahukan. Saya telah mempermudahnya dalam gambar rajah dengan Fritzing dengan LED tanpa lebih banyak, tetapi anda tahu bahawa ia juga dapat mewakili hujung multimeter ...

Sekiranya anda menggunakan LED, ingatlah rintangan pada katod dan GND.

kepada kod sumber Untuk mengawal mikrokontroler papan Arduino agar semuanya berfungsi, anda harus memasukkannya ke dalam Arduino IDE (dalam kes ini saya telah menggunakan pin PWM 6 dari 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  
   } 
} 
Saya menasihati anda untuk bermain dengan nilai-nilai dan lihat hasilnya pada cahaya atau voltmeter. Program ini dapat menerima nilai dari 0 hingga 9 sehingga anda dapat melihat bagaimana semuanya berbeza-beza. Untuk maklumat lebih lanjut, saya menasihati anda kursus arduino yang kami ada dalam muat turun percuma ...

Komen, tinggalkan komen anda

Tinggalkan komen anda

Alamat email anda tidak akan disiarkan. Ruangan yang diperlukan ditanda dengan *

*

*

  1. Bertanggungjawab atas data: Miguel Ángel Gatón
  2. Tujuan data: Mengendalikan SPAM, pengurusan komen.
  3. Perundangan: Persetujuan anda
  4. Komunikasi data: Data tidak akan disampaikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Pangkalan data yang dihoskan oleh Occentus Networks (EU)
  6. Hak: Pada bila-bila masa anda boleh menghadkan, memulihkan dan menghapus maklumat anda.

  1.   Jose kata

    Hello selamat hari. Terlebih dahulu saya ingin mengucapkan terima kasih atas masa yang diperuntukkan untuk penjelasan ini untuk yang terbaru.
    Saya ingin membuat anda pertanyaan. Saya cuba menjalankan kod pada emulator proteus 8 untuk Arguino Mega. Saya menyambungkan voltmeter ke pin 6, Proteus disambungkan ke port bersiri, tetapi saya tidak tahu bagaimana atau apa yang harus berubah sehingga voltan yang berbeza dikeluarkan. Saya terpaksa membuat sedikit penyesuaian pada kod untuk menyusunnya. Terima kasih banyak atas pertolongan anda