Mục lục:

Bộ vi điều khiển AVR. Chuyển đổi đèn LED bằng Công tắc nút nhấn. Nút nhấn Debouncing: 4 bước
Bộ vi điều khiển AVR. Chuyển đổi đèn LED bằng Công tắc nút nhấn. Nút nhấn Debouncing: 4 bước

Video: Bộ vi điều khiển AVR. Chuyển đổi đèn LED bằng Công tắc nút nhấn. Nút nhấn Debouncing: 4 bước

Video: Bộ vi điều khiển AVR. Chuyển đổi đèn LED bằng Công tắc nút nhấn. Nút nhấn Debouncing: 4 bước
Video: AVR Microcontroller. Toggle LED’s using a Push Button Switch. Push Button Debouncing. 2024, Tháng sáu
Anonim
Image
Image

Trong phần này, chúng ta sẽ tìm hiểu Cách tạo mã chương trình C cho ATMega328PU để chuyển đổi trạng thái của ba đèn LED theo đầu vào từ công tắc nút. Ngoài ra, chúng tôi đã khám phá một giải pháp cho vấn đề là ‘Chuyển đổi số lần trả lại‘. Như thường lệ, chúng tôi sẽ lắp ráp mạch điện trên cơ sở của AVR ATmega328 để kiểm tra hoạt động của mã chương trình.

Bước 1: Viết và xây dựng ứng dụng vi điều khiển AVR trong mã C bằng nền tảng phát triển tích hợp Atmel Studio 7

Viết và xây dựng ứng dụng vi điều khiển AVR trong mã C sử dụng nền tảng phát triển tích hợp Atmel Studio 7
Viết và xây dựng ứng dụng vi điều khiển AVR trong mã C sử dụng nền tảng phát triển tích hợp Atmel Studio 7
Viết và xây dựng ứng dụng vi điều khiển AVR trong mã C sử dụng nền tảng phát triển tích hợp Atmel Studio 7
Viết và xây dựng ứng dụng vi điều khiển AVR trong mã C sử dụng nền tảng phát triển tích hợp Atmel Studio 7
Viết và xây dựng ứng dụng vi điều khiển AVR trong mã C sử dụng nền tảng phát triển tích hợp Atmel Studio 7
Viết và xây dựng ứng dụng vi điều khiển AVR trong mã C sử dụng nền tảng phát triển tích hợp Atmel Studio 7

Nếu bạn không có Atmel Studio, bạn nên tải xuống và cài đặt nó.

www.microchip.com/mplab/avr-support/atmel-studio-7

Vài dòng đầu tiên, chúng tôi có một số định nghĩa trình biên dịch.

F_CPU xác định tần số xung nhịp trong Hertz và phổ biến trong các chương trình sử dụng thư viện avr-libc. Trong trường hợp này, nó được sử dụng bởi các thói quen trì hoãn để xác định cách tính toán độ trễ thời gian.

#ifndef F_CPU

#define F_CPU 16000000UL // cho biết tần số tinh thể của bộ điều khiển (16 MHz AVR ATMega328P) #endif

#include // header để bật kiểm soát luồng dữ liệu qua các chân. Xác định chân, cổng, v.v.

Tệp bao gồm đầu tiên là một phần của avr-libc và sẽ được sử dụng trong khá nhiều dự án AVR mà bạn làm việc. io.h sẽ xác định CPU bạn đang sử dụng (đó là lý do tại sao bạn chỉ định phần khi biên dịch) và lần lượt bao gồm tiêu đề định nghĩa IO thích hợp cho chip mà chúng tôi đang sử dụng. Nó chỉ đơn giản xác định các hằng số cho tất cả các chân, cổng, thanh ghi đặc biệt của bạn, v.v.

#include // header để bật chức năng trì hoãn trong chương trình

Thư viện using / delay.h chứa một số quy trình cho những khoảng thời gian trì hoãn ngắn. Hàm chúng ta sẽ sử dụng là _delay_ms ().

Chúng tôi sử dụng các định nghĩa để khai báo nút và các cổng và chân của đèn LED. Sử dụng các câu lệnh định nghĩa như thế này cho phép chúng ta chỉ cần sửa đổi 3 dòng dễ tìm nếu chúng ta di chuyển đèn LED sang chân I / O khác hoặc sử dụng AVR khác.

#define BUTTON1 Nút chuyển 1 // được kết nối với cổng B, chân 1

#define LED1 0 // Led1 kết nối với cổng B chân 0 #define LED2 1 // Led2 kết nối với cổng C chân 1 #define LED3 2 // Led3 kết nối với cổng D chân 2

Hai câu lệnh cuối cùng xác định thời gian thiết lập câu lệnh, tính bằng mili giây, để gỡ lỗi công tắc và thời gian chờ trước khi cho phép nhấn nút khác. Thời gian tắt tiếng cần được điều chỉnh theo thời gian cần thiết để chuyển từ mức cao kỹ thuật số xuống mức thấp kỹ thuật số sau tất cả các lần bật. Hành vi thoát sẽ khác nhau giữa các lần chuyển đổi, nhưng 20-30 mili giây thường là khá đủ.

#define DEBOUNCE_TIME 25 // thời gian để chờ trong khi nút "khử bật"

#define LOCK_INPUT_TIME 300 // thời gian để đợi sau khi nhấn nút

void init_ports_mcu ()

{

Hàm này chỉ được gọi một lần trong phần đầu của chương trình để khởi tạo các chân đầu ra đầu vào mà chúng ta sẽ sử dụng.

Đối với nút, chúng tôi sẽ sử dụng các thanh ghi PORT và PIN để ghi và đọc. Với AVR, chúng tôi đọc một ghim bằng cách sử dụng thanh ghi PINx của nó và chúng tôi ghi vào một ghim bằng thanh ghi PORTx. Chúng ta cần ghi vào thanh ghi nút để cho phép kéo lên.

Đối với đèn LED, chúng ta chỉ cần sử dụng thanh ghi PORT để ghi vào, tuy nhiên, chúng ta cũng cần thanh ghi hướng dữ liệu (DDR) vì các chân I / O được thiết lập làm đầu vào theo mặc định.

Đầu tiên, chúng tôi thiết lập các chân I / O của đèn LED làm đầu ra bằng cách sử dụng thanh ghi hướng dữ liệu của nó.

DDRB = 0xFFu; // Đặt tất cả các chân của PORTB làm đầu ra.

Tiếp theo, đặt ghim nút một cách rõ ràng làm đầu vào.

DDRB & = ~ (1 <

Tiếp theo, các chân PORTB được đặt ở mức cao (+5 volt) để bật nó lên. Các chân đầu ra ban đầu ở mức cao và vì đèn LED của chúng tôi có dây hoạt động ở mức cao, nó sẽ được bật trừ khi chúng tôi tắt nó một cách rõ ràng.

Và cuối cùng, chúng tôi kích hoạt điện trở kéo lên bên trong trên chân đầu vào mà chúng tôi đang sử dụng cho nút của mình. Điều này được thực hiện đơn giản bằng cách xuất một cái ra cổng. Khi được định cấu hình làm đầu vào, làm như vậy dẫn đến việc kích hoạt pull-up và khi được định cấu hình làm đầu ra, làm như vậy sẽ chỉ tạo ra một điện áp cao.

PORTB = 0xFF; // Đặt tất cả các chân của PORTB là HIGH. Đèn Led được bật, // cũng có thể kích hoạt điện trở Pull Up bên trong của chân đầu tiên PORTB. DDRC = 0xFFu; // Đặt tất cả các chân của PORTC làm đầu ra. PORTC = 0x00u; // Đặt tất cả các chân của PORTC ở mức thấp để tắt nó. DDRD = 0xFFu; // Đặt tất cả các chân của PORTD làm đầu ra. PORTD = 0x00u; // Đặt tất cả các chân của PORTD ở mức thấp để tắt nó đi. }

unsigned char button_state ()

{

Hàm này trả về một giá trị boolean cho biết nút có được nhấn hay không. Đây là khối mã liên tục được thực thi trong vòng lặp infinate và do đó đang thăm dò trạng thái của nút. Đây cũng là nơi chúng tôi gỡ lỗi công tắc.

Bây giờ, hãy nhớ rằng khi chúng ta nhấn công tắc, chân đầu ra đầu vào sẽ được kéo xuống đất. Do đó, chúng tôi đang chờ mức pin xuống thấp.

/ * nút được nhấn khi bit BUTTON1 rõ ràng * /

if (! (PINB & (1 <

Chúng tôi làm như vậy bằng cách kiểm tra xem bit có rõ ràng hay không. Nếu bit rõ ràng, cho thấy rằng nút bị nhấn, trước tiên chúng tôi trì hoãn khoảng thời gian được xác định bởi DEBOUNCE_TIME là 25 mili giây và sau đó kiểm tra lại trạng thái của nút. Nếu nút bị ngắt sau 25 mili giây thì công tắc được coi là đã được gỡ bỏ và sẵn sàng để kích hoạt một sự kiện và do đó, chúng tôi quay lại 1 trở lại quy trình gọi của mình. Nếu nút không bị nhấn, chúng tôi quay trở lại số 0 cho thói quen gọi của chúng tôi.

_delay_ms (DEBOUNCE_TIME);

if (! (PINB & (1 <

int main (void)

{

Thói quen chính của chúng tôi. Chức năng chính là duy nhất và khác biệt với tất cả các chức năng khác. Mọi chương trình C phải có đúng một hàm main (). main là nơi AVR bắt đầu thực thi mã của bạn khi nguồn điện lần đầu tiên bật lên, vì vậy nó là điểm đầu vào của chương trình.

char không dấu n_led = 1; // số LED ban đầu hiện đang bật

Lệnh gọi của hàm để khởi tạo các chân I / O đang được sử dụng:

init_ports_mcu ();

vòng lặp vô hạn nơi chương trình của chúng tôi chạy:

trong khi (1)

{

Khi button_state trả về một cho biết rằng nút đã được nhấn và gỡ lỗi, sau đó chuyển đổi lần lượt trạng thái hiện tại của đèn LED theo tham số n_led.

if (button_state ()) // Nếu nút được nhấn, hãy chuyển đổi trạng thái của đèn LED và độ trễ trong 300ms (#define LOCK_INPUT_TIME)

{switch (n_led) {case 1: PORTB ^ = (1 << LED1); PORTC ^ = (1 << LED2); nghỉ;

Các câu lệnh này sử dụng toán tử C bitwise. Lần này nó sử dụng toán tử OR độc quyền. Khi bạn XOAY CỔNG với giá trị bit của bit bạn muốn chuyển đổi, một bit đó sẽ được thay đổi mà không ảnh hưởng đến các bit khác.

trường hợp 2:

PORTC ^ = (1 << LED2); PORTD ^ = (1 << LED3); nghỉ; case 3: PORTD ^ = (1 << LED3); PORTB ^ = (1 << LED1); n_led = 0; // đặt lại ngắt số LED; } n_led ++; // đèn LED tiếp theo được bật _delay_ms (LOCK_INPUT_TIME); }} return (0); }

Vì vậy, bây giờ, khi bạn chạy chương trình này, bạn sẽ có thể nhấn nút nhấn để đèn LED bật tắt. Do độ trễ của chúng tôi được xác định bởi LOCK_INPUT_TIME, bạn có thể nhấn và giữ nút này sẽ làm cho đèn LED tắt và bật với tốc độ nhất quán (ít hơn mỗi 275 mili giây).

Lập trình đã hoàn tất.

Bước tiếp theo là xây dựng dự án và lập trình tệp hex vào bộ vi điều khiển bằng chương trình avrdude.

Bạn có thể tải xuống tệp main.c với chương trình bằng mã c:

Bước 2: Truyền tệp HEX của chương trình vào bộ nhớ flash của chip

Truyền tệp HEX của chương trình vào bộ nhớ flash của chip
Truyền tệp HEX của chương trình vào bộ nhớ flash của chip
Truyền tệp HEX của chương trình vào bộ nhớ flash của chip
Truyền tệp HEX của chương trình vào bộ nhớ flash của chip

Tải xuống và cài đặt AVRDUDE. Phiên bản mới nhất hiện có là 6.3: Tải xuống tệp zip

Đầu tiên, sao chép tệp hex của chương trình vào thư mục AVRDUDE. Trong trường hợp của tôi, đó là ButtonAVR.hex

Sau đó, gõ vào cửa sổ lời nhắc DOS lệnh: avrdude –c [tên người lập trình] –p m328p –u –U flash: w: [tên tệp hex của bạn].

Trong trường hợp của tôi, đó là: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Lệnh này ghi tệp hex vào bộ nhớ của vi điều khiển.

Xem video mô tả chi tiết quá trình ghi bộ nhớ flash của vi điều khiển:

Ghi bộ nhớ flash vi điều khiển…

Vâng! Bây giờ, bộ vi điều khiển hoạt động theo hướng dẫn của chương trình của chúng tôi. Hãy cùng kiểm tra nào!

Bước 3: Debouncing chuyển đổi phần cứng

Debouncing Switch phần cứng
Debouncing Switch phần cứng

Ngoài gỡ lỗi chuyển mạch phần mềm, chúng tôi có thể sử dụng kỹ thuật gỡ lỗi chuyển mạch phần cứng. Ý tưởng cơ bản đằng sau kỹ thuật này là sử dụng một tụ điện để lọc ra những thay đổi nhanh chóng trong tín hiệu chuyển mạch.

Giá trị tụ điện nên được chọn là gì? Điều này cuối cùng sẽ phụ thuộc vào mức độ hoạt động kém của nút liên quan đến vấn đề cụ thể này. Một số nút có thể hiển thị hành vi nảy khủng khiếp, nhưng những nút khác sẽ có rất ít. Giá trị tụ điện thấp như 1,0 nanofarads sẽ phản ứng rất nhanh, ít hoặc không ảnh hưởng đến độ nảy. Ngược lại, giá trị tụ điện cao hơn chẳng hạn như 220 nanofarads (vẫn còn khá nhỏ về mặt tụ điện) sẽ cung cấp sự chuyển đổi chậm từ điện áp bắt đầu sang điện áp kết thúc (5 volt đến 0 volt). Tuy nhiên, quá trình chuyển đổi được nhìn thấy với dung lượng 220 nanofarads vẫn diễn ra khá nhanh trong thế giới thực và do đó có thể được sử dụng trên các nút hoạt động kém.

Bước 4: Mạch điện

Mạch điện
Mạch điện
Mạch điện
Mạch điện
Mạch điện
Mạch điện

Kết nối các thành phần phù hợp với sơ đồ.

Đề xuất: