PWM: Arduino lövhənizlə analog sancaqları təqlid edin

PWM siqnalları

Arduino lövhənizdə istifadə edə biləcəyiniz rəqəmsal və analog sancaqlar ilə elektron layihələrinizdən məlumatları idarə etmək və ya əldə etmək üçün elektrik siqnalları ala və ya göndərə bilərsiniz. Bundan əlavə, bu tip lövhədə başqa çox maraqlı siqnallar var və bunlar da bunlardır PWM, həqiqətən analog olmadan bir analoq siqnalını təqlid edə bilər. Yəni, bunlar analog siqnal kimi (eyni deyil) hərəkət edə bilən rəqəmsal sancaqlardır.

Bu tip siqnallar yalnız rəqəmsal YÜKSƏK və LOW siqnallarını, yəni 1 və ya 0, ON və OFF istifadə etmək istəmədiyiniz zaman daha praktikdir, ancaq daha da irəli getmək və təsvir etmək istədiyiniz zaman bir qədər daha mürəkkəb siqnallar. Məsələn, a sürətini modulyasiya etmək mümkündür DC mühərrikvə ya bir işığın işıq intensivliyi, bir solenoid üçün və s.

Analog və rəqəmsal sistem

Analoq və rəqəmsal siqnal

Elektron dövrələr iki böyük ailəyə və ya kateqoriyaya bölünə bilər: rəqəmsal və analoq. Rəqəmsal elektronikadan bəhs edərkən, ayrı-ayrı dəyərləri olan kəmiyyətlərdən, yəni işlənən bitlərin vəziyyətini şərh etmək üçün aşağı və ya yüksək gərginlikli elektrik siqnalları ilə təmsil olunan ikili sistemdən istifadə edirik. Digər tərəfdən, analoq bir dövrə olduqda davamlı dəyərləri olan kəmiyyətlərdən istifadə edilir.

Rəqəmsal sistemlərdə növbə ilə tapıla bilər kombinasiya tipli və ardıcıl tipli olanlar. Yəni birincisi, sistemin çıxışının yalnız giriş vəziyyətindən asılı olduğu sistemlərdir. Digər tərəfdən, ardıcıl olanlara yaddaş elementləri daxil edilir və çıxış girişlərin cari vəziyyətindən və saxlanılan əvvəlki vəziyyətdən asılı olacaqdır.

Analoqlarda bu iki böyük qrup və ya variant yoxdur, çünki burada daima asılı olacaq fasiləsiz siqnallardır siqnal cari sistem. Məsələn, bir səsgücləndiricidə verdiyiniz siqnal çoxaltmaq istədiyiniz səsə bağlıdır. Qəbul etdiyi səsə görə bir analog siqnal yaradan bir mikrofonla eyni. Şübhəsiz ki, bu bloqda təsvir etdiyimiz və analog siqnallarla işləyən bir çox digər sensorlarla da gördünüz (və bu səbəbdən daha sonra Arduino IDE eskizlərində dəyərlərin hesablanması və ya şərtləndirilməsi üçün bir düstur yaradılmalı idi. ) ...

Birinin və digərinin bu xüsusiyyətləri bəzilərinin özlərinə sahib olmasını təmin edir yaxşı və pis tərəfləri, demək olar ki, hər şeydə olduğu kimi. Məsələn, rəqəmsal olanlar daha ucuz, daha sürətli, daha asan inkişaf edir, məlumat daha asan saxlanıla bilər, daha dəqiqliyə sahibdirlər, proqramlaşdırıla bilərlər, səs-küyün təsirlərinə o qədər həssas deyillər. Ancaq analoglarla daha mürəkkəb siqnallarla işləyə biləcəyiniz də doğrudur.

Ilə ejemplo, rəqəmsal bir Hall effekti sensoru yalnız yaxınlıqdakı maqnit sahəsinin olub olmadığını yoxlaya bilər. Bunun əvəzinə, bir analog Hall effekti sensoru bunu edə bilər və eyni zamanda çıxışında yaratdığı bir analog siqnal sayəsində bu maqnit sahəsinin sıxlığını təyin edə bilər. Daha yüksək və ya aşağı gərginlik siqnalını necə yaxşı şərh edəcəyinizi bilməklə bu böyüklüyü asanlıqla bilə bilərsiniz. Bir çox təbiət böyüklüyündə analoq bir sistemlə kəmiyyət olaraq ölçə biləcəyiniz başqa nümunələriniz var, məsələn, temperatur, vaxt, təzyiq, məsafə, səs və s.

Analoq və rəqəmsal siqnal

Deyilənə görə, a analoq siqnal Zamanla və davamlı olaraq dəyişən bir gərginlik və ya elektrik cərəyanı olacaqdır. Bir qrafik üzərində çəkilsə, analoq siqnal tək tezlikli sinus dalğası olardı.

