PWM: mô phỏng các chân analog với bảng Arduino của bạn

Tín hiệu PWM

Với các chân analog và kỹ thuật số, bạn có thể sử dụng trên bảng Arduino của mình, bạn có thể nhận hoặc gửi tín hiệu điện để điều khiển hoặc lấy dữ liệu từ các dự án điện tử của mình. Ngoài ra, có những tín hiệu rất thú vị khác trong loại tấm này, đó là , có thể giả lập một tín hiệu tương tự mà không thực sự là tín hiệu tương tự. Có nghĩa là, chúng là các chân kỹ thuật số có thể hoạt động theo cách tương tự (không giống nhau) như một tín hiệu tương tự.

Những loại tín hiệu này rất thiết thực khi bạn không chỉ muốn sử dụng tín hiệu kỹ thuật số CAO và THẤP, tức là 1 hoặc 0, BẬT và TẮT, mà bạn muốn đi xa hơn và mô tả tín hiệu có phần phức tạp hơn. Ví dụ, có thể điều chỉnh tốc độ của Động cơ DC, hoặc cường độ ánh sáng của đèn, đối với điện từ, v.v.

Hệ thống tương tự và kỹ thuật số

Tín hiệu tương tự và tín hiệu kỹ thuật số

Các mạch điện tử có thể được chia thành hai họ hoặc loại lớn: kỹ thuật số và tương tự. Khi nói về điện tử kỹ thuật số, chúng ta đang sử dụng các đại lượng có giá trị rời rạc, nghĩa là, một hệ nhị phân được biểu diễn bằng các tín hiệu điện của điện áp thấp hoặc cao để diễn giải trạng thái của các bit đó được xử lý. Mặt khác, khi nói đến mạch tương tự, các đại lượng có giá trị liên tục đang được sử dụng.

Trong các hệ thống kỹ thuật số có thể được tìm thấy lần lượt những người thuộc loại tổ hợp và những người thuộc loại tuần tự. Có nghĩa là, đầu ra của hệ thống chỉ phụ thuộc vào trạng thái của các đầu vào. Mặt khác, trong các tuần tự, các phần tử bộ nhớ được bao gồm và đầu ra sẽ phụ thuộc vào trạng thái hiện tại của các đầu vào và trạng thái trước đó được lưu trữ.

Trong trường hợp tương tự không có hai nhóm lớn hoặc biến thể này, vì ở đây chúng là các tín hiệu liên tục sẽ luôn phụ thuộc vào tín hiệu hệ thống hiện tại. Ví dụ: trong loa, tín hiệu bạn cung cấp phụ thuộc vào âm thanh bạn muốn tái tạo. Với micrô cũng vậy, sẽ tạo ra tín hiệu tương tự tùy thuộc vào âm thanh mà nó đang nhận được. Chắc chắn bạn cũng đã thấy nó với nhiều cảm biến khác mà chúng tôi đã mô tả trong blog này và hoạt động với tín hiệu tương tự (và do đó, phải tạo ra một công thức để sau này các giá trị có thể được tính toán hoặc điều chỉnh trong các bản phác thảo Arduino IDE ) ...

Những đặc điểm này của cái này và cái khác khiến một số có ưu điểm và nhược điểm, như thường lệ trong hầu hết mọi thứ. Ví dụ, kỹ thuật số có xu hướng rẻ hơn, nhanh hơn, dễ phát triển hơn, thông tin có thể được lưu trữ dễ dàng hơn, độ chính xác cao hơn, chúng có thể được lập trình, chúng không dễ bị ảnh hưởng của nhiễu, v.v. Nhưng nó cũng đúng là với các chất tương tự, bạn có thể hoạt động với các tín hiệu phức tạp hơn.

qua ejemplo, một cảm biến hiệu ứng Hall loại kỹ thuật số chỉ có thể phát hiện sự hiện diện hoặc vắng mặt của một từ trường gần đó. Thay vào đó, một cảm biến hiệu ứng Hall tương tự có thể làm điều đó và cũng xác định mật độ của từ trường nói trên nhờ vào tín hiệu tương tự mà nó tạo ra ở đầu ra của nó. Biết cách giải thích tốt tín hiệu của điện áp cao hơn hoặc thấp hơn, bạn có thể dễ dàng biết được độ lớn đó. Bạn có các ví dụ khác về vô số độ lớn của tự nhiên mà bạn có thể đo định lượng bằng hệ thống tương tự, chẳng hạn như nhiệt độ, thời gian, áp suất, khoảng cách, âm thanh, v.v.

Tín hiệu tương tự và tín hiệu kỹ thuật số

