PWM: meniru pin analog dengan papan Arduino Anda

Sinyal PWM

Dengan pin digital dan analog, yang dapat Anda gunakan di papan Arduino, Anda dapat menerima atau mengirim sinyal listrik untuk mengontrol atau memperoleh data dari proyek elektronik Anda. Selain itu, ada sinyal lain yang sangat menarik pada jenis pelat ini, yaitu PWM, yang dapat meniru sinyal analog tanpa benar-benar menjadi analog. Artinya, mereka adalah pin digital yang dapat bertindak dengan cara yang mirip (tidak sama) sebagai sinyal analog.

Jenis sinyal ini sangat praktis ketika Anda tidak hanya ingin menggunakan sinyal TINGGI dan RENDAH digital, yaitu, 1 atau 0, AKTIF dan NONAKTIF, tetapi Anda ingin melangkah lebih jauh dan menjelaskan sinyal yang agak lebih kompleks. Misalnya, dimungkinkan untuk memodulasi kecepatan a Motor DC, atau intensitas cahaya lampu, untuk solenoida, dll.

Sistem analog vs digital

Sinyal analog vs digital

Sirkuit elektronik dapat dibagi menjadi dua keluarga atau kategori besar: digital dan analog. Ketika berbicara tentang elektronika digital, kami menggunakan kuantitas dengan nilai diskrit, yaitu sistem biner yang diwakili oleh sinyal listrik bertegangan rendah atau tinggi untuk menginterpretasikan keadaan bit yang ditangani. Di sisi lain, ketika datang ke rangkaian analog, kuantitas dengan nilai kontinu digunakan.

Dalam sistem digital dapat ditemukan secara bergantian dari tipe kombinasional dan tipe sekuensial. Artinya, yang pertama adalah yang output dari sistem hanya bergantung pada keadaan input. Di sisi lain, dalam yang berurutan, elemen memori disertakan, dan output akan bergantung pada status input saat ini dan status yang disimpan sebelumnya.

Dalam kasus analog tidak ada dua kelompok atau varian besar ini, karena di sini mereka adalah sinyal kontinu yang akan selalu bergantung pada sinyalnya sistem saat ini. Misalnya, di loudspeaker, sinyal yang disuplai akan bergantung pada suara yang ingin Anda hasilkan. Hal yang sama dengan mikrofon, yang akan menghasilkan sinyal analog tergantung pada suara yang diterimanya. Tentunya Anda juga telah melihatnya dengan banyak sensor lain yang telah kami jelaskan di blog ini dan yang bertindak dengan sinyal analog (dan oleh karena itu, formula harus dibuat agar nantinya nilai dapat dihitung atau dikondisikan dalam sketsa Arduino IDE ) ...

Ciri-ciri ini dari satu dan lainnya membuat beberapa memiliki keuntungan dan kerugian, seperti biasa di hampir semua hal. Misalnya, perangkat digital cenderung lebih murah, lebih cepat, lebih mudah dikembangkan, informasi dapat disimpan dengan lebih mudah, memiliki akurasi yang lebih tinggi, dapat diprogram, tidak rentan terhadap efek kebisingan, dll. Tetapi juga benar bahwa dengan analog Anda dapat beroperasi dengan sinyal yang lebih kompleks.

Por ejemplo, sensor efek Hall tipe digital hanya dapat mendeteksi ada atau tidaknya medan magnet di dekatnya. Sebagai gantinya, sensor efek Hall analog dapat melakukan itu dan juga menentukan kepadatan medan magnet tersebut berkat sinyal analog yang dihasilkannya pada keluarannya. Mengetahui bagaimana menafsirkan sinyal tegangan yang lebih besar atau lebih kecil dengan baik, Anda dapat dengan mudah mengetahui besarnya. Anda memiliki contoh lain dalam banyak besaran alam yang dapat Anda ukur secara kuantitatif dengan sistem analog, seperti suhu, waktu, tekanan, jarak, suara, dll.

Sinyal analog vs digital

Yang sedang berkata, a Sinyal analog Ini akan menjadi tegangan atau arus listrik yang berubah-ubah seiring waktu dan terus menerus. Jika digambarkan, sinyal analog akan menjadi gelombang sinus frekuensi tunggal.

Sebagai sinyal digital, adalah tegangan yang bervariasi secara bertahap terhadap waktu. Artinya, jika direpresentasikan dalam grafik, itu akan menjadi sinyal langkah yang tidak berubah secara terus menerus, tetapi berubah dalam langkah-langkah atau kenaikan diskrit.

Anda harus tahu bahwa ada rangkaian untuk beralih dari sinyal analog ke digital atau sebaliknya. Ini konverter mereka dikenal sebagai DAC (Digital-to-Analog Converter) dan ADC (Analog-to-Digital Converter). Dan itu sangat umum di banyak perangkat yang kita gunakan saat ini, seperti TV, komputer, dll. Dengan mereka Anda dapat mengubah sinyal digital yang digunakan oleh peralatan ini ke level elektronik untuk bekerja dengan periferal atau bagian lain yang bekerja secara analog.

Por ejemplo, speaker atau mikrofon dengan sinyal analog yang bekerja dengan kartu suara, atau kartu grafis digital yang memiliki chip RAMDAC terkenal untuk port monitor analog ... Di Arduino, konverter jenis ini juga digunakan untuk banyak proyek, seperti yang akan kita lihat ...

Apa itu PWM?

siklus tugas grafis

Meskipun PWM (Pulse-Width Modulation), atau modulasi lebar pulsa, memiliki basis digital, bentuk sinyalnya menyerupai sinyal analog yang agak "persegi". Hal ini memungkinkan melalui pulsa digital untuk memvariasikan sinyal untuk meniru sistem analog seperti yang telah saya komentari sebelumnya. Faktanya, jika Anda melihat namanya, itu sudah memberi Anda petunjuk tentang apa yang dilakukannya, melalui lebar pulsa digital.

Ini bermanfaat untuk Arduino karena ada banyak otomatisme atau komponen elektronik yang dapat Anda tambahkan ke proyek Anda dan itu tidak mampu memberikan sinyal analog yang sebenarnya, tetapi mereka menggunakan PWM ini untuk beroperasi. Mereka juga tidak dapat menggunakan sinyal analog diskrit, yaitu, yang beralih ke lompatan tegangan menyerupai sinyal digital. Apa yang dapat mereka lakukan adalah menggunakan keluaran digital -Vcc atau Vcc jenis digital untuk menghasilkan sinyal aneh ini ...

Oleh karena itu, PWM adalah sejenis "tipuan" yang dengannya Arduino dan sistem lain dapat beroperasi dengan jenis sinyal ini yang mereka tidak sepenuhnya analog dan juga bukan digital konvensional. Untuk membuatnya mungkin, mereka tetap mengaktifkan keluaran digital untuk waktu tertentu atau tidak aktif, tergantung pada minat setiap saat. Ini jauh dari apa yang akan menjadi jam digital atau sinyal kode biner, yang pulsa memiliki lebar yang sama.

Dalam proyek Anda dengan Arduino, Anda dapat memeriksa jenis sinyal PWM ini di mana frekuensi konstan pemicu pulsa dipertahankan dari waktu ke waktu, tetapi lebar pulsa ini bervariasi. Faktanya, ini disebut Siklus Tugas ketika sinyal tetap tinggi sehubungan dengan total siklus. Oleh karena itu, Duty Cycle diberikan dalam%.

Ingatlah bahwa dalam PWM Anda tidak bekerja seperti pada sinyal analog, antara beberapa nilai tegangan dan berfluktuasi di antara mereka. Dalam kasus PWM itu adalah sinyal persegi dalam gaya digital dan yang nilai maksimumnya adalah Vcc. Misalnya, jika Anda bekerja dengan catu daya 3V, Anda dapat memberikan pulsa 3V atau 0V, tetapi tidak 1V atau nilai antara lainnya seperti yang terjadi pada analog nyata. Apa yang akan bervariasi dalam kasus itu adalah lebar pulsa, yang dapat kita pertahankan 30% pada nilai Vcc tinggi itu, atau 60% untuk memberinya lebih banyak daya, dll.

Namun hati-hati, karena jika suatu perangkat mendukung batas Vcc dan dilampaui dengan PWM, maka dapat rusak. Jadi akan selalu perlu untuk menghormati nilai-nilai lembar data yang disediakan oleh pabrikan. Selain itu, di beberapa perangkat seperti motor DC, relay, elektromagnet, dll., penarikan tegangan setelah Siklus Tugas dapat berarti bahwa beban induktif dapat menyebabkan kerusakan. Itulah mengapa perlindungan tepat waktu.

PWM di Arduino

Bus Arduino I2C

Sekarang Anda tahu cara kerjanya, mari kita lihat kasus spesifik PWM di dunia Arduino ...

PWM: pinout di Arduino

Pada papan Arduino Anda dapat menemukan beberapa pin yang mengimplementasikan PWM perangkat keras. Anda dapat mengidentifikasinya di PCB itu sendiri karena mereka memiliki file simbol ~ (kepala kecil) bersama dengan penomoran pin. Itu juga bisa dilakukan oleh perangkat lunak dalam kode Arduino, tetapi itu akan membebani mikrokontroler dengan pekerjaan, sesuatu yang tidak masuk akal ketika itu dapat dilakukan secara asli dan oleh perangkat keras ...

  • Arduino UNO, Mini dan Nano- Anda memiliki 6 keluaran PWM 8-bit pada pin 3, 5, 6, 9, 10, dan 11, yang akan ~ tepat di depan nomor tersebut.
  • arduino mega- Pada papan Arduino paling kuat ini Anda memiliki 15 keluaran PWM 8-bit. Mereka berada di pin 2 hingga 13 dan 44 hingga 46.
  • Arduino karena: dalam hal ini ada 13 keluaran PWM 8-bit. Mereka berada pada pin 2 hingga 13, ditambah dua output analog lainnya yang diskritisasi oleh DAC dengan resolusi 12-bit.

Ketika Anda berbicara tentang resolusi 8-bit atau 12-bit, dll., Dalam jenis keluaran PWM ini, Anda mengacu pada ruang untuk manuver yang Anda miliki. Dengan 8 bit memiliki 256 level di antaranya Anda dapat memvariasikan, dan 12 bit naik ke level 4096.

Kontrol dengan Timer

Untuk kontrol PWM perangkat keras, Arduino akan menggunakan pengatur waktu untuk itu. Setiap Timer saat ini dapat melayani 2 atau 3 output PWM. Register perbandingan untuk setiap keluaran melengkapi sistem ini sehingga ketika waktu mencapai nilai register, status atau nilai keluaran diubah untuk menghentikan Siklus Tugas tersebut. Meskipun ada dua keluaran yang dikendalikan oleh Timer yang sama, keduanya dapat memiliki Siklus Tugas yang berbeda, meskipun frekuensi keduanya sama.

Dalam kasus Timer terkait dengan setiap pin PWM, itu akan bervariasi tergantung pada jenis papan Arduino yang Anda miliki:

  • Arduino UNO, Mini dan Nano:
    • Timer0 - 5 dan 6
    • Timer1 - 9 dan 10
    • Timer2 - 3 dan 11
  • arduino mega:
    • Timer0 - 4 dan 13
    • Timer1 - 11 dan 12
    • Timer2 - 9 dan 10
    • Timer3 - 2, 3 dan 5
    • Timer4 - 6, 7 dan 8
    • Timer5 - 44, 45 dan 46

Register prescaled akan membagi waktu dengan integer dan Timer melakukan sisanya untuk mengontrol setiap output PWM terkait. Mengubah nilai registri dapat mengubah frekuensi. Itu frekuensi Mereka juga akan berbeda tergantung pada Timer dan pelatnya:

  • Arduino UNO, Mini dan Nano:
    • Timer0: memungkinkan prescaling 1, 8, 64, 256 dan 1024. Frekuensinya 62.5 Khz.
    • Timer1: dengan preset 1, 8, 64, 256 dan 1024. Dengan frekuensi 31.25 Khz.
    • Timer2: sama dengan Timer1, hanya saja itu juga menambahkan prescaling 32 dan 128 selain yang sebelumnya.
  • arduino mega:
    • Timer0, 1, 2: sama seperti di atas.
    • Timer3, 4, dan 5: dengan frekuensi 31.25 Khz dan prescale 1, 8, 64, 256 dan 1024.

Inkompatibilitas dan konflik

Timer terkait dengan output tidak hanya untuk fungsi itu, juga digunakan oleh orang lain. Oleh karena itu, jika keduanya sedang digunakan oleh fungsi lain, Anda harus memilih antara satu atau lainnya, Anda tidak dapat menggunakan keduanya pada saat yang bersamaan. Misalnya, ini adalah beberapa ketidakcocokan yang dapat Anda temukan di proyek Anda:

  • Perpustakaan servo: Saat Anda menggunakan motor servo, Pengatur waktu digunakan secara intensif, yang dapat menyebabkan konflik. Secara khusus gunakan Timer1 untuk UNO, Nano dan Mini, yaitu, Anda tidak dapat menggunakan pin 9 dan 10 saat Anda menggunakan sketsa dengan perpustakaan itu. Di Mega itu akan tergantung pada jumlah servo ...
  • SPI: Jika komunikasi SPI digunakan pada papan Arduino, pin 11 digunakan untuk fungsi MOSI. Itu sebabnya pin PWM tidak bisa digunakan.
  • Nada: fungsi ini menggunakan Timer2 untuk beroperasi. Jadi jika digunakan, Anda membuat pin 3 dan 11 (atau 9 dan 10 untuk Mega) tidak berguna.

Uji langsung dengan Arduino

Skema Arduino PWM dengan LED

Jika Anda ingin melihat di tempat bagaimana PWM bekerja di Arduino, hal terbaik yang dapat Anda lakukan adalah menghubungkan kabel pengukuran a voltmeter atau multimeter (berfungsi untuk mengukur tegangan) antara pin PWM yang Anda pilih untuk digunakan dan pin ground atau GND board Arduino. Dengan cara ini, pada layar alat pengukur Anda akan dapat melihat bagaimana perubahan tegangan dengan keluaran yang digital berkat trik PWM ini.

Anda dapat mengganti voltmeter / multimeter dengan LED untuk melihat variasi intensitas cahaya, dengan motor DC, atau elemen lain yang Anda inginkan. Saya telah menyederhanakannya dalam diagram dengan Fritzing dengan LED tanpa lebih, tetapi Anda tahu bahwa itu juga dapat mewakili ujung multimeter ...

Jika Anda menggunakan LED, ingat tahanan di katoda dan GND.

untuk kode sumber Untuk mengontrol mikrokontroler papan Arduino agar semuanya berfungsi, Anda harus memasukkan ini ke dalam Arduino IDE (dalam hal 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 menyarankan Anda untuk bermain dengan nilai-nilai dan melihat hasil pada lampu atau voltmeter. Program ini dapat menerima nilai dari 0 hingga 9 sehingga Anda dapat melihat bagaimana semuanya bervariasi. Untuk informasi lebih lanjut, saya menyarankan Anda kursus arduino yang kami miliki di unduh gratis ...

Komentar, tinggalkan punyamu

tinggalkan Komentar Anda

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai dengan *

*

*

  1. Penanggung jawab data: Miguel Ángel Gatón
  2. Tujuan data: Mengontrol SPAM, manajemen komentar.
  3. Legitimasi: Persetujuan Anda
  4. Komunikasi data: Data tidak akan dikomunikasikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Basis data dihosting oleh Occentus Networks (UE)
  6. Hak: Anda dapat membatasi, memulihkan, dan menghapus informasi Anda kapan saja.

  1.   Jose dijo

    Halo selamat siang. Pertama-tama saya ingin mengucapkan terima kasih atas waktu yang didedikasikan untuk penjelasan terbaru ini.
    Saya ingin mengajukan pertanyaan untuk Anda. Saya mencoba menjalankan kode pada emulator proteus 8 untuk Arguino Mega. Saya menghubungkan voltmeter ke pin 6, Proteus terhubung ke port serial, tetapi saya tidak tahu bagaimana atau apa yang harus bervariasi sehingga tegangan yang berbeda adalah output. Saya harus membuat sedikit penyesuaian pada kode untuk membuatnya dapat dikompilasi. Terima kasih banyak atas bantuan Anda