Mục lục:

Bộ vi điều khiển AVR. Điều chế độ rộng xung. С bộ điều khiển động cơ DC và cường độ ánh sáng LED.: 6 bước
Bộ vi điều khiển AVR. Điều chế độ rộng xung. С bộ điều khiển động cơ DC và cường độ ánh sáng LED.: 6 bước

Video: Bộ vi điều khiển AVR. Điều chế độ rộng xung. С bộ điều khiển động cơ DC và cường độ ánh sáng LED.: 6 bước

Video: Bộ vi điều khiển AVR. Điều chế độ rộng xung. С bộ điều khiển động cơ DC và cường độ ánh sáng LED.: 6 bước
Video: #vixuly #pwm Điều chế độ rộng xung PWM của Pic16f887 điều khiển đèn led 2024, Tháng bảy
Anonim
Image
Image

Chào mọi người!

Điều chế độ rộng xung (PWM) là một kỹ thuật rất phổ biến trong viễn thông và điều khiển công suất. nó thường được sử dụng để điều khiển công suất cấp cho một thiết bị điện, cho dù đó là động cơ, đèn LED, loa, v.v. Về cơ bản, nó là một mô-đun hóa công nghệ, trong đó độ rộng của xung sóng mang thay đổi phù hợp với tín hiệu thông điệp tương tự..

Chúng tôi làm mạch điện đơn giản để điều khiển tốc độ quay của động cơ điện một chiều phụ thuộc vào cường độ ánh sáng. Chúng tôi sẽ sử dụng các tính năng của bộ vi điều khiển AVR và Điện trở phụ thuộc vào ánh sáng như Chuyển đổi tương tự sang kỹ thuật số để đo cường độ ánh sáng. Ngoài ra, chúng tôi sẽ sử dụng Mô-đun điều khiển động cơ cầu H kép-L298N. Nó thường được sử dụng để điều khiển tốc độ và hướng động cơ, nhưng có thể được sử dụng cho các dự án khác như điều chỉnh độ sáng của các dự án chiếu sáng nhất định. Ngoài ra, đã thêm một nút vào mạch của chúng tôi để chuyển đổi hướng quay của động cơ.

Bước 1: Mô tả

Sự miêu tả
Sự miêu tả
Sự miêu tả
Sự miêu tả

Mỗi và mọi cơ thể trên thế giới này đều có một số quán tính. Động cơ quay bất cứ khi nào nó được bật nguồn. Ngay sau khi tắt nguồn, nó sẽ có xu hướng dừng lại. Nhưng nó không dừng lại ngay lập tức mà phải mất một thời gian. Nhưng trước khi nó dừng hoàn toàn, nó đã được bật lại! Do đó nó bắt đầu di chuyển. Nhưng ngay cả bây giờ, phải mất một thời gian để đạt được tốc độ tối đa của nó. Nhưng trước khi nó xảy ra, nó đã bị tắt nguồn, v.v. Do đó, hiệu quả tổng thể của hành động này là động cơ quay liên tục, nhưng ở tốc độ thấp hơn.

Điều chế độ rộng xung (PWM) là một kỹ thuật chuyển đổi nguồn tương đối gần đây để cung cấp lượng điện năng trung gian giữa mức bật hoàn toàn và mức tắt hoàn toàn. Thông thường, xung kỹ thuật số có khoảng thời gian bật và tắt giống nhau, nhưng trong một số tình huống, chúng ta cần xung kỹ thuật số có nhiều hơn / ít hơn về thời gian / thời gian tắt. Trong kỹ thuật PWM, chúng tôi tạo ra các xung kỹ thuật số với lượng trạng thái bật và tắt không bằng nhau để có được các giá trị điện áp trung gian cần thiết.

Chu kỳ nhiệm vụ được xác định bằng phần trăm thời gian điện áp cao trong một xung kỹ thuật số hoàn chỉnh. Nó có thể được tính bằng:

% chu kỳ nhiệm vụ = T on / T (khoảng thời gian) x 100

Hãy để chúng tôi đưa ra một tuyên bố vấn đề. Chúng tôi cần tạo ra tín hiệu PWM 50 Hz có 45% chu kỳ nhiệm vụ.

Tần số = 50 Hz

Khoảng thời gian, T = T (bật) + T (tắt) = 1/50 = 0,02 s = 20 ms

Chu kỳ nhiệm vụ = 45%