Kimi rəqəmsal siqnal, zamana görə addım-addım dəyişən bir gərginlikdir. Yəni bir qrafada təmsil olunarsa, davamlı olaraq dəyişməyən, ancaq addımlarda və ya ayrı-ayrı artımlarda dəyişən bir addım siqnalı olacaqdır.

Analoq siqnaldan rəqəmsal və ya əksinə keçmək üçün sxemlərin olduğunu bilməlisiniz. Bunlar çeviricilər bunlar DAC (Rəqəmsal-Analog Dönüştürücü) və ADC (Analoqdan Rəqəmli Dönüştürücü) kimi tanınır. Və bu gün istifadə etdiyimiz bir çox cihazda, məsələn TV, kompüter və s. Bunların köməyi ilə bu avadanlıqlar tərəfindən istifadə olunan rəqəmsal siqnalları digər ətraf mühit və ya analog işləyən hissələrlə işləmək üçün elektron səviyyəyə çevirə bilərsiniz.

Ilə ejemplo, səs kartı ilə işləyən analog siqnalları olan bir hoparlör və ya mikrofon və ya analog monitor portları üçün məşhur RAMDAC çipi olan rəqəmsal qrafik kartları ... Arduino-da bu tip çeviricilər bir çox layihə üçün də istifadə ediləcəyi kimi görüləcəkdir. ...

PWM nədir?

qrafik vəzifə dövrü

Baxmayaraq ki PWM (Pulse-Width Modulation) və ya nəbz genişliyi modulyasiyası, rəqəmsal bazaya malikdir, siqnalının forması bir qədər "kvadrat" analoq siqnala bənzəyir. Rəqəmsal impulslar vasitəsi ilə analoq sistemi təqlid etmək üçün əvvəlcədən şərh etdiyim kimi siqnalları dəyişməyə imkan verir. Əslində, ada baxsanız, rəqəmsal impulsların genişliyi ilə onsuz da sizə nə etdiyinin ipuçlarını verir.

Bunun üçün faydalıdır Arduino çünki layihələrinizə əlavə edə biləcəyiniz bir çox avtomatizm və ya elektron komponent var həqiqi bir analog siqnal təmin edə bilmirlər, lakin işləmək üçün bu PWM-dən istifadə edirlər. Ayrı-ayrı bir analog siqnal istifadə edə bilməzlər, yəni rəqəmsal bir siqnala bənzəmək üçün gərginlik atlamalarına gedirlər. Nə edə bilərlər, bu özünəməxsus siqnal yaratmaq üçün rəqəmsal bir rəqəmsal -Vcc və ya Vcc çıxışı istifadə etməkdir ...

Buna görə PWM, Arduino və digər sistemlərin bu tip siqnallarla işləyə biləcəyi bir növ "hiylə" dir. tamamilə analog və ya ənənəvi rəqəmsal hala gəlmirlər. Bunu mümkün etmək üçün, hər zaman maraqdan asılı olaraq, müəyyən bir müddətə bir rəqəmsal çıxışı aktiv saxlayırlar. Bu, impulsları eyni eni olan rəqəmsal bir saat və ya ikili kod siqnalından uzaqdır.

Arduino ilə həyata keçirdiyiniz layihələrdə zamanla nəbz tetikleyicilerinin sabit bir tezliyinin saxlanıldığı bu tip PWM siqnallarını yoxlaya bilərsiniz, ancaq bu impulsların eni dəyişir. Əslində, dövriyyənin cəmi ilə əlaqəli bir siqnal yüksək tutulduqda Duty Cycle adlanır. Buna görə vəzifə dövrü% ilə verilir.

Bir PWM'nin bir analoq siqnalda olduğu kimi, müxtəlif gərginlik dəyərləri arasında işləmədiyini və aralarında dəyişdiyini unutmayın. PWM vəziyyətində rəqəmsal üslubda bir kvadrat siqnaldır və maksimum dəyəri Vcc. Məsələn, 3V enerji təchizatı ilə işləsəniz, 3V və ya 0V pulslar verə bilərsiniz, ancaq 1V və ya başqa bir real analoqda baş verə biləcəyi başqa bir orta dəyər verə bilməzsiniz. Bu vəziyyətdə dəyişən nəbz genişliyidir, 30% -i yüksək Vcc dəyərində saxlaya bilərik və ya daha çox güc vermək üçün 60% -i saxlaya bilərik.

Ancaq diqqətli olun, çünki bir cihaz Vcc limitini dəstəkləyirsə və PWM ilə aşılırsa, zədələnə bilər. Beləliklə, istehsalçıların təqdim etdiyi məlumat cədvəllərinin dəyərlərinə hörmət etmək hər zaman lazım olacaqdır. Ayrıca, DC mühərrikləri kimi bəzi cihazlarda, röleler, elektromaqnitlər və s., Vəzifə dövrü sonrası bir gerilimin çəkilməsi induktiv yüklərin zədələnməsinə səbəb ola bilər. Buna görə qorunması vaxtında.

