Mục lục:
- 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
- Bước 2: Truyền tệp HEX của chương trình vào bộ nhớ flash của chip
- Bước 3: Debouncing chuyển đổi phần cứng
- Bước 4: Mạch điện
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
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:33
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
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
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
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
Kết nối các thành phần phù hợp với sơ đồ.
Đề xuất:
Công tắc đèn WiFi tự động hóa gia đình với ESP-01 và mô-đun chuyển tiếp với nút nhấn: 7 bước
Công tắc đèn Wi-Fi tự động hóa gia đình với ESP-01 và Mô-đun chuyển tiếp có nút nhấn: Vì vậy, trong các hướng dẫn trước, chúng tôi đã lập trình ESP-01 với Tasmota bằng cách sử dụng ESP Flasher và kết nối ESP-01 với mạng wifi của chúng tôi. Bây giờ chúng ta có thể bắt đầu lập trình nó để bật / tắt công tắc đèn bằng WiFi hoặc nút nhấn
Atollic TrueStudio-Bật đèn LED bằng cách nhấn nút nhấn bằng cách sử dụng STM32L100: 4 bước
Atollic TrueStudio-Bật đèn LED bằng cách nhấn nút nhấn Sử dụng STM32L100: Trong hướng dẫn này của STM32, tôi sẽ cho bạn biết về cách đọc chân GPIO của STM32L100, vì vậy ở đây tôi sẽ làm cho một chân Led trên bo mạch phát sáng bằng cách nhấn nút nhấn
ESP8266 RGB LED STRIP Điều khiển WIFI - NODEMCU làm điều khiển từ xa hồng ngoại cho dải đèn Led được điều khiển qua Wi-Fi - Điều khiển điện thoại thông minh RGB LED STRIP: 4 bước
ESP8266 RGB LED STRIP Điều khiển WIFI | NODEMCU làm điều khiển từ xa hồng ngoại cho dải đèn Led được điều khiển qua Wi-Fi | Điều khiển bằng điện thoại thông minh RGB LED STRIP: Xin chào các bạn trong hướng dẫn này, chúng ta sẽ học cách sử dụng gật đầu hoặc esp8266 làm điều khiển từ xa IR để điều khiển dải LED RGB và Nodemcu sẽ được điều khiển bằng điện thoại thông minh qua wifi. Vì vậy, về cơ bản bạn có thể điều khiển DÂY CHUYỀN LED RGB bằng điện thoại thông minh của mình
Chuyển đổi Cần điều khiển cổng trò chơi cũ thành Cần điều khiển USB bằng Arduino: 5 bước
Chuyển đổi Cần điều khiển cổng trò chơi cũ thành Cần điều khiển USB bằng Arduino: Tuyên bố từ chối trách nhiệm nhanh: Điểm của dự án này là không thực hiện chuyển đổi cần điều khiển cổng trò chơi rẻ tiền. Mục tiêu của dự án này là tạo ra một cần điều khiển linh hoạt và có thể tùy chỉnh, có thể dễ dàng sửa đổi. lý do để tôi chọn Arduino là
Công tắc đèn điều khiển từ xa bằng Bluetooth - Trang bị thêm. Công tắc đèn vẫn hoạt động, không cần ghi thêm.: 9 bước (có hình ảnh)
Công tắc đèn điều khiển từ xa bằng Bluetooth - Trang bị thêm. Công tắc đèn vẫn hoạt động, không cần ghi thêm.: Cập nhật ngày 25 tháng 11 năm 2017 - Đối với phiên bản Công suất cao của dự án này có thể kiểm soát hàng kilowatt tải, hãy xem Trang bị thêm Điều khiển BLE cho tải công suất cao - Không cần thêm dây Ngày 15 tháng 11 năm 2017 - Một số bo mạch / ngăn xếp phần mềm BLE