Như vậy, giải theo phương trình đã cho ở trên, ta được

T (bật) = 9 mili giây

T (tắt) = 11 mili giây

Bước 2: Bộ hẹn giờ AVR - Chế độ PWM

Bộ hẹn giờ AVR - Chế độ PWM
Bộ hẹn giờ AVR - Chế độ PWM
Bộ hẹn giờ AVR - Chế độ PWM
Bộ hẹn giờ AVR - Chế độ PWM

Để tạo PWM, AVR chứa phần cứng riêng biệt! Bằng cách sử dụng điều này, CPU hướng dẫn phần cứng tạo ra PWM của một chu kỳ nhiệm vụ cụ thể. ATmega328 có 6 đầu ra PWM, 2 đầu ra nằm trên timer / counter0 (8bit), 2 nằm trên timer / counter1 (16bit) và 2 nằm trên timer / counter2 (8bit). Timer / Counter0 là thiết bị PWM đơn giản nhất trên ATmega328. Timer / Counter0 có khả năng chạy trên 3 chế độ:

  • PWM nhanh
  • PWM đã hiệu chỉnh theo pha và tần số
  • PWM được hiệu chỉnh theo giai đoạn

mỗi chế độ này có thể được đảo ngược hoặc không đảo ngược.

Khởi tạo Timer0 ở chế độ PWM:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - thiết lập WGM: Fast PWM

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - thiết lập chế độ đầu ra so sánh A, B

TCCR0B | = (1 << CS02) - thiết lập bộ đếm thời gian với bộ đếm trước = 256

Bước 3: Đo cường độ ánh sáng - ADC & LDR

Đo cường độ ánh sáng - ADC & LDR
Đo cường độ ánh sáng - ADC & LDR
Đo cường độ ánh sáng - ADC & LDR
Đo cường độ ánh sáng - ADC & LDR
Đo cường độ ánh sáng - ADC & LDR
Đo cường độ ánh sáng - ADC & LDR

Điện trở phụ thuộc ánh sáng (LDR) là một bộ chuyển đổi thay đổi điện trở của nó khi ánh sáng chiếu xuống bề mặt của nó thay đổi.

LDRs được làm từ vật liệu bán dẫn để cho phép chúng có các đặc tính nhạy sáng. Các LDR hoặc ĐIỆN TRỞ ẢNH này hoạt động dựa trên nguyên tắc “Độ dẫn ảnh”. Bây giờ nguyên tắc này nói gì là bất cứ khi nào ánh sáng rơi trên bề mặt của LDR (trong trường hợp này) thì độ dẫn của phần tử tăng lên hay nói cách khác là điện trở của LDR giảm khi ánh sáng rơi trên bề mặt của LDR. Đặc tính này của việc giảm điện trở đối với LDR đạt được vì nó là đặc tính của vật liệu bán dẫn được sử dụng trên bề mặt. LDR thường được sử dụng để phát hiện sự hiện diện của ánh sáng hoặc để đo cường độ ánh sáng.

Để chuyển thông tin liên tục bên ngoài (thông tin tương tự) thành một hệ thống điện toán / kỹ thuật số, chúng ta phải chuyển đổi chúng thành các giá trị số nguyên (kỹ thuật số). Loại chuyển đổi này được thực hiện bởi Analog to Digital Converter (ADC). Quá trình chuyển đổi một giá trị tương tự thành giá trị kỹ thuật số được gọi là Chuyển đổi tương tự sang kỹ thuật số. Tóm lại, tín hiệu Analog là tín hiệu thế giới thực xung quanh chúng ta như âm thanh và ánh sáng.

Tín hiệu số là các tín hiệu tương tự ở định dạng số hoặc số được các hệ thống kỹ thuật số như vi điều khiển hiểu rõ. ADC là một trong những phần cứng đo tín hiệu tương tự và tạo ra tín hiệu tương đương kỹ thuật số của cùng một tín hiệu. Bộ vi điều khiển AVR có sẵn cơ sở ADC để chuyển đổi điện áp tương tự thành một số nguyên. AVR chuyển đổi nó thành số 10 bit của dải từ 0 đến 1023.

Chúng tôi sử dụng chuyển đổi tương tự sang kỹ thuật số của mức điện áp từ mạch chia với LDR để đo cường độ ánh sáng.

Khởi tạo ADC:

TADCSRA | = (1 << ADEN) - Bật ADC

ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - thiết lập ADC prescaler = 128

