AVR-Xuất Xung Với Tần Số Và độ Rộng Theo ý Muốn
Maybe your like
1: Làm sao để tạo xung?
Yêu cầu: Tạo xung vuông với tần số khoảng 1khz, độ rộng xung là 10%.
| Dùng digitalWrite | Dùng analogWrite |
| void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delayMicroseconds(100); digitalWrite(13, LOW); delayMicroseconds(900); }
| void setup() { analogWrite(5, 25); // 25/256=10% } void loop() { }
|
Về bản chất hàm analogWrite
- Không cần khai báo pin.
- Tần số mặc định trên pin 5,6 là 976 Hz (uno r3), trên pin 3, 11 là 976 Hz (Leonardo).
- Tần số mặc định trên các pin còn lại là 490 hz.
- Nó truy cập trực tiếp lên các thanh ghi nên không ảnh hưởng đến tốc độ sử lý . (bạn sẽ biết điều đó ngay bây giờ).
Chạy mô phỏng trên proteus
void setup() { pinMode(13, OUTPUT); analogWrite(5, 25); } void loop() { digitalWrite(13, HIGH); delayMicroseconds(100); digitalWrite(13, LOW); delayMicroseconds(900); }

| So sánh | DigitalWrite/port | AnalogWrite |
| Ưu điểm | Có tính ổn định cao. Có thể tùy chỉnh tần số và độ rộng bằng delay. | Điều khiển chính xác, tần số cao, Hoạt động độc lập và song song với các tiến trình. |
| Nhược điểm | Tần số thấp. Ảnh hưởng tới tốc độ sử lý 1 luồng. Phụ thuộc delay. | Tần số cố định là 976 hz (490 hz). |
2: Truy cập thanh ghi điều khiển để thay đổi tần số
2.1: Cách tạo ra xung PWM.
Cấp một xung nhịp P_clock vào bộ đếm Counter, Xung P_clock được lấy ra từ bộ chia tần số hệ thống F_clock. Mỗi một xung P_clock sẽ làm bộ đếm Counter tăng thêm một giá trị, khi giá trị đạt max (tràn số) thì counter lại được đặt về 0 (Fast PWM) hoặc lại đếm lùi về 0 (Phase correct), quá trình này sẽ được lặp đi lặp lại .
Tiếp đến, bộ so sánh sẽ kiểm tra giá trị của bộ đếm Counter với một giá trị đặt trước Value, giá trị lấy ra từ bộ so sánh cũng chính là dạng xung PWM có tần số P_clock, độ rộng xung là tỷ số của Value với Counter.

2.2: Truy cập cài đặt các thanh ghi
Trên AVR 168/328, Việc tạo xung được hỗ trợ bởi 3 timer là TIMER 0 (8 bit), TIMER 1 (16 bit), TIMER 2 (8 bit). Mỗi Timer bao gồm 2 thanh ghi dữ liệu A-B, Bằng cách truy cập và thay đổi thông số của các thanh ghi, chúng ta sẽ cài đặt pin ra, bộ chia tần, đặt ngắt Value, lựa chọn kiểu Counter (xung răng cưa/ tam giác), kiểu so sánh, đặt ngắt tràn cho Counter…
AVR là mình gọi tắt của con Atmega - cái con vi điều khiển của con arduino đó các bạn
Trên AVR 328, Chúng ta có 6 pin hỗ trợ xuất xung.

Một vài thuật ngữ
Lấy ví dụ trên TIMER 1:
- TCCR_1_A(Timer/Counter_1 _Control Register_ A)
- TCCR_1_B(Timer/Counter_1 _Control Register _B)
- TCNT_1(Timer/Counter Register )
- ICR_1(Input Capture Register)
- OCR_1_A/B(Output Compare Register)
2.3 Đầu ra phụ thuộc vào kiểu so sánh “inverted” hay "none-inverted":
Ví dụ chọn kiểu đếm răng cưa (FAST PWM), kiểu so sánh thường ”none-inverted”. Tín hiệu ra là HIGH khi Value lớn hơn Counter, là LOW khi Value nhỏ hơn Counter. Khi chọn là “inverted”, tín hiệu đầu ra sẽ bị đảo lại so với trường hợp trên.

Kiểu đếm Counter tam giác cũng như vậy.

Tần số xung phụ thuộc vào xung nhịp P_clock (sau bộ chia tần) và dạng đếm counter.
Như đã biết, mỗi P_clock thì counter tăng lên 1, nếu bộ đếm có cỡ là 8 bit thì cần 256 xung để đếm từ BOTTOM lên TOP (đếm răng cưa). Nếu chọn kiểu tam giác, khi Counter đạt TOP nó sẽ tiếp tục đếm lùi, khi đó nó cần 256*2 xung P_clock để đi hết một chu kỳ đếm.
Khi đó công thức tổng quát để tính tần số PWM là :
F_pwm =P_clock / (Top_value+1). Fast Pwm.
Hoặc
F_pwm=P_clock / (2*( Top_value+1)) . Phase Cerrect Pwm.
Với P_clock =F_clock / Prescaller.
Ví dụ
Chọn kiểu Fast Pwm, tần số thạch anh F_clock=16mhz, sử dụng bộ đếm timer 0 (8 bit = 1 byte) tương đương TOP_value=255+1. Giảm tầm số Counter xuống còn P_clock = 16mhz/64=250kHz. (Prescller=64).
Khi đó tần số của xung ra:
F_pwm=250khz/256=976.562 Hz.
Cũng như trên, nhưng chọn kiểu Phase Cerrect Pwm, tần số xung ra F_pwm=488.28 Hz.
Tag » Arduino Timer 1 Fast Pwm
-
Secrets Of Arduino PWM | Arduino Documentation
-
Fast PWM Timer1: Adjusting Duty Cycles Independently?
-
Timer Und PWM – Teil 2 (16 Bit Timer1) - Wolles Elektronikkiste
-
Timer1 Based PWM In Arduino Uno - Tutorialspoint
-
Setting Up Arduino Uno (ATMEGA328P) PWM With Timer1
-
Tutorial On Fast Pulse Width Modulation - Arxterra
-
Programming Arduino Timer 0 In Fast PWM Mode - Ee-diary
-
FastPwmPin/FastPwmPin.cpp At Master · Maxint-rd/FastPwmPin
-
[PDF] Timer With cx
-
Fast PWM On ATTiny85 - Renewable Energy Innovation
-
28.3: Fast PWM Mode - Engineering LibreTexts
-
Generating An Arduino 16-bit PWM | Microcontroller Tutorials
-
How To Modify The PWM Frequency On The Arduino-part1(fast PWM ...
-
How To Change The PWM Frequency Of Arduino - NerdyTechy