Arduinodakı PWM

Arduino I2C avtobusu

İndi necə işlədiyini bildiyinizə görə, Arduino dünyasındakı xüsusi PWM halını görək ...

PWM: Arduino-da pinout

Arduino lövhələrində hardware PWM tətbiq edən bir neçə pin tapa bilərsiniz. Onları PCB-də müəyyən edə bilərsiniz, çünki onlar var simvol ~ (kiçik baş) pin nömrələməsi ilə birlikdə. Arduino kodundakı proqram vasitəsi ilə də edilə bilər, ancaq bu, mikrokontroleri iş ilə həddindən artıq yükləyə bilər, təbii olaraq və hardware ilə edilə biləcəyi zaman absurd bir şey ...

  • Arduino UNO, Mini və Nano- 6, 8, 3, 5, 6 və 9 nömrəli pinlərdə 10 ədəd 11-bit PWM çıxışınız var, bunlar nömrənin tam qarşısında olmalıdır.
  • Mega Arduino- Bu ən güclü Arduino lövhəsində 15 8 bitlik PWM çıxışınız var. 2-dən 13-ə və 44-dən 46-a qədər olan sancaqlardadır.
  • Arduino görə: bu vəziyyətdə 13 8-bit PWM çıxışı var. Bunlar 2-dən 13-ə qədər sancaqlardadır, üstəlik DAC tərəfindən 12-bit çözünürlüklə ayrılmış iki digər analog çıxış var.

Bu tip PWM çıxışlarında 8 bit və ya 12 bit, və s. Bir qətnamədən bəhs etdiyiniz zaman manevr üçün otağı nəzərdə tutursunuz. İlə 8 bit 256 səviyyəyə malikdir Aralarında dəyişə bilərsiniz və 12 bit 4096 səviyyəsinə yüksəlir.

Taymerlərlə nəzarət

Donanım PWM nəzarəti üçün, Arduino taymerlərdən istifadə edəcəkdir bunun üçün. Hər bir indiki Taymer 2 və ya 3 PWM nəticəsinə xidmət edə bilər. Hər bir çıxış üçün müqayisə reyestri bu sistemi tamamlayır, beləliklə vaxt qeydin dəyərinə çatdıqda həmin Vəzifə dövrlərini dayandırmaq üçün məhsulun vəziyyəti və ya dəyəri dəyişdirilir. Eyni Taymer tərəfindən idarə olunan iki çıxış olmasına baxmayaraq, eyni tezliyi bölüşsələr də, hər ikisi də fərqli Duty Cycles ola bilər.

Hər bir PWM pimi ilə əlaqəli Taymerlər vəziyyətində, fərqli olacaq Arduino lövhəsinin növündən asılı olaraq səndə:

  • Arduino UNO, Mini və Nano:
    • Taymer0 - 5 və 6
    • Taymer1 - 9 və 10
    • Taymer2 - 3 və 11
  • Mega Arduino:
    • Taymer0 - 4 və 13
    • Taymer1 - 11 və 12
    • Taymer2 - 9 və 10
    • Taymer3 - 2, 3 və 5
    • Taymer4 - 6, 7 və 8
    • Taymer5 - 44, 45 və 46

Əvvəlcədən tərtib olunmuş qeyd vaxtı bir tam ədədə böləcək və Taymer əlaqəli PWM çıxışlarının hər birini idarə etmək üçün qalan hissəni edir. Qeyd dəyərini dəyişdirmək tezliyi dəyişdirə bilər. The tezliklər Taymerə və lövhəyə görə də fərqli olacaqlar:

  • Arduino UNO, Mini və Nano:
    • Timer0: 1, 8, 64, 256 və 1024-ün əvvəlcədən ölçülməsinə imkan verir. Tezlik 62.5 Khz-dir.
    • Timer1: 1, 8, 64, 256 və 1024 ön ayarları ilə. 31.25 Khz tezliyi ilə.
    • Timer2: Timer1-ə bərabərdir, yalnız əvvəlkilərə əlavə olaraq 32 və 128 ölçüsünü əlavə edir.
  • Mega Arduino:
    • Timer0, 1, 2: yuxarıdakı kimi.
    • 3, 4 və 5 sayğacı: 31.25 Khz tezliklə və əvvəlcədən 1, 8, 64, 256 və 1024 ilə.

Uyuşmazlıqlar və münaqişələr

Taymer nəticələrlə əlaqəli yalnız bu funksiya üçün deyil, başqaları tərəfindən də istifadə olunur. Buna görə də, başqa bir funksiya tərəfindən istifadə olunursa, bunlardan birini seçməlisiniz, ikisini də eyni vaxtda istifadə edə bilməzsiniz. Məsələn, bunlar layihələrinizdə tapa biləcəyiniz uyğunsuzluqlardan bəziləri:

  • Servo kitabxanası: Servo mühərriklərdən istifadə etdiyiniz zaman Taymerlər intensiv istifadə olunur ki, bu da münaqişələrə səbəb ola bilər. Xüsusi olaraq UNO, Nano və Mini üçün Timer1 istifadə edin, yəni 9 və 10 sayğaclarını həmin kitabxana ilə bir eskiz istifadə edərkən istifadə edə bilməzsiniz. Mega'da servo sayından asılı olacaq ...
  • SPI: Arduino lövhəsində SPI rabitəsi istifadə olunursa, pin 11 MOSI funksiyası üçün istifadə olunur. Bu səbəbdən PWM pin istifadə edilə bilməz.
  • Ton: bu funksiya işləmək üçün Timer2-dən istifadə edir. Beləliklə, istifadə olunursa, 3 və 11 nömrəli pinləri (və ya Mega üçün 9 və 10) yararsız hala gətirirsiniz.

Arduino ilə praktik sınaq

LED ilə Arduino PWM şeması

PWM-nin Arduino-da necə işlədiyini yerində görmək istəyirsinizsə, edə biləcəyiniz ən yaxşı şey, ölçmə nöqtələrini birləşdirməkdir voltmetr və ya multimetr istifadə etməyi seçdiyiniz PWM pimi ilə Arduino lövhəsinin torpaq pimi və ya GND arasında (gərginliyi ölçmək funksiyasında). Bu şəkildə ölçmə cihazının ekranında bu PWM hiylə sayəsində rəqəmsal bir çıxış ilə gərginliyin necə dəyişdiyini görə biləcəksiniz.

İşığın intensivliyinin necə dəyişdiyini, bir DC mühərriki ilə və ya istədiyiniz başqa bir elementlə görmək üçün voltmetr / multimetri bir LED ilə əvəz edə bilərsiniz. Diaqramda daha çox olmadan bir LED ilə Fritzing ilə sadələşdirdim, ancaq bir multimetrenin uclarını da təmsil edə biləcəyini bilirik ...

Bir LED istifadə edirsinizsə, katot və GND-dəki müqaviməti xatırlayın.

qədər mənbə kodu Hər şeyi işlək vəziyyətə gətirmək üçün Arduino lövhəsi mikrokontrolörünü idarə etmək üçün bunu Arduino IDE-yə daxil etməlisiniz (bu halda PWM pin 6 istifadə etdim 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  
   } 
} 
Dəyərlərlə oynamağınızı və görməyinizi məsləhət görürəm işıq və ya voltmetrdə nəticələr. Proqram 0-dan 9-a qədər dəyər ala bilər, beləliklə hər şeyin necə dəyişdiyini görə bilərsiniz. Daha çox məlumat üçün sizə məsləhət görürəm arduino kursu pulsuz yüklədiyimiz ...

Məqalənin məzmunu bizim prinsiplərimizə uyğundur redaktor etikası. Xəta bildirmək üçün klikləyin burada.

Bir şərh, özünüzü buraxın

Şərhinizi buraxın

E-poçt ünvanından dərc olunmayacaq.

*

*

  1. Verilərdən məsul: Miguel Ángel Gatón
  2. Verilənlərin məqsədi: Nəzarət SPAM, şərh rəhbərliyi.
  3. Qanuniləşdirmə: Sizin razılığınız
  4. Məlumatların ötürülməsi: Qanuni öhdəlik xaricində məlumatlar üçüncü şəxslərə çatdırılmayacaqdır.
  5. Veri saxlama: Occentus Networks (AB) tərəfindən yerləşdirilən verilənlər bazası
  6. Hüquqlar: İstədiyiniz zaman məlumatlarınızı məhdudlaşdıra, bərpa edə və silə bilərsiniz.

  1.   Jose deyib

    Salam xeyirli günler Əvvəlcə ən yeni üçün bu izahata həsr etdiyiniz vaxt üçün sizə təşəkkür etmək istəyirəm.
    Mən sizə bir sorğu etmək istərdim. Kodu Arguino Mega üçün bir proteus 8 emulatorunda işləməyə çalışıram. Bir voltmetri pin 6-ya bağlayıram, Proteus ardıcıl bir porta bağlıdır, amma fərqli voltajların çıxması üçün necə və ya nəyin dəyişəcəyini bilmirəm. Kodun tərtib edilməsi üçün ona kiçik düzəlişlər etmək məcburiyyətində qaldım. Kömək üçün çox sağ olun

İngilis dili testiKatalan dilini sınayınispan viktorina