ADMUX = (1 << REFS0) - thiết lập hiển thị điện áp = AVCC; - thiết lập kênh đầu vào = ADC0

Xem video mô tả chi tiết về vi điều khiển ADC AVR: AVR Microcontroller. Đo cường độ ánh sáng. ADC & LDR

Bước 4: Bộ điều khiển Động cơ DC & Mô-đun điều khiển động cơ cầu H kép-L298N

Bộ điều khiển Động cơ DC & Mô-đun điều khiển động cơ cầu H kép-L298N
Bộ điều khiển Động cơ DC & Mô-đun điều khiển động cơ cầu H kép-L298N
Bộ điều khiển Động cơ DC & Mô-đun điều khiển động cơ cầu H kép-L298N
Bộ điều khiển Động cơ DC & Mô-đun điều khiển động cơ cầu H kép-L298N
Bộ điều khiển Động cơ DC & Mô-đun điều khiển động cơ cầu H kép-L298N
Bộ điều khiển Động cơ DC & Mô-đun điều khiển động cơ cầu H kép-L298N

Chúng tôi sử dụng trình điều khiển động cơ DC vì vi điều khiển nói chung không có khả năng cung cấp dòng điện không quá 100 miliampe. Các bộ vi điều khiển thông minh nhưng không mạnh; mô-đun này sẽ bổ sung một số cơ cho bộ vi điều khiển để điều khiển động cơ DC công suất cao. Nó có thể điều khiển đồng thời 2 động cơ DC lên đến 2 ampe mỗi động cơ hoặc một động cơ bước. Chúng ta có thể điều khiển tốc độ bằng PWM và cả hướng quay của động cơ. Ngoài ra, nó được sử dụng để điều khiển độ sáng của băng LED.

Ghim mô tả:

Cổng OUT1 và OUT2, để kết nối động cơ DC. OUT3 và OUT4 để kết nối băng LED.

ENA và ENB là các chân cho phép: bằng cách kết nối ENA với mức cao (+ 5V), nó bật cổng OUT1 và OUT2.

Nếu bạn kết nối chân ENA với mức thấp (GND), nó sẽ vô hiệu hóa OUT1 và OUT2. Tương tự, đối với ENB và OUT3 và OUT4.

IN1 đến IN4 là các chân đầu vào sẽ được kết nối với AVR.

Nếu IN1-cao (+ 5V), IN2-low (GND), OUT1 chuyển sang mức cao và OUT2 chuyển sang mức thấp, do đó chúng ta có thể điều khiển động cơ.

Nếu IN3-cao (+ 5V), IN4-low (GND), OUT4 chuyển sang mức cao và OUT3 chuyển sang mức thấp, do đó đèn LED băng sáng.

Nếu bạn muốn đảo ngược chiều quay của động cơ chỉ cần đảo ngược cực IN1 và IN2, tương tự đối với IN3 và IN4.

Bằng cách áp dụng tín hiệu PWM cho ENA và ENB, bạn có thể kiểm soát tốc độ của động cơ trên hai cổng đầu ra khác nhau.

Bảng có thể chấp nhận danh nghĩa từ 7V đến 12V.

Jumper: Có ba chân jumper; Jumper 1: Nếu động cơ của bạn cần nguồn cung cấp nhiều hơn 12V, bạn phải ngắt kết nối Jumper 1 và áp dụng điện áp mong muốn (tối đa 35V) tại đầu cuối 12V. Mang một nguồn cung cấp 5V khác và đầu vào ở đầu cuối 5V. Có, bạn phải đầu vào 5V nếu bạn cần áp dụng nhiều hơn 12V (khi Jumper 1 được loại bỏ).

Đầu vào 5V là để IC hoạt động bình thường, vì việc tháo jumper sẽ vô hiệu hóa bộ điều chỉnh 5V tích hợp và bảo vệ khỏi điện áp đầu vào cao hơn từ đầu cuối 12V.

Đầu cuối 5V hoạt động như đầu ra nếu nguồn cung cấp của bạn từ 7V đến 12V và hoạt động như đầu vào nếu bạn sử dụng nhiều hơn 12V và jumper được loại bỏ.

Jumper 2 và Jumper 3: Nếu bạn loại bỏ hai jumper này, bạn phải nhập tín hiệu bật và tắt từ bộ vi điều khiển, hầu hết người dùng thích loại bỏ hai jumper và áp dụng tín hiệu từ vi điều khiển.