Điều đó đang được nói, một tín hiệu tương tự Nó sẽ là một điện áp hoặc dòng điện thay đổi theo thời gian và liên tục. Nếu được vẽ biểu đồ, tín hiệu tương tự sẽ là một sóng sin tần số đơn.

Khi tín hiệu kĩ thuật số, là một điện áp thay đổi theo từng bước theo thời gian. Có nghĩa là, nếu nó được biểu diễn dưới dạng đồ thị, nó sẽ là một tín hiệu bước không thay đổi liên tục mà thay đổi theo từng bước hoặc gia số rời rạc.

Bạn nên biết rằng có những mạch để đi từ tín hiệu tương tự sang tín hiệu kỹ thuật số hoặc ngược lại. Những người chuyển đổi chúng được gọi là DAC (Digital-to-Analog Converter) và ADC (Analog-to-Digital Converter). Và chúng rất phổ biến trong nhiều thiết bị mà chúng ta sử dụng ngày nay, chẳng hạn như TV, máy tính, v.v. Với chúng, bạn có thể chuyển đổi tín hiệu kỹ thuật số được sử dụng bởi các thiết bị này sang mức điện tử để hoạt động với các thiết bị ngoại vi hoặc các bộ phận khác hoạt động ở chế độ tương tự.

qua ejemplo, loa hoặc micrô với tín hiệu tương tự hoạt động với card âm thanh hoặc các card đồ họa kỹ thuật số có chip RAMDAC nổi tiếng cho các cổng màn hình tương tự ... Trong Arduino, loại bộ chuyển đổi này cũng được sử dụng cho nhiều dự án, như chúng ta sẽ thấy ...

PWM là gì?

chu kỳ nhiệm vụ đồ họa

Mặc dù PWM (Điều chế độ rộng xung), hoặc điều chế độ rộng xung, có một đế kỹ thuật số, hình dạng của tín hiệu của nó giống như một tín hiệu tương tự hơi "vuông". Nó cho phép các xung kỹ thuật số thay đổi tín hiệu để mô phỏng một hệ thống tương tự như tôi đã nhận xét trước đây. Trên thực tế, nếu bạn nhìn vào tên, nó đã cung cấp cho bạn manh mối về những gì nó hoạt động, thông qua độ rộng của các xung kỹ thuật số.

Điều này có lợi cho Arduino vì có rất nhiều tự động hoặc linh kiện điện tử mà bạn có thể thêm vào các dự án của mình và không có khả năng cung cấp tín hiệu tương tự thực sự, nhưng họ sử dụng PWM này để hoạt động. Họ cũng không thể sử dụng tín hiệu tương tự rời rạc, tức là tín hiệu điện áp nhảy để giống tín hiệu kỹ thuật số. Những gì họ có thể làm là sử dụng đầu ra kỹ thuật số -Vcc hoặc Vcc thuộc loại kỹ thuật số để tạo ra tín hiệu đặc biệt này ...

Do đó, PWM là một loại "thủ thuật" mà Arduino và các hệ thống khác có thể tương tác với loại tín hiệu này chúng không hoàn toàn tương tự và cũng không phải là kỹ thuật số thông thường. Để làm cho nó có thể, họ giữ cho đầu ra kỹ thuật số hoạt động trong một thời gian cụ thể hoặc tắt, tùy thuộc vào sở thích tại mọi thời điểm. Điều này khác xa so với những gì sẽ là một đồng hồ kỹ thuật số hoặc tín hiệu mã nhị phân, có các xung có cùng độ rộng.

Trong các dự án của bạn với Arduino, bạn có thể kiểm tra loại tín hiệu PWM này, trong đó tần số kích hoạt xung không đổi được duy trì theo thời gian, nhưng độ rộng của các xung này rất khác nhau. Trên thực tế, nó được gọi là Chu kỳ nhiệm vụ khi một tín hiệu được giữ ở mức cao so với tổng chu kỳ. Do đó, Chu kỳ nhiệm vụ được tính bằng%.

Hãy nhớ rằng trong PWM, bạn không làm việc như trong tín hiệu tương tự, giữa các giá trị điện áp khác nhau và dao động giữa chúng. Trong trường hợp PWM, nó là một tín hiệu vuông theo kiểu kỹ thuật số và có giá trị lớn nhất là Vcc. Ví dụ: nếu bạn làm việc với nguồn điện 3V, bạn có thể cung cấp xung 3V hoặc 0V, nhưng không phải 1V hoặc bất kỳ giá trị trung gian nào khác như sẽ xảy ra trong một tương tự thực. Điều gì sẽ thay đổi trong trường hợp đó là độ rộng của xung, chúng ta có thể giữ 30% ở giá trị Vcc cao đó hoặc 60% để cung cấp cho nó nhiều năng lượng hơn, v.v.

Nhưng hãy cẩn thận, bởi vì nếu một thiết bị hỗ trợ giới hạn Vcc và vượt quá PWM, nó có thể bị hỏng. Vì vậy, sẽ luôn luôn cần thiết phải tôn trọng các giá trị của bảng dữ liệu do nhà sản xuất cung cấp. Ngoài ra, trong một số thiết bị như động cơ DC, rơ le, nam châm điện, v.v., việc rút điện áp sau Chu kỳ làm việc có thể có nghĩa là tải cảm ứng có thể gây ra hư hỏng. Đó là lý do tại sao bảo vệ hợp thời.

PWM trên Arduino

Bus Arduino I2C

Bây giờ bạn đã biết nó hoạt động như thế nào, hãy xem trường hợp cụ thể của PWM trong thế giới Arduino ...

PWM: sơ đồ chân trên Arduino

Trên bảng Arduino, bạn có thể tìm thấy một số chân thực hiện PWM phần cứng. Bạn có thể xác định chúng trên chính PCB vì chúng có biểu tượng ~ (đầu nhỏ) cùng với việc đánh số pin. Nó cũng có thể được thực hiện bằng phần mềm trong mã Arduino, nhưng điều đó sẽ làm quá tải bộ vi điều khiển, một điều vô lý khi nó có thể được thực hiện nguyên bản và bằng phần cứng ...

  • Arduino UNO, Mini và Nano- Bạn có 6 đầu ra PWM 8-bit trên các chân 3, 5, 6, 9, 10 và 11, sẽ có ~ ngay trước số.
  • Mega Arduino- Trên bảng Arduino mạnh mẽ nhất này, bạn có 15 đầu ra PWM 8-bit. Chúng nằm trên các chân từ 2 đến 13 và 44 đến 46.
  • Arduino Đến hạn: trong trường hợp này có 13 đầu ra PWM 8-bit. Chúng nằm trên các chân từ 2 đến 13, cộng với hai đầu ra tương tự khác được DAC với độ phân giải 12-bit.

Khi bạn nói về độ phân giải 8 bit hoặc 12 bit, v.v., trong loại đầu ra PWM này, bạn đang đề cập đến khả năng điều khiển mà bạn có. Với 8 bit có 256 mức Giữa các mức đó bạn có thể thay đổi và 12 bit lên đến 4096 mức.

Kiểm soát với Bộ hẹn giờ

Đối với điều khiển PWM phần cứng, Arduino sẽ sử dụng bộ đếm thời gian cho nó. Mỗi Timer hiện tại có thể phục vụ 2 hoặc 3 đầu ra PWM. Thanh ghi so sánh cho mỗi đầu ra bổ sung cho hệ thống này để khi thời gian đạt đến giá trị của thanh ghi, trạng thái hoặc giá trị của đầu ra được thay đổi để dừng các Chu kỳ nhiệm vụ đó. Mặc dù có hai đầu ra được điều khiển bởi cùng một Bộ hẹn giờ, cả hai đều có thể có các Chu kỳ nhiệm vụ khác nhau, mặc dù chúng có cùng tần số.

Trong trường hợp các Bộ hẹn giờ được liên kết với mỗi chân PWM, nó sẽ khác nhau tùy thuộc vào loại bảng Arduino mà bạn có:

  • Arduino UNO, Mini và Nano:
    • Hẹn giờ 0 - 5 và 6
    • Hẹn giờ 1 - 9 và 10
    • Hẹn giờ 2 - 3 và 11
  • Mega Arduino:
    • Hẹn giờ 0 - 4 và 13
    • Hẹn giờ 1 - 11 và 12
    • Hẹn giờ 2 - 9 và 10
    • Bộ hẹn giờ 3 - 2, 3 và 5
    • Bộ hẹn giờ 4 - 6, 7 và 8
    • Bộ hẹn giờ 5 - 44, 45 và 46

Thanh ghi định sẵn sẽ chia thời gian cho một số nguyên và Bộ định thời thực hiện phần còn lại để điều khiển từng đầu ra PWM liên quan. Việc sửa đổi giá trị đăng ký có thể thay đổi tần suất. Các tần số Chúng cũng sẽ khác nhau tùy thuộc vào Bộ hẹn giờ và đĩa:

  • Arduino UNO, Mini và Nano:
    • Timer0: cho phép cài đặt trước 1, 8, 64, 256 và 1024. Tần số là 62.5 Khz.
    • Timer1: với các giá trị đặt trước là 1, 8, 64, 256 và 1024. Với tần số 31.25 Khz.
    • Timer2: tương đương với Timer1, chỉ có điều nó bổ sung thêm các định mức trước là 32 và 128.
  • Mega Arduino:
    • Timer0, 1, 2: tương tự như trên.
    • Timer3, 4 và 5: với tần số 31.25 Khz và được đặt trước là 1, 8, 64, 256 và 1024.

Không tương thích và xung đột

Bộ hẹn giờ liên kết với các kết quả đầu ra không chỉ dành cho chức năng đó, cũng được sử dụng bởi những người khác. Do đó, nếu chúng đang được sử dụng bởi một chức năng khác, bạn phải chọn giữa cái này hoặc cái kia, bạn không thể sử dụng cả hai cùng một lúc. Ví dụ: đây là một số điểm không tương thích mà bạn có thể tìm thấy trong các dự án của mình:

  • Thư viện Servo: Khi bạn sử dụng động cơ servo, Bộ hẹn giờ được sử dụng nhiều, có thể dẫn đến xung đột. Cụ thể là sử dụng Timer1 cho UNO, Nano và Mini, nghĩa là bạn không thể sử dụng chân 9 và 10 khi đang sử dụng bản phác thảo với thư viện đó. Trong Mega, nó sẽ phụ thuộc vào số lượng các Serv ...
  • SPI: Nếu giao tiếp SPI được sử dụng trên bảng Arduino, chân 11 đang được sử dụng cho chức năng MOSI. Đó là lý do tại sao chân PWM đó không thể được sử dụng.
  • Giai điệu: chức năng này sử dụng Timer2 để hoạt động. Vì vậy, nếu nó được sử dụng, bạn đang làm cho các chân 3 và 11 (hoặc 9 và 10 cho Mega) trở nên vô dụng.

Thử nghiệm thực hành với Arduino

Sơ đồ Arduino PWM với đèn LED

Nếu bạn muốn xem tại chỗ PWM hoạt động như thế nào trên Arduino, điều tốt nhất bạn có thể làm là kết nối các dây dẫn đo lường của vôn kế hoặc đồng hồ vạn năng (trong chức năng đo điện áp) giữa chân PWM mà bạn đã chọn sử dụng và chân nối đất hoặc GND của bảng Arduino. Bằng cách này, trên màn hình của thiết bị đo, bạn sẽ có thể xem điện áp đang thay đổi như thế nào với một đầu ra là kỹ thuật số nhờ thủ thuật PWM này.

Bạn có thể thay thế vôn kế / đồng hồ vạn năng bằng đèn LED để xem cường độ ánh sáng thay đổi như thế nào, với động cơ DC hoặc với bất kỳ phần tử nào khác mà bạn muốn. Tôi đã đơn giản hóa nó trong sơ đồ với Fritzing với đèn LED mà không có nhiều hơn, nhưng biết rằng nó cũng có thể đại diện cho các đầu của đồng hồ vạn năng ...

Nếu bạn sử dụng đèn LED, hãy nhớ điện trở ở cực âm và GND.

đến mã nguồn Để điều khiển vi điều khiển bảng Arduino giúp mọi thứ hoạt động, bạn nên chèn bộ vi điều khiển này vào Arduino IDE (trong trường hợp này tôi đã sử dụng chân PWM 6 của 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  
   } 
} 
Tôi khuyên bạn nên chơi với các giá trị và xem kết quả trên đèn hoặc vôn kế. Chương trình có thể nhận các giá trị từ 0 đến 9 để bạn có thể thấy mọi thứ thay đổi như thế nào. Để biết thêm thông tin, tôi khuyên bạn khóa học arduino mà chúng tôi có trong bản tải xuống miễn phí ...

Một bình luận, để lại của bạn

Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   Jose dijo

    Xin chào một ngày mới tốt lành. Trước hết, tôi muốn cảm ơn bạn đã dành thời gian cho phần giải thích mới nhất này.
    Tôi muốn làm cho bạn một truy vấn. Tôi đang cố gắng chạy mã trên trình giả lập proteus 8 cho Arguino Mega. Tôi kết nối một vôn kế với chân 6, Proteus được kết nối với một cổng nối tiếp, nhưng tôi không biết làm thế nào hoặc những gì để thay đổi để các điện áp khác nhau được đầu ra. Tôi đã phải thực hiện những điều chỉnh nhỏ đối với mã để làm cho nó được biên dịch. Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn