tìm hiểu bit trong arduino

Điều chế độ rộng xung hoặc PWM là một kỹ thuật phổ biến được sử dụng để thay đổi độ rộng của các xung trong một hệ thống xung. PWM có nhiều ứng dụng như điều khiển các servo và bộ điều khiển tốc độ, hạn chế công suất hiệu quả của động cơ và đèn LED.

Nguyên tắc cơ bản của PWM

Điều chế độ rộng xung về cơ bản là một sóng vuông với thời gian cao thấp khác nhau. Một tín hiệu PWM cơ bản được hiển thị trong hình sau.

Arduino - Điều chế độ rộng xung

Có nhiều thuật ngữ khác nhau liên quan đến PWM –

  • Đúng giờ – Thời lượng của tín hiệu thời gian cao.
  • Off-Time – Khoảng thời gian của tín hiệu thời gian thấp.
  • Khoảng thời gian – Nó được biểu thị bằng tổng thời gian đúng giờ và không thời gian của tín hiệu PWM.
  • Chu kỳ nhiệm vụ – Nó được biểu thị bằng phần trăm tín hiệu thời gian vẫn bật trong khoảng thời gian của tín hiệu PWM.

Giai đoạn = Stage

Như trong hình, T on biểu thị thời gian đúng giờ và T off biểu thị thời gian tắt của tín hiệu. Khoảng thời gian là tổng của cả thời gian bật và tắt và được tính như thể hiện trong phương trình sau:

$$ T_ {total} = T_ {on} + T_ {off} $$

Chu kỳ nhiệm vụ

Chu kỳ nhiệm vụ được tính là thời gian đúng của khoảng thời gian. Sử dụng khoảng thời gian được tính ở trên, chu kỳ nhiệm vụ được tính là –

$$ D = \ frac {T_ {on}} {T_ {on} + T_ {off}} = \ frac {T_ {on}} {T_ {total}} $$

Hàm analogWrite ()

Hàm analogWrite () ghi một giá trị tương tự (sóng PWM) vào một chân. Nó có thể được sử dụng để thắp sáng đèn LED ở các độ sáng khác nhau hoặc điều khiển động cơ ở nhiều tốc độ khác nhau. Sau một lệnh gọi của hàm analogWrite (), chân sẽ tạo ra một sóng vuông ổn định của chu kỳ nhiệm vụ được chỉ định cho đến lần gọi tiếp theo tới analogWrite () hoặc một lệnh gọi tới digitalRead () hoặc digitalWrite () trên cùng một chân. Tần số của tín hiệu PWM trên hầu hết các chân là khoảng 490 Hz. Trên Uno và các bảng tương tự, chân 5 và 6 có tần số xấp xỉ 980 Hz. Chân 3 và 11 trên Leonardo cũng chạy ở tần số 980 Hz. Trên hầu hết các bảng Arduino (những bảng có ATmega168 hoặc ATmega328), chức năng này hoạt động trên các chân 3, 5, 6, 9, 10 và 11. Trên Arduino Mega, nó hoạt động trên các chân 2 – 13 và 44 – 46. Arduino cũ hơn bo mạch với ATmega8 chỉ hỗ trợ analogWrite () trên các chân 9, 10 và 11.

Arduino - Điều chế độ rộng xung

Arduino Due hỗ trợ analogWrite () trên các chân từ 2 đến 13 và các chân DAC0 và DAC1. Không giống như các chân PWM, DAC0 và DAC1 là các bộ chuyển đổi Digital sang Analog và hoạt động như các đầu ra tương tự thực sự.

Bạn không cần gọi pinMode () để đặt chân làm đầu ra trước khi gọi analogWrite ().

Cú pháp hàm analogWrite ()

analogWrite ( pin , value ) ;

giá trị – chu kỳ nhiệm vụ: từ 0 (luôn tắt) đến 255 (luôn bật).

Thí dụ

int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value

void setup() {
   pinMode(ledPin, OUTPUT); // sets the pin as output
}

void loop() {
   val = analogRead(analogPin); // read the input pin
   analogWrite(ledPin, (val / 4)); // analogRead values go from 0 to 1023, 
      // analogWrite values from 0 to 255
}

Arduino – Số ngẫu nhiên

Để tạo số ngẫu nhiên, bạn có thể sử dụng các hàm số ngẫu nhiên của Arduino. Chúng tôi có hai chức năng –

  • randomSeed (hạt giống)
  • ngẫu nhiên()

randomSeed (hạt giống)

Hàm randomSeed (hạt giống) đặt lại bộ tạo số giả ngẫu nhiên của Arduino. Mặc dù sự phân bố của các số được trả về bởi random () về cơ bản là ngẫu nhiên, trình tự có thể dự đoán được. Bạn nên đặt lại trình tạo thành một số giá trị ngẫu nhiên. Nếu bạn có một chân analog chưa được kết nối, nó có thể nhận nhiễu ngẫu nhiên từ môi trường xung quanh. Đó có thể là sóng vô tuyến, tia vũ trụ, nhiễu điện từ từ điện thoại di động, đèn huỳnh quang, v.v.

Thí dụ

randomSeed(analogRead(5)); // randomize using noise from analog pin 5

ngẫu nhiên( )

Hàm ngẫu nhiên tạo ra các số giả ngẫu nhiên. Sau đây là cú pháp.Cú pháp câu lệnh random ()

long random(max) // it generate random numbers from 0 to max
long random(min, max) // it generate random numbers from min to max
long randNumber;

void setup() {
   Serial.begin(9600);
   // if analog input pin 0 is unconnected, random analog
   // noise will cause the call to randomSeed() to generate
   // different seed numbers each time the sketch runs.
   // randomSeed() will then shuffle the random function.
   randomSeed(analogRead(0));
}

void loop() {
   // print a random number from 0 to 299
   Serial.print("random1=");
   randNumber = random(300);
   Serial.println(randNumber); // print a random number from 0to 299
   Serial.print("random2=");
   randNumber = random(10, 20);// print a random number from 10 to 19
   Serial.println (randNumber);
   delay(50);
}

Bây giờ chúng ta hãy làm mới kiến ​​thức của mình về một số khái niệm cơ bản như bit và byte.

Chút ít

Một bit chỉ là một chữ số nhị phân.

  • Hệ thống nhị phân sử dụng hai chữ số, 0 và 1.
  • Tương tự như hệ thống số thập phân, trong đó các chữ số của một số không có cùng giá trị, ‘ý nghĩa’ của một bit phụ thuộc vào vị trí của nó trong số nhị phân. Ví dụ, các chữ số trong số thập phân 666 giống nhau, nhưng có các giá trị khác nhau.
tìm hiểu bit arduino

Byte

Một byte bao gồm tám bit.

  • Nếu một bit là một chữ số, thì hợp lý là các byte đại diện cho các số.
  • Tất cả các phép toán có thể được thực hiện dựa trên chúng.
  • Các chữ số trong một byte cũng không có cùng ý nghĩa.
  • Bit ngoài cùng bên trái có giá trị lớn nhất được gọi là Bit quan trọng nhất (MSB).
  • Bit ngoài cùng bên phải có giá trị nhỏ nhất và do đó, được gọi là Bit ít quan trọng nhất (LSB).

Vì tám số không và các số không của một byte có thể được kết hợp theo 256 cách khác nhau, nên số thập phân lớn nhất có thể được biểu thị bằng một byte là 255 (một kết hợp biểu thị số 0).

Arduino – Ngắt

Các ngắt dừng công việc hiện tại của Arduino để một số công việc khác có thể được thực hiện.

Giả sử bạn đang ngồi ở nhà, trò chuyện với ai đó. Đột nhiên điện thoại đổ chuông. Bạn ngừng trò chuyện và nhấc điện thoại để nói chuyện với người gọi. Khi bạn kết thúc cuộc trò chuyện qua điện thoại, bạn quay lại trò chuyện với người đó trước khi điện thoại đổ chuông.

Tương tự, bạn có thể nghĩ về thói quen chính là trò chuyện với ai đó, chuông điện thoại khiến bạn ngừng trò chuyện. Quy trình dịch vụ ngắt quãng là quy trình nói chuyện qua điện thoại. Khi cuộc trò chuyện qua điện thoại kết thúc, bạn quay trở lại thói quen trò chuyện chính của mình. Ví dụ này giải thích chính xác cách một ngắt khiến bộ xử lý hoạt động.

Chương trình chính đang chạy và thực hiện một số chức năng trong mạch. Tuy nhiên, khi một ngắt xảy ra, chương trình chính sẽ tạm dừng trong khi một quy trình khác được thực hiện. Khi quy trình này kết thúc, bộ xử lý sẽ quay lại quy trình chính một lần nữa.

tìm hiểu bit arduino

Những đặc điểm quan trọng

Dưới đây là một số tính năng quan trọng về ngắt –

  • Ngắt có thể đến từ nhiều nguồn khác nhau. Trong trường hợp này, chúng tôi đang sử dụng ngắt phần cứng được kích hoạt bởi sự thay đổi trạng thái trên một trong các chân kỹ thuật số.
  • Hầu hết các thiết kế Arduino đều có hai ngắt phần cứng (được gọi là “ngắt0” và “ngắt1”) được nối với các chân I / O kỹ thuật số 2 và 3 tương ứng.
  • Arduino Mega có sáu ngắt phần cứng bao gồm các ngắt bổ sung (“ngắt 2” đến “ngắt5”) trên các chân 21, 20, 19 và 18.
  • Bạn có thể xác định một quy trình bằng một chức năng đặc biệt được gọi là “Quy trình Dịch vụ Ngắt” (thường được gọi là ISR).
  • Bạn có thể xác định quy trình và chỉ định các điều kiện ở cạnh tăng, cạnh xuống hoặc cả hai. Tại các điều kiện cụ thể này, ngắt sẽ được bảo dưỡng.
  • Có thể có chức năng đó được thực thi tự động, mỗi khi một sự kiện xảy ra trên một chân đầu vào.

Các loại ngắt

Có hai loại ngắt –

  • Ngắt phần cứng – Chúng xảy ra để phản ứng với một sự kiện bên ngoài, chẳng hạn như chân ngắt bên ngoài tăng cao hoặc thấp.
  • Ngắt phần mềm – Chúng xảy ra để đáp ứng với một lệnh được gửi trong phần mềm. Loại ngắt duy nhất mà “ngôn ngữ Arduino” hỗ trợ là hàm đính kèm ().

Sử dụng ngắt trong Arduino

<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6987870470339823" crossorigin="anonymous"></script> <!-- slide bar --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6987870470339823" data-ad-slot="2433582917" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>

Ngắt rất hữu ích trong các chương trình Arduino vì nó giúp giải quyết các vấn đề về thời gian. Một ứng dụng tốt của ngắt là đọc bộ mã hóa quay hoặc quan sát đầu vào của người dùng. Nói chung, ISR phải ngắn và nhanh nhất có thể. Nếu bản phác thảo của bạn sử dụng nhiều ISR, chỉ một ISR có thể chạy tại một thời điểm. Các ngắt khác sẽ được thực hiện sau khi ngắt hiện tại kết thúc theo thứ tự phụ thuộc vào mức độ ưu tiên mà chúng có.

Thông thường, các biến toàn cục được sử dụng để truyền dữ liệu giữa ISR và chương trình chính. Để đảm bảo các biến được chia sẻ giữa ISR và chương trình chính được cập nhật chính xác, hãy khai báo chúng là biến động.

Cú pháp câu lệnh đính kèm

attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument ISR: the ISR to call when the interrupt occurs; 
   //this function must take no parameters and return nothing. 
   //This function is sometimes referred to as an interrupt service routine.
//argument mode: defines when the interrupt should be triggered.

Ba hằng số sau được xác định trước dưới dạng giá trị hợp lệ:

  • LOW để kích hoạt ngắt bất cứ khi nào chân ở mức thấp.
  • CHANGE để kích hoạt ngắt bất cứ khi nào chân thay đổi giá trị.
  • FALLING bất cứ khi nào chốt đi từ cao xuống thấp.

Thí dụ

int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.

void setup() {
   pinMode(13, OUTPUT); //set pin 13 as output
   attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
   //interrupt at pin 2 blink ISR when pin to change the value
} 
void loop() { 
   digitalWrite(13, state); //pin 13 equal the state value
} 

void blink() { 
   //ISR function
   state = !state; //toggle the state when the interrupt occurs
}

Arduino – Giao tiếp xem thêm

Trả lời