Nếu bạn giữ hai jumper, OUT1 đến OUT4 sẽ luôn được bật. Hãy nhớ jumper ENA cho OUT1 và OUT2. ENB jumper cho OUT3 và OUT4.

Bước 5: Viết mã cho chương trình trong C. Tải lên tệp HEX vào bộ nhớ flash của vi điều khiển

Viết và xây dựng ứng dụng vi điều khiển AVR trong C Code bằng Nền tảng phát triển tích hợp - Atmel Studio.

#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 các chân, cổng, v.v. #include // header để bật chức năng trì hoãn trong chương trình

#define BUTTON1 2 // nút chuyển đổi được kết nối với cổng B pin 2 #define DEBOUNCE_TIME 25 // thời gian chờ trong khi nút "khử nảy" #define LOCK_INPUT_TIME 300 // thời gian chờ sau khi nhấn nút

// Khởi tạo Timer0, PWM void timer0_init () {// thiết lập bộ định thời OC0A, chân OC0B ở chế độ bật tắt và chế độ CTC TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // thiết lập bộ định thời với prescaler = 256 TCCR0B | = (1 << CS02); // khởi tạo bộ đếm TCNT0 = 0; // khởi tạo giá trị so sánh OCR0A = 0; }

// Khởi tạo ADC void ADC_init () {// Bật ADC, lấy mẫu freq = osc_freq / 128 đặt prescaler thành giá trị lớn nhất, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Chọn tham chiếu điện áp (AVCC)

// Trạng thái nút chuyển đổi unsigned char button_state () {

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

if (! (PINB & (1 <

{

_delay_ms (DEBOUNCE_TIME);

if (! (PINB & (1 <

}

trả về 0;

}

// Khởi tạo cổng void port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - NÚT CHUYỂN ĐỔI CỔNG TRỰC TIẾP = 0b00010110;

DDRD = 0b01100000; // PD5-ENB (OC0B), PD6-ENA (OC0A) PORTD = 0b00000000;

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Đặt tất cả các chân của PORTC ở mức thấp để tắt nó. }

// Hàm này đọc giá trị của chuyển đổi tương tự sang kỹ thuật số. uint16_t get_LightLevel () {_delay_ms (10); // Chờ một lúc để kênh được chọn ADCSRA | = (1 << ADSC); // Bắt đầu chuyển đổi ADC bằng cách thiết lập bit ADSC. Viết 1 vào ADSC

while (ADCSRA & (1 << ADSC)); // Chờ chuyển đổi hoàn tất

// ADSC lại trở thành 0 cho đến lúc đó, chạy vòng lặp liên tục _delay_ms (10); trở lại (ADC); // Trả về kết quả 10 bit

}

// Hàm này ánh xạ lại một số từ một phạm vi (0-1023) sang một phạm vi khác (0-100). uint32_t map (uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) {return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }

int main (void)

{uint16_t i1 = 0;

port_init ();

timer0_init (); ADC_init (); // khởi tạo ADC

trong khi (1)

{i1 = map (get_LightLevel (), 0, 1023, 0, 100);

OCR0A = i1; // Đặt kênh thanh ghi so sánh đầu ra A OCR0B = 100-i1; // Đặt đầu ra so sánh kênh đăng ký B (đảo ngược)

if (button_state ()) // Nếu nút được nhấn, chuyển đổi trạng thái của đèn LED và độ trễ trong 300ms (#define LOCK_INPUT_TIME) {PORTB ^ = (1 << 0); // chuyển đổi trạng thái hiện tại của chân IN1. PORTB ^ = (1 << 1); // chuyển đổi trạng thái hiện tại của chân IN2. Đảo ngược hướng quay của động cơ

PORTB ^ = (1 << 3); // chuyển đổi trạng thái hiện tại của chân IN3. PORTB ^ = (1 << 4); // chuyển đổi trạng thái hiện tại của chân IN4. Băng LED đang tắt / bật. _delay_ms (LOCK_INPUT_TIME); }}; return (0); }

Lập trình đã hoàn tất. Tiếp theo, xây dựng và biên dịch mã dự án thành tệp hex.

Tải lên tệp HEX vào bộ nhớ flash của vi điều khiển: gõ vào cửa sổ nhắc DOS lệnh:

avrdude –c [tên của lập trình viên] –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: PWM.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 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 6: 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: