6 kênh PLC trên vi điều khiển avr. Phần mềm đa kênh PLC trong AVR. Hướng dẫn sử dụngPWM trong Arduino

Để hiểu cách bạn có thể triển khai một số kênhPWM trên một bộ điều khiển, trước tiên chúng ta hãy nhớPWM là gì và nó được sử dụng để làm gì.

PLC là viết tắt của Điều chế độ rộng xung. Đây là chế độ hoạt động khi chu kỳ nhiệm vụ của các xung có thể được điều chỉnh bởi một chip điều khiển (bộ điều khiển của chúng tôi) theo một số quy tắc (nói cách khác, họ nói rằng chu kỳ nhiệm vụ được điều chỉnh bởi một cái gì đó hoặc phụ thuộc vào một cái gì đó). Nghĩa là, việc chuyển từ mức tín hiệu cao sang mức tín hiệu thấp và ngược lại được thực hiện tại những thời điểm được xác định chặt chẽ bởi một số quy tắc.

Do đó, đối với một kênh PWM, chúng ta cần biết các quy tắc xác định chu kỳ nhiệm vụ (không có vấn đề gì với điều này, chúng ta tự đặt chúng) và ngoài ra, đếm hai điểm theo thời gian kể từ đầu xung: thứ nhất, tín hiệu ở mức cao trong bao lâu và thứ hai là tổng thời gian xung. Tuyệt vời, vậy thì tất cả những gì chúng ta cần để triển khai mộtPWM là hai bộ đếm. Thuật toán sẽ diễn ra như thế này: chúng ta khởi động cả hai bộ đếm, chuyển đầu ra thành “1”. Khi bị gián đoạn từ bộ đếm thứ nhất (thời gian ở mức cao), chúng ta chuyển đầu ra về “0”, tắt bộ đếm và chờ sự gián đoạn từ bộ đếm thứ hai. Khi bị gián đoạn từ bộ đếm thứ hai (tổng thời gian xung), chúng tôi lặp lại mọi thứ từ đầu.

Theo đó, đối với ba kênhPWM, chúng ta cần bộ đếm 3*2=6. Nhưng giả sử PIC12F629 chỉ có 2 bộ đếm thì chúng ta phải làm gì? Đầu tiên, hãy làm cho tổng thời gian phát xung giống nhau cho tất cả các kênh PLC (để cả ba kênh hoạt động ở cùng tần số), điều này đã trừ đi hai bộ đếm. Tất cả những gì còn lại là đếm thời gian ở mức cao cho từng kênhPWM. Tổng cộng còn lại 4 quầy. Không nhiều, nhưng dễ dàng hơn.

Bây giờ chúng ta hãy nhớ rằng bộ điều khiển không phải là một vi mạch tương tự mà là một vi mạch kỹ thuật số và nó đếm các khoảnh khắc thời gian một cách riêng biệt. Tất cả ba thời gian cấp cao (đối với mỗi kênhPWM) sẽ là bội số của một số lượng tử thời gian phổ biến. Thời lượng của lượng tử này được xác định bởi độ rộng xung và tần số xung. Trong trường hợp tất cả các kênh hoạt động ở cùng tần số và có cùng độ sâu bit thì lát thời gian này sẽ bằng: T 1 =1/(f*(2 n -1)), trong đó n là công suất xung, f là tần số xung.

NếuPWM là 8 bit và hoạt động ở tần số 100 Hz thì thời lượng lượng tử là (1/100)/(2 8 -1) = 39 μs - tổng thời gian xung (1/f) chia cho số mômen chuyển mạch có thể có (2 n) trừ 1 (nếu bạn đặt N điểm trên một đường thẳng thì chúng tạo thành các khoảng N-1).

Đó là, Chúng ta chỉ cần một bộ đếm phần cứng sẽ đếm các khoảng T 1. Tiếp theo, chúng tôi tạo một bộ đếm chương trình sẽ đếm số khoảng thời gian như vậy và đặt bốn cài đặt. Một cài đặt xác định số lần đọc bộ đếm chương trình cần thiết để đếm thời gian cấp cao cho kênh xung đầu tiên, thứ hai - tương tự cho kênh thứ hai, thứ ba - cho kênh thứ ba, thứ tư tương ứng với tổng thời gian xung và các thao tác so sánh, chuyển đổi, tăng hoặc đặt lại bộ đếm chương trình, chúng ta sẽ
làm điều đó dựa trên một ngắt từ bộ đếm phần cứng.

Nhược điểm chính của phương pháp này là thay vì (n+1) ngắt trong mỗi chu kỳ, chúng ta sẽ xử lý (2 n -1) ngắt.

Hãy ước tính tần số xung tối đa có thể đạt được khi thực hiện như vậy? Rõ ràng, ở tần số tối đa, bộ điều khiển chỉ có đủ thời gian để xử lý ngắt. Nghĩa là, toàn bộ lát cắt thời gian T 1 của bộ điều khiển đang bận xử lý ngắt; ngay khi nó thoát khỏi ngắt, một việc khác xảy ra ngay lập tức.

Nếu chúng ta biểu thị số chu kỳ máy tối đa mà chương trình con được thực thi, N max - thì, có tính đến biểu thức cho T 1, chúng ta thu được phương trình: N tối đa *4/fosc=1/(f tối đa *(2 n -1)). Do đó, tần sốPWM tối đa: f max =fosc/(4*N max *(2 n -1)). Đương nhiên, công thức kết quả chỉ là ước tính, bởi vì chúng tôi giả định rằng chương trình con chiếm toàn bộ thời gian T 1 , nhưng nếu sau khi thực hiện chương trình con vẫn còn thời gian để thực hiện 2 hoặc 3 lệnh, thì điều này nói chung sẽ không phù hợp. chúng tôi cũng nhiều. 3 đội có thể làm được gì? Thông thường, nếu chúng ta muốn làm việc khác, chẳng hạn như trao đổi thông tin với máy tính, thì giá trị tần số tính được cần phải chia cho ít nhất một nửa nữa.

Điều gì quyết định thời gian thực hiện tối đa của một chương trình ngắt? Chà, thứ nhất, tất nhiên, nó phụ thuộc vào mức độ quanh co của người lập trình, và thứ hai, vào số lượng kênh PWM mà chúng ta muốn triển khai.

Để làm rõ những giá trị mà chúng ta đang nói đến, hãy tính một ví dụ cụ thể: để bộ điều khiển hoạt động ở tần số fosc = 4 MHz, chúng tôi đã viết một chương trình con chạy trong tối đa 40 chu kỳ máy và chúng tôi muốn có được độ rộng xung quanh 8 bit. Khi đó, tần số xung lực tối đa sẽ bằng 4000000/(4*40*255)=98 Hz. Như bạn có thể thấy, với phương pháp triển khai này, mọi thứ khá hạn chế, nhưng nó đủ cho RGB. Nhân tiện, với 8 bit cho mỗi màu, chúng ta có tổng số màu bằng 2 8 * 2 8 * 2 8 = 16 triệu và nói chung, điều đáng suy nghĩ - chúng ta có cần nhiều như vậy không?

Với 2 bit trên mỗi kênh và cùng tần số xung nhịp, bạn có thể nhận được tần số xung nhịp tối đa bằng 4000000/(4*40*3)=8,3 kHz và sẽ có 2 2 *2 2 *2 2 = 64 kết hợp khác nhau của chu kỳ nhiệm vụ (trong trường hợp RGB là 64 màu). Tần số này có thể được sử dụng không chỉ cho RGB.

Vâng, đó là tất cả về lý thuyết.

Ví dụ: các thiết bị kỹ thuật số, bộ vi điều khiển chỉ có thể hoạt động với hai mức tín hiệu, tức là. không và một hoặc tắt và bật. Do đó, bạn có thể dễ dàng sử dụng nó để theo dõi trạng thái tải, chẳng hạn như bật hoặc tắt đèn LED. Bạn cũng có thể sử dụng nó để điều khiển bất kỳ thiết bị điện nào bằng cách sử dụng các trình điều khiển thích hợp (bóng bán dẫn, triac, rơle, v.v.) Nhưng đôi khi bạn cần nhiều hơn là chỉ “bật” và “tắt” thiết bị. Vì vậy, nếu bạn muốn kiểm soát độ sáng của đèn LED (hoặc đèn) hoặc tốc độ của động cơ DC, thì tín hiệu số đơn giản là không thể làm được điều đó. Tình trạng này rất phổ biến trong công nghệ số và được gọi là Điều chế độ rộng xung (PWM).

Hầu hết tất cả các bộ vi điều khiển hiện đại đều có phần cứng chuyên dụng để tạo tín hiệu xung điện. Trong hướng dẫn này, chúng ta sẽ tìm hiểu những kiến ​​thức cơ bản về kỹ thuậtPWM và sau đó chúng ta sẽ xem cách triển khaiPWM bằng bộ vi điều khiển AVR.

Các thiết bị kỹ thuật số như vi điều khiển chỉ có thể tạo ra hai mức trên đường đầu ra, cao = 5V và thấp = 0V. Nhưng nếu chúng ta muốn có được 2,5 hoặc 3,1 hoặc bất kỳ điện áp nào trong khoảng 0-5V thì sao? Để làm điều này, thay vì tạo ra điện áp DC không đổi ở đầu ra, chúng ta sẽ tạo ra một sóng vuông có mức cao = 5V và mức thấp = 0V (xem Hình 1).

Hình 1

Hình vẽ cho thấy tín hiệu vẫn luân phiên ở mức thấp và cao trong một thời gian. T0 - mức thấp, T1 - mức cao. Chu kỳ tín hiệu sẽ bằng T = T0+T1. Chu kỳ xung- đây là khoảng thời gian giữa hai điểm đặc trưng của hai xung liền kề. Thông thường, khoảng thời gian được đo giữa hai lần tăng hoặc giảm của các xung liền kề và được biểu thị bằng chữ in hoa T.

Khoảng thời gian lặp lại xung liên quan trực tiếp đến tần số của chuỗi xung và có thể được tính bằng công thức: T = 1/F

Nếu độ dài xung T1 chính xác bằng một nửa chu kỳ T thì tín hiệu như vậy thường được gọi là “sóng vuông”.

Chu kỳ hoạt động của xung là tỷ lệ giữa khoảng thời gian lặp lại xung với thời lượng của chúng và được ký hiệu bằng chữ S: S = T/T1

Hệ số nhiệm vụ là đại lượng không thứ nguyên và không có đơn vị đo lường nhưng có thể được biểu thị bằng phần trăm. Thuật ngữ này thường được tìm thấy trong các văn bản tiếng Anh Chu kỳ nhiệm vụ, đây được gọi là giá trị chu kỳ nhiệm vụ hoặc chu kỳ nhiệm vụPWM. Chu kỳ nhiệm vụ D là nghịch đảo của chu kỳ nhiệm vụ.

Hệ số lấp đầy thường được biểu thị bằng phần trăm và được tính bằng công thức: D=1/S hoặc là D = T1/T*100%

Trong hình trên (Hình 1), bạn có thể thấy T1 = T0, bằng một nửa khoảng thời gian. Vì vậy, chu kỳ nhiệm vụ củaPWM là 50%. Nếu tần số của các xung như vậy đủ cao (giả sử là 5000 Hz), thì chúng ta sẽ nhận được một nửa 5V, tức là. 2,5V. Do đó, nếu đầu ra của bộ điều khiển được ghép nối với động cơ (sử dụng trình điều khiển thích hợp), nó sẽ hoạt động ở mức 50% tốc độ tối đa. Kỹ thuật PLC sử dụng thực tế này để tạo ra bất kỳ điện áp nào giữa hai mức (ví dụ: trong khoảng 0-12V). Bí quyết là khi giá trị chu kỳ nhiệm vụ thay đổi trong khoảng 0-100%, chúng ta sẽ nhận được cùng một tỷ lệ phần trăm điện áp đầu vào ở đầu ra. Dưới đây là một số ví dụ về tín hiệuPWM với các chu kỳ nhiệm vụ khác nhau.

Nếu bạn cài đặt bộ lọc R/C ở đầu ra, bạn có thể nhận được mức tín hiệu DC thuần túy thay vì sóng vuông. Nhưng điều này không bắt buộc đối với động cơ chổi than hoặc để kiểm soát độ sáng của đèn LED. Để thực hiện việc này, bạn có thể cấp trực tiếp tín hiệu vào trình điều khiển (ví dụ: bóng bán dẫn lưỡng cực, MOSFET, v.v.).


Dưới chế độ hoạt động 16-bit. Bộ định thời được hiểu là thuật toán đếm của nó và hoạt động của đầu ra bộ tạo xung liên quan đến nó, được xác định bởi sự kết hợp của các bit xác định chế độ vận hành bộ định thời (WGMn3-0) và chế độ tạo tín hiệu đầu ra (COMnx1:0) . Trong trường hợp này, các bit để thiết lập chế độ tạo tín hiệu đầu ra không ảnh hưởng đến thuật toán đếm, bởi vì Thuật toán đếm chỉ phụ thuộc vào trạng thái của các bit để thiết lập chế độ vận hành bộ hẹn giờ. Trong chế độPWM, các bit COMnx1:0 cho phép bạn bật/tắt tính năng đảo ngược trên đầu raPWM được tạo ra (tức là chọnPWM có đảo ngược hoặcPWM không đảo ngược). Đối với các chế độ không phảiPWM, các bit COMnx1:0 xác định hành động cần thực hiện khi khớp xảy ra: đặt lại, đặt hoặc đảo ngược đầu ra (xem thêm “Khối điều hòa tín hiệu đầu ra” và “Sơ đồ định giờ bộ đếm thời gian 16-bit”) .

Hoạt động binh thương

Chế độ hoạt động đơn giản nhất là chế độ bình thường (WGMn3-0 = 0b0000). Ở chế độ này, bộ đếm hoạt động như bộ đếm tổng (tăng dần) và bộ đếm không được đặt lại. Bộ đếm tràn khi đi qua mức tối đa 16 bit. giá trị (0xFFFF) đến giới hạn số lượng thấp hơn (0x0000). Trong quá trình hoạt động bình thường, cờ tràn bộ đếm thời gian TOVn sẽ được đặt trên cùng một chu kỳ xung nhịp khi TCNTn về 0.

Trong thực tế, cờ tràn TOVn là bit thứ 17 của bộ đếm thời gian, ngoại trừ việc nó chỉ được đặt chứ không bị xóa. Tuy nhiên, thuộc tính này có thể được sử dụng theo chương trình để tăng độ phân giải của bộ định thời bằng cách sử dụng ngắt tràn bộ định thời, khi đó cờ TOVn sẽ tự động được đặt lại. Không có tình huống đặc biệt nào đối với hoạt động bình thường nên trạng thái đồng hồ mới có thể được ghi lại bất kỳ lúc nào.

Ở chế độ bình thường, bạn có thể sử dụng khối chụp. Tuy nhiên, phải đảm bảo rằng khoảng thời gian tối đa giữa khi xảy ra các sự kiện bên ngoài không vượt quá khoảng thời gian tràn bộ đếm. Nếu điều kiện này không được đáp ứng thì cần phải sử dụng ngắt tràn bộ đếm thời gian hoặc bộ chia tỷ lệ trước.

Khối so sánh có thể được sử dụng để tạo ra các ngắt. Không nên sử dụng đầu ra OCnx để tạo tín hiệu trong hoạt động bình thường, vì trong trường hợp này, một phần đáng kể thời gian của bộ xử lý sẽ được sử dụng.

Chế độ đặt lại hẹn giờ trận đấu (CTC)

Ở chế độ CTC (WGM01, WGM00 =0b10), thanh ghi OCR0 được sử dụng để đặt độ phân giải của bộ đếm. Nếu chế độ CTC được đặt và giá trị bộ đếm (TCNT0) khớp với giá trị của thanh ghi OCR0, bộ đếm sẽ được đặt lại về 0 (TCNT0=0). Do đó, OCR0 chỉ định số lượng trên cùng của bộ đếm và do đó, độ phân giải của nó. Chế độ này cung cấp phạm vi điều chỉnh tần số rộng hơn của các xung hình chữ nhật được tạo ra. Nó cũng đơn giản hóa hoạt động của bộ đếm sự kiện bên ngoài.

Trong thiết lập lại bộ định thời ở chế độ khớp (WGMn3-0 = 0b0100 hoặc 0b1100), độ phân giải của bộ định thời được đặt bởi các thanh ghi OCRnA hoặc ICRn. Trong chế độ CTC, bộ đếm (TCNTn) được đặt lại nếu giá trị của nó khớp với giá trị của thanh ghi OCRnA (WGMn3-0 = 0b0100) hoặc ICRn (WGMn3-0 = 0b1100). Giá trị của thanh ghi OCRnA hoặc ICRn xác định giới hạn đếm trên và do đó độ phân giải của bộ định thời. Chế độ này cung cấp phạm vi điều chỉnh tần số rộng hơn của các xung hình chữ nhật được tạo ra. Nó cũng đơn giản hóa hoạt động của bộ đếm sự kiện bên ngoài. Sơ đồ thời gian hoạt động của bộ định thời ở chế độ CTC được hiển thị trong Hình 1. Bộ đếm (TCNTn) tăng trạng thái của nó cho đến khi xảy ra khớp với giá trị OCRnA hoặc ICRn, sau đó bộ đếm (TCNTn) được đặt lại.

Hình 1 - Sơ đồ định thời cho chế độ STS

Khi đạt đến giới hạn đếm trên, một ngắt có thể được tạo bằng cờ OCFnA hoặc ICFn tương ứng với các thanh ghi được sử dụng để đặt giới hạn đếm trên. Nếu ngắt được kích hoạt thì thủ tục ngắt có thể được sử dụng để cập nhật giới hạn số lượng trên. Tuy nhiên, việc đặt giá trị đếm trên gần với giá trị của giới hạn đếm dưới khi bộ đếm hoạt động mà không có bộ đếm gộp trước hoặc với giá trị bộ đếm gộp nhỏ phải được thực hiện hết sức thận trọng, bởi vì Không có bộ đệm đôi trong chế độ CTC. Nếu giá trị được ghi vào OCRnA hoặc ICRn nhỏ hơn giá trị hiện tại của TCNTn thì bộ đếm sẽ reset khi xảy ra điều kiện trùng khớp khi đạt giá trị lớn nhất (0xFFFF), sau đó reset về 0x0000 và đạt giá trị mới là OCRnA hoặc ICRn. Trong nhiều trường hợp, tình trạng này là không mong muốn. Một cách khác là chế độ xung nhịp nhanh, trong đó thanh ghi OCRnA xác định giới hạn đếm trên (WGMn3-0 = 0b1111), bởi vì trong trường hợp này OCRnA được đệm đôi.

Để tạo tín hiệu ở chế độ CTC, đầu ra OCnA có thể được sử dụng để thay đổi mức logic trên mỗi trận đấu bằng cách đặt chế độ chuyển mạch (COMnA1, COMnA0 = 0b01). Giá trị OCnA sẽ chỉ xuất hiện trên chân cổng nếu hướng đầu ra được chỉ định cho chân đó. Tần số tối đa của tín hiệu được tạo là fOC0 = fclk_I/O/2 nếu OCRnA = 0x0000. Đối với các giá trị OCRn khác, tần số của tín hiệu được tạo ra có thể được xác định theo công thức:

trong đó biến N chỉ định hệ số chia của bộ đếm gộp trước (1, 8, 32, 64, 128, 256 hoặc 1024).

Giống như hoạt động bình thường, cờ TOV0 được đặt ở cùng thời điểm hẹn giờ khi giá trị của nó thay đổi từ 0xFFFF thành 0x0000.

Chế độPWM nhanh

Chế độ điều chế độ rộng xung nhanh (PWM) (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) được thiết kế để tạo ra các xungPWM có tần số tăng lên. Không giống như các chế độ hoạt động khác, chế độ này sử dụng hoạt động đếm một chiều. Việc đếm được thực hiện theo hướng từ giới hạn đếm dưới lên giới hạn đếm trên.

Nếu chế độ đầu ra không đảo được đặt thì khi TCNTn và OCRnx trùng nhau, tín hiệu OCnx được đặt và đặt lại ở giới hạn đếm trên. Nếu chế độ đảo ngược được chỉ định, đầu ra OCnx sẽ được đặt lại khi khớp và được đặt ở giới hạn số lượng cao. Do tính năng đếm một chiều, tần số hoạt động của chế độ này cao gấp đôi so với chế độ điều chỉnh pha, trong đó sử dụng tính năng đếm hai chiều. Khả năng tạo ra tín hiệu điều khiển tần số cao giúp cho việc sử dụng chế độ này trở nên hữu ích trong các nhiệm vụ ổn định nguồn điện, chỉnh lưu và chuyển đổi kỹ thuật số sang tương tự. Đồng thời, tần số cao cho phép sử dụng các phần tử bên ngoài có kích thước vật lý nhỏ (cuộn cảm, tụ điện), do đó giảm chi phí chung của hệ thống.

Độ phân giảiPWM có thể được cố định 8, 9 hoặc 10 bit hoặc được đặt bởi thanh ghi ICRn hoặc OCRnA, nhưng không ít hơn 2 bit (ICRn hoặc OCRnA = 0x0003) và không quá 16 bit (ICRn hoặc OCRnA = 0xFFFF). Độ phân giảiPWM ở giá trị giới hạn trên (UL) nhất định được tính như sau:

Ở chế độ FastPWM, bộ đếm được tăng dần cho đến khi giá trị của nó khớp với một trong các giá trị cố định 0x00FF, 0x01FF hoặc 0x03FF (nếu WGMn3:0 = 0b0101, 0b0110 hoặc 0b0111, tương ứng), giá trị trong ICRn (nếu WGMn3:0 = 0b1110) hoặc giá trị trong OCRnA (nếu WGMn3:0 = 0b1111) rồi đặt lại bằng tích tắc đồng hồ hẹn giờ tiếp theo. Sơ đồ thời gian cho chế độ xung nhịp nhanh được hiển thị trong Hình 2. Hình này hiển thị chế độ xung nhịp nhanh khi thanh ghi OCRnA hoặc ICRn được sử dụng để đặt giới hạn trên. Giá trị TCNTn trong sơ đồ thời gian được hiển thị dưới dạng biểu đồ hàm để minh họa việc đếm một chiều. Sơ đồ hiển thị cả đầu raPWM đảo ngược và không đảo ngược. Một đường ngang ngắn hiển thị các điểm trên biểu đồ TCNTn nơi giá trị OCRnx và TCNTnx trùng nhau. Cờ ngắt OCnx được đặt khi xảy ra sự trùng khớp.

Hình 2 - Sơ đồ thời gian cho chế độ xung nhanh

Cờ tràn bộ đếm thời gian (TOVn) được đặt bất cứ khi nào bộ đếm đạt đến giới hạn cao. Ngoài ra, cùng một xung đồng hồ, cùng với cờ TOVn, có thể đặt cờ OCnA hoặc ICFn nếu thanh ghi OCRnA hoặc ICRn được sử dụng để đặt giới hạn trên tương ứng. Nếu một trong những ngắt này được bật, quy trình ngắt có thể cập nhật giới hạn số lượng trên và ngưỡng so sánh.

Nếu giá trị giới hạn trên thay đổi thì phải đáp ứng điều kiện là giá trị giới hạn trên mới được ghi lớn hơn hoặc bằng các giá trị trong tất cả các thanh ghi ngưỡng so sánh. Nếu không, trận đấu giữa TCNTn và OCRnx sẽ không bao giờ xảy ra. Lưu ý rằng khi sử dụng các giá trị giới hạn trên cố định, các bit không sử dụng sẽ được che dấu bằng 0 khi ghi vào thanh ghi OCRnx.

Cơ chế sửa đổi thanh ghi ICRn khác với OCRnA khi nó được sử dụng để đặt giới hạn trên. Thanh ghi ICRn không được đệm đôi. Điều này có nghĩa là nếu một giá trị nhỏ được ghi vào ICRn trong khi bộ đếm đang chạy với rất ít hoặc không có sự định tỷ lệ trước thì sẽ có nguy cơ ghi một giá trị vào thanh ghi ICRn nhỏ hơn giá trị hiện tại của TCNTn. Kết quả là trong tình huống này, trận đấu đứng đầu bảng sẽ bị bỏ lỡ. Trong trường hợp này, bộ đếm sẽ đạt giá trị tối đa (0xFFFF), khởi động lại ở 0x0000 và chỉ sau đó tạo ra kết quả khớp. Thanh ghi OCRnA chứa sơ đồ đệm đôi, vì vậy nó có thể được sửa đổi bất kỳ lúc nào.

lớp="eliadunit">

Nếu việc ghi được thực hiện vào địa chỉ OCRnA, giá trị thực sự được đặt trong thanh ghi bộ đệm OCRnA. Nếu xảy ra sự trùng khớp giữa TCNTn và đỉnh của bộ đếm thì chu kỳ xung nhịp tiếp theo của bộ định thời là việc sao chép thanh ghi đệm sang thanh ghi ngưỡng so sánh OCRnA. Thanh ghi được cập nhật trong cùng chu kỳ xung nhịp khi TCNTn được đặt lại và cờ TOVn được đặt.

Nên sử dụng thanh ghi ICRn để đặt giới hạn trên nếu giới hạn đếm trên là hằng số. Trong trường hợp này, thanh ghi OCRnA cũng được giải phóng để tạo tín hiệuPWM ở đầu ra OCnA. Tuy nhiên, nếu tần sốPWM thay đổi linh hoạt (do thay đổi giới hạn trên), thì trong trường hợp này sẽ thuận lợi hơn khi sử dụng thanh ghi OCRnA để đặt giới hạn trên, bởi vì nó hỗ trợ bộ đệm đôi.

Ở chế độ xung nhịp nhanh, các đơn vị so sánh cho phép bạn tạo tín hiệu xung điện xung trên các chân OCnx. Nếu COMnx1:0 = 0b10 thì chế độPWM được thiết lập mà không đảo ngược đầu ra và nếu COMnx1:0 = 0b11 thì chế độPWM với đảo ngược đầu ra sẽ được đặt (xem Bảng 59). Giá trị OCnx thực tế có thể được quan sát trên chân cổng nếu nó được đặt thành hướng đầu ra (DDR_OCnx). Tín hiệuPWM được tạo bằng cách cài đặt (đặt lại) thanh ghi OCnx khi xảy ra sự trùng khớp giữa OCRnx và TCNTn và bằng cách đặt lại (cài đặt) thanh ghi OCnx cùng với việc đặt lại bộ đếm (thay đổi từ giới hạn cao xuống giới hạn thấp).

Tần sốPWM của tín hiệu đầu ra đối với một giá trị giới hạn trên (UL) nhất định được xác định bằng biểu thức:

trong đó N là biến xác định giá trị của hệ số phân chia trước (1, 8, 32, 64, 128, 256 hoặc 1024).

Việc ghi các giá trị giới hạn vào thanh ghi OCRnx có liên quan đến các trường hợp đặc biệt trong quá trình tạo xung điều khiển. Nếu OCRnx được đặt bằng giới hạn dưới (0x0000), thì một xung ngắn sẽ xuất hiện ở đầu ra trong mỗi chu kỳ xung nhịp thứ (VP+1) của bộ hẹn giờ. Việc ghi một giá trị bằng giới hạn trên vào OCRnx sẽ dẫn đến việc thiết lập mức nhật ký không đổi. 1 hoặc 0 ở đầu ra (tùy thuộc vào cực tính của tín hiệu đầu ra được chọn bằng bit COMnx1: 0).

Nếu cần tạo sóng vuông tần số cao (xung hình chữ nhật có chu kỳ nhiệm vụ lấp đầy 2 hoặc 50%), thì cần phải sử dụng chế độ xung nhanh với các bit COMnA1:0 = 0b01 được đặt, điều này gây ra mức logic tại đầu ra OCnA để chuyển đổi (đảo ngược) trên mỗi trận đấu. Điều này chỉ áp dụng nếu OCRnA được sử dụng để đặt giới hạn trên (WGMn3-0 =0b1111). Tần số sóng vuông được tạo tối đa trong trường hợp này là fOCnA = fclk_I/O/2, nếu OCRnA = 0x0000. Tính năng này tương tự như chuyển đổi OCnA ở chế độ CTC, ngoại trừ bộ đệm đôi, hiện diện ở chế độ SW nhanh.

Chế độ điều chế độ rộng xung có hiệu chỉnh pha (Phase Correct)

Chế độ điều chế độ rộng xung điều chỉnh pha (PWM FC) (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 hoặc 0b1011) được thiết kế để tạo ra tín hiệu điều chỉnh pha với độ phân giải cao. Chế độ FC FC dựa trên hoạt động hai chiều của bộ đếm thời gian. Bộ đếm quay vòng từ giới hạn thấp (0x0000) đến giới hạn cao và sau đó quay trở lại từ giới hạn cao đến giới hạn thấp. Nếu chế độ đầu ra bộ tạo xung được đặt thành không đảo, đầu ra OCnx được đặt lại/đặt khi giá trị TCNTn và OCRnx khớp nhau trong quá trình đếm lên/xuống. Nếu chế độ đầu ra đảo ngược được đặt thì ngược lại, trong quá trình đếm trực tiếp, cài đặt sẽ xảy ra và trong khi đếm ngược, đầu ra OCnx sẽ được đặt lại. Tuy nhiên, với hoạt động hai chiều, tần số tối đa của tín hiệuPWM thấp hơn so với hoạt động một chiều, do các đặc điểm như tính đối xứng trong chế độPWM với hoạt động hai chiều, các chế độ này được ưu tiên sử dụng khi giải quyết các vấn đề điều khiển truyền động.

Độ phân giảiPWM ở chế độ này có thể được cố định (8, 9 hoặc 10 bit) hoặc được đặt bằng thanh ghi ICRn hoặc OCRnA. Độ phân giải tối thiểu là 2 bit (ICRn hoặc OCRnA = 0x0003) và tối đa là 16 bit (ICRn hoặc OCRnA = 0xFFFF). Nếu giới hạn trên được chỉ định thì độ phân giảiPWM ở chế độ này được xác định như sau:

Trong chế độ AFC FC, bộ đếm được tăng dần cho đến khi đạt đến một trong các giá trị cố định 0x00FF, 0x01FF hoặc 0x03FF (tương ứng với WGMn3-0 = 0b0001, 0b0010 hoặc 0b0011), cũng như giá trị bằng ICRn (nếu WGMn3- 0 = 0b1010) hoặc OCRnA (nếu WGMn3 :0 = 0b1011). Hơn nữa, khi đạt đến giới hạn trên, bộ đếm sẽ thay đổi hướng đếm. Giá trị TCNTn vẫn ở giới hạn trên trong một chu kỳ đồng hồ hẹn giờ. Sơ đồ định thời cho chế độ PCPW được hiển thị trong Hình 3. Hình này hiển thị chế độ PCPW sử dụng thanh ghi OCRnA hoặc ICRn để đặt giới hạn trên. Trạng thái TCNTn được biểu diễn dưới dạng biểu đồ hàm để minh họa việc đếm hai chiều. Hình vẽ cho thấy cả đầu raPWM không đảo và không đảo. Các đường ngang ngắn biểu thị các điểm trên biểu đồ TCNTn nơi xảy ra sự trùng khớp với giá trị OCRnx. Cờ ngắt OCnx được đặt khi xảy ra sự trùng khớp.

Hình 3 – Sơ đồ định thời cho chế độ AFC FC

Cờ tràn bộ đếm thời gian (TOVn) được đặt bất cứ khi nào bộ đếm đạt đến giới hạn dưới. Nếu thanh ghi OCRnA hoặc ICRn được sử dụng để đặt giới hạn trên thì cờ OCnA hoặc ICFn được đặt tương ứng với cùng xung đồng hồ mà tại đó thanh ghi OCRnx được cập nhật từ thanh ghi đệm (ở đầu bộ đếm). Cờ ngắt có thể được sử dụng để tạo ra ngắt khi bộ đếm đạt đến giới hạn thấp hoặc cao.

Khi thay đổi giá trị của giới hạn đếm trên, bạn phải đảm bảo rằng nó lớn hơn hoặc bằng các giá trị trong tất cả các thanh ghi so sánh. Nếu không, trận đấu giữa TCNTn và OCRnx sẽ không bao giờ xảy ra. Lưu ý rằng khi sử dụng các giá trị đếm trên cố định, các bit không sử dụng sẽ bị xóa về 0 khi ghi vào thanh ghi OCRnx. Chu kỳ thứ ba trong Hình 53 minh họa trường hợp khi có sự thay đổi động trong giới hạn số đếm trên dẫn đến việc tạo ra xung không đối xứng. Tính năng này dựa trên thời gian cập nhật của thanh ghi OCRnx. Vì bản cập nhật OCRnx xảy ra ở đầu bộ đếm nên khoảng thời gianPWM bắt đầu và kết thúc ở đầu bộ đếm. Điều này ngụ ý rằng thời lượng đếm ngược được xác định bởi giá trị giới hạn trên trước đó và thời lượng đếm xuôi được xác định bởi giá trị giới hạn trên mới. Nếu hai giá trị này khác nhau thì thời lượng đếm tiến và đếm lùi cũng sẽ khác nhau. Sự khác biệt về thời lượng dẫn đến sự bất đối xứng của các xung đầu ra.

Nếu nhiệm vụ là thay đổi giới hạn trên trong khi bộ đếm đang chạy thì thay vì chế độ này, nên sử dụng chế độ PFC PFC (hiệu chỉnh pha và tần số). Nếu sử dụng giá trị giới hạn trên tĩnh thì thực tế không có sự khác biệt giữa các chế độ này.

Trong chế độ AFC FC, các đơn vị so sánh cho phép bạn tạo tín hiệuPWM ở các chân OCnx. Nếu bạn đặt COMnx1:0 = 0b10, thì đầu raPWM sẽ không đảo ngược và nếu COMnx1:0=0b11 thì có đảo ngược. Giá trị thực của OCnx có thể được quan sát trên chân cổng nếu thanh ghi hướng dữ liệu cho chân cổng đó được đặt thành hướng đầu ra (DDR_OCnx). Tín hiệu PLC được tạo bằng cách thiết lập (đặt lại) thanh ghi OCnx khi các giá trị của OCRnx và TCNTn khớp nhau trong quá trình đếm ngược và bằng cách đặt lại (đặt lại) thanh ghi OCnx khi có sự trùng khớp giữa OCRnx và TCNTn trong quá trình đếm ngược. Tần số thu được của tín hiệuPWM ở chế độPWM FC ở giới hạn trên (UL) nhất định có thể được tính bằng biểu thức sau:

Việc ghi các giá trị giới hạn vào thanh ghi OCRnx có liên quan đến các trường hợp đặc biệt trong việc tạo tín hiệu điều khiển xung ở chế độ AFC FC. Nếu bạn đặt chế độPWM mà không đảo ngược và đặt OCRnx bằng giới hạn dưới thì đầu ra sẽ liên tục được đặt thành nhật ký. 0 và nếu bằng giới hạn trên thì nhật ký luôn xuất hiện ở đầu ra. 1. Đối với chế độ đảo ngược của xung điện, các mức được chỉ định phải được thay thế bằng các mức ngược lại.

Nếu bạn chỉ định sử dụng OCnA làm giới hạn trên (WGMn3:0 = 0b1011) và đặt COMnA1:0 =0b01, sóng vuông sẽ được tạo ở đầu ra OCnA.

Chế độ điều chế độ rộng xung với hiệu chỉnh pha và tần số (Phase and Frequency Correct)

Chế độ điều chế độ rộng xung với hiệu chỉnh pha và tần số (PWM PFC) (WGMn3-0 = 0b1000 hoặc 0b1001) được thiết kế để tạo ra các xungPWM có độ phân giải cao với hiệu chỉnh pha và tần số. Cũng giống như chế độ AFC FC, chế độ AFC FC dựa trên hoạt động hai chiều của bộ đếm. Bộ đếm quay vòng từ giới hạn thấp (0x0000) đến giới hạn cao và sau đó quay trở lại từ giới hạn cao đến giới hạn thấp. Nếu chế độPWM không đảo được chỉ định, thì đầu ra OCnx sẽ được đặt lại nếu xảy ra khớp giữa TCNTn và OCRnx trong quá trình đếm lên và được đặt nếu khớp xảy ra trong quá trình đếm xuống. Trong chế độ đảo ngược hoạt động là nghịch đảo. Hoạt động hai chiều, so với hoạt động một chiều, có liên quan đến việc tạo ra tần số thấp hơn. Tuy nhiên, do tính đối xứng trong các chế độ điều khiển bằng bộ đếm hai chiều nên việc sử dụng chúng được ưa chuộng hơn trong các nhiệm vụ điều khiển truyền động.

Sự khác biệt chính giữa chế độ AFC FC và chế độ AFC FC là thời điểm thanh ghi OCRnx được cập nhật từ thanh ghi bộ đệm OCRnx (xem Hình 3 và Hình 4).

Độ phân giảiPWM ở chế độ này có thể được đặt bằng thanh ghi ICRn hoặc OCRnA. Độ phân giải tối thiểu là 2 bit (ICRn hoặc OCRnA = 0x0003) và độ phân giải tối đa là 16 bit (ICRn hoặc OCRnA = 0xFFFF). Độ phân giảiPWM tính bằng bit có thể được tính bằng biểu thức sau:

Trong chế độ FCC FCC, bộ đếm được tăng lên cho đến khi khớp với giá trị trong ICRn (WGMn3:0 = 0b1000) hoặc trong OCRnA (WGMn3:0 = 0b1001). Điều này có nghĩa là đạt đến đỉnh của số đếm, sau đó hướng của số đếm sẽ thay đổi. Giá trị của TCNTn vẫn ở đầu số đếm trong một chu kỳ đồng hồ hẹn giờ. Sơ đồ định thời cho chế độ FCC FCC được hiển thị trong Hình 54. Hình này hiển thị chế độ FCC FCC khi đỉnh đếm được thiết lập bởi thanh ghi OCRnA hoặc ICRn. Giá trị TCNTn được hiển thị dưới dạng biểu đồ hàm để minh họa quá trình đếm hai chiều. Sơ đồ hiển thị cả đầu raPWM không đảo và không đảo. Các đường ngang ngắn biểu thị các điểm trên biểu đồ TCNTn nơi xảy ra sự trùng khớp giữa OCRnx và TCNTn. Cờ ngắt OCnx được đặt sau khi xảy ra sự trùng khớp.

Hình 4 - Sơ đồ định thời của chế độPWM với hiệu chỉnh pha và tần số

Cờ tràn bộ đếm thời gian (TOVn) được đặt ở cùng chu kỳ xung nhịp khi các thanh ghi được cập nhật với giá trị từ thanh ghi đệm (ở giới hạn đếm thấp hơn). Nếu thanh ghi OCRnA hoặc ICRn được sử dụng để đặt giới hạn trên thì khi bộ đếm đạt đến giới hạn trên, cờ OCnA hoặc ICFn sẽ được đặt tương ứng. Cờ ngắt có thể được sử dụng để tạo ra ngắt khi bộ đếm đạt đến giới hạn cao hoặc thấp.

Khi thay đổi giới hạn trên, bạn phải đảm bảo rằng giá trị mới lớn hơn hoặc bằng các giá trị trong tất cả các thanh ghi ngưỡng so sánh. Mặt khác, nếu giới hạn trên được đặt thành giá trị nhỏ hơn bất kỳ giá trị nào trong thanh ghi ngưỡng so sánh, thì sự trùng khớp giữa TCNTn và OCRnx sẽ không bao giờ xảy ra.

Hình 4 cho thấy, không giống như chế độ AFC FC, tín hiệu đầu ra được tạo ra là đối xứng ở mọi chu kỳ. Vì các thanh ghi OCRnx được cập nhật ở giới hạn đếm thấp hơn nên khoảng thời gian đếm tiến và đếm lùi luôn bằng nhau. Kết quả là các xung đầu ra có hình dạng đối xứng và do đó có tần số được điều chỉnh.

Nên sử dụng thanh ghi ICRn để đặt giới hạn trên nếu giá trị giới hạn trên là hằng số. Trong trường hợp này, thanh ghi OCRnA cũng được giải phóng để điều chế độ rộng xung của các xung ở chân OCnA. Tuy nhiên, nếu bạn cần thay đổi động tần sốPWM bằng cách thay đổi giới hạn trên thì nên sử dụng thanh ghi OCRnA để đặt giới hạn trên do bộ đệm kép của nó.

Ở chế độPWM, các đơn vị so sánh cho phép bạn tạo ra các xungPWM ở chân OCnx. Nếu COMnx1:0 = 0b10 thì đầu raPWM không đảo được đặt và nếu COMnx1:0=0b11 thì đầu ra có đảo ngược (xem bảng 60). Giá trị OCnx sẽ chỉ xuất hiện trên chân cổng tương ứng nếu nó được đặt ở hướng đầu ra. Tín hiệuPWM được tạo bằng cách thiết lập (đặt lại) thanh ghi OCnx trên sự trùng khớp giữa OCRnx và TCNTn trong quá trình đếm ngược và đặt lại (cài đặt) thanh ghi OCnx trên sự trùng khớp giữa OCRnx và TCNTn trong quá trình đếm ngược. Tần sốPWM ở chế độ này với giới hạn đếm trên (UP) nhất định được xác định như sau:

Trong đó N là hệ số chia của bộ đếm gộp trước (1, 8, 32, 64, 128, 256 hoặc 1024).

Việc ghi các giá trị giới hạn vào thanh ghi OCRnx có liên quan đến các trường hợp đặc biệt trong quá trình tạo tín hiệu xung ở chế độ này. Nếu bạn đặt OCRnx bằng giới hạn dưới (0x0000) thì ở chế độ không đảo, đầu ra sẽ liên tục có mức logic thấp và khi ghi giá trị bằng giới hạn trên, đầu ra sẽ có mức logic cao cho một thời gian dài. Ở chế độ đảo ngược, các mức đã cho sẽ ngược lại.

Nếu OCRnA được sử dụng để đặt giới hạn trên (WGMn3:0 = 0b1001) và COMnA1:0 = 0b01, thì sóng vuông sẽ được tạo ở đầu ra OCnA.


Việc triển khai phần cứng củaPWM mang lại những lợi thế chắc chắn so với phần mềm, vì nó giúp bộ xử lý giảm bớt cả mã và thời gian không cần thiết, cồng kềnh cho việc bảo trì, đồng thời cũng mang lại nhiều cơ hội hơn để sử dụng công việc vớiPWM. Chỉ cần khởi tạo bộ định thời/bộ đếm (nhập các giá trị cần thiết vào các thanh ghi được bộ định thời/bộ đếm sử dụng) là đủ và bộ định thời/bộ đếm có thể hoạt động độc lập với bộ xử lý; theo đó, bộ xử lý có thể xử lý các tác vụ khác, chỉ thỉnh thoảng liên lạc vào thời điểm cần thiết để điều chỉnh hoặc thay đổi chế độ hoặc lấy kết quả từ bộ đếm thời gian/bộ đếm.

Mô tả cờ ngắt

T1 có thể tạo ra ngắt khi:

  1. thanh ghi truy cập TCNT1 tràn;
  2. nếu thanh ghi đếm TCNT1 và thanh ghi so sánh OCR1A và OCR1B bằng nhau (riêng cho từng thanh ghi);
  3. trong khi lưu trữ thanh ghi đếm trong thanh ghi chụp ICR1.

T2 có thể tạo ra ngắt khi:

  1. tràn thanh ghi bộ đếm TCNT2;
  2. khi thanh ghi đếm TCNT2 và thanh ghi so sánh OCR2 bằng nhau.

Cờ của tất cả các ngắt nằm trong thanh ghi TIFR và việc bật/tắt ngắt nằm trong thanh ghi TIMSK.

Bit thanh ghi TIMSK
Đăng ký7 6 5 4 3 2 1 0
TIMSK OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2- Cờ cho phép ngắt cho sự kiện “khớp” của bộ định thời/bộ đếm T2
  • TOIE2- Cờ cho phép ngắt tràn bộ định thời/bộ đếm T2
  • TICIE1- Cờ cho phép ngắt cho sự kiện “bắt” của bộ định thời/bộ đếm T1
  • OCIE1A- Cờ cho phép ngắt cho sự kiện “khớp A” của bộ định thời/bộ đếm T1
  • OCIE1B- Cờ cho phép ngắt đối với sự kiện “khớp B” của bộ định thời/bộ đếm T1
  • TOIE1- Cờ cho phép ngắt tràn bộ định thời/bộ đếm T1
  • OCIE0*- Cờ cho phép ngắt cho sự kiện “trùng hợp” của bộ định thời/bộ đếm T0 (* - không có trong ATmega8)
  • TOIE0- Cờ cho phép ngắt tràn bộ định thời/bộ đếm T0
  • OCF2- Cờ ngắt cho sự kiện “trùng hợp” của bộ định thời/bộ đếm T2
  • TOV2- Cờ ngắt tràn bộ định thời/bộ đếm T2
  • ICF1- Cờ ngắt cho sự kiện bắt giữ của bộ định thời/bộ đếm T1
  • OCF1A- Cờ ngắt cho sự kiện “trùng hợp A” của bộ định thời/bộ đếm T1
  • OCF1B- Cờ ngắt cho sự kiện “trùng hợp B” của bộ định thời/bộ đếm T1
  • TOV1- Cờ ngắt tràn bộ định thời/bộ đếm T1
  • OCF0- Cờ ngắt cho sự kiện “trùng hợp” của bộ định thời/bộ đếm T0
  • TOV0- Cờ ngắt tràn bộ định thời/bộ đếm T0

Mô tả hoạt động của bộ định thời/bộ đếm T1 trong bộ điều khiển ATmega8/16

Bộ định thời/bộ đếm 16 bit T1 có thể được sử dụng để tạo ra các khoảng thời gian, đếm số lượng tín hiệu bên ngoài và tạo ra các tín hiệuPWM với các chu kỳ và khoảng thời gian làm việc khác nhau trên các chân OC1A và OC1B. Ngoài ra, bằng tín hiệu bên ngoài từ chân ICP1 hoặc từ bộ so sánh tương tự, T1 có thể lưu trạng thái hiện tại của nó vào một thanh ghi chụp riêng ICR1.

Đăng ký bit TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Đăng ký7 6 5 4 3 2 1 0
TCCR1A COM1A1 COM1A0 COM1B1 COM1BO FOC1A FOC1B WGM11 WGM10
TCCR1B ICNC1 ICES1 * WGM13 WGM12 CS12 CS11 CS10
TCNT1:H R/W R/W R/W R/W R/W R/W R/W R/W
TCNT1:L R/W R/W R/W R/W R/W R/W R/W R/W
OCR1A:H R/W R/W R/W R/W R/W R/W R/W R/W
OCR1A:L R/W R/W R/W R/W R/W R/W R/W R/W
OCR1B:H R/W R/W R/W R/W R/W R/W R/W R/W
OCR1B:L R/W R/W R/W R/W R/W R/W R/W R/W
ICR1:H R/W R/W R/W R/W R/W R/W R/W R/W
ICR1:L R/W R/W R/W R/W R/W R/W R/W R/W

Mỗi thanh ghi 16 bit được đặt vật lý trong hai thanh ghi 8 bit, vì vậy khi đọc một mục vào chúng, phải thực hiện hai thao tác. Khi ghi, byte cao được tải trước, sau đó là byte thấp; khi đọc thì ngược lại, byte thấp được đọc trước, sau đó là byte cao.

TCCR1A:TCCR1B- Thanh ghi điều khiển bộ định thời/bộ đếm 8 bit T1

TCNT1- Thanh ghi định thời/bộ đếm 16 bit T1. Tùy thuộc vào chế độ vận hành, nội dung của thanh ghi này sẽ bị xóa, tăng (giá trị tăng lên 1) hoặc giảm (giá trị giảm đi 1) cho mỗi xung của tín hiệu đồng hồ hẹn giờ/bộ đếm.

OCR1A:OCR1B- Thanh ghi so sánh 16-bit

ICR1- Thanh ghi chụp 16 bit, lưu trữ giá trị TCNT1 khi cạnh tín hiệu hoạt động được cấp vào chân ICP1 hoặc bằng tín hiệu từ bộ so sánh.

gán bit

COM1A1:COM1A0:COM1B1:COM1B0- Các bit này xác định hoạt động của chân OC1A:OC1B khi giá trị của thanh ghi đếm TCNT1 và thanh ghi so sánh OCR1A:OCR1B khớp nhau

FOC1A:FOC1B- Các bit này được sử dụng để buộc thay đổi trạng thái của chân OC1A:OC1B

ICNC1- Bit điều khiển mạch nhiễu, nếu bit là “0” thì việc bắt sẽ ở cạnh hoạt động đầu tiên, nếu là “1” thì việc bắt sẽ ở sau mẫu thứ tư giống hệt của tín hiệu bắt.

ICES1- Bit chọn cạnh tích cực của tín hiệu, nếu giá trị là “0” thì việc lưu thanh ghi đếm TCNT1 trong thanh ghi bắt OCR1 sẽ nằm trên cạnh xuống của tín hiệu, nếu “1” ở cạnh lên.

WGM13:WGM12:WGM11:WGM10- Các bit này xác định chế độ hoạt động của bộ định thời/bộ đếm T1

CS22:CS21:C20- Các bit xác định nguồn tín hiệu xung clock/counter T1.

Lựa chọn chế độ hoạt động của bộ đếm thời gian/bộ đếm T1
WGM13WGM12WGM11WGM10Chế độ hoạt độngMô-đun tài khoản (TOP)
0 0 0 0 Bình thường $FFFF
0 0 0 1 Pha đúng pha

8 bit

$00FF
0 0 1 0 Pha đúng pha

9-bit

$01FF
0 0 1 1 Pha đúng pha

10-bit

$03FF
0 1 0 0 CTC (đặt lại khi trận đấu) OCR1A
0 1 0 1 nhanh chóng

8 bit

$00FF
0 1 1 0 nhanh chóng

9-bit

$01FF
0 1 1 1 nhanh chóng

10-bit

$03FF
1 0 0 0 ICR1
1 0 0 1 Đúng pha và tần sốPWM OCR1A
1 0 1 0 Pha đúng pha ICR1
1 0 1 1 Pha đúng pha OCR1A
1 1 0 0 CTC (đặt lại khi trận đấu) ICR1
1 1 0 1 Kín đáo *
1 1 1 0 nhanh chóng ICR1
1 1 1 1 nhanh chóng OCR1A

Chọn nguồn đồng hồ

Chế độ bình thường

Chế độ hoạt động đơn giản nhất là T1. Đối với mỗi xung của tín hiệu đồng hồ, thanh ghi đếm TCNT1 được tăng lên (giá trị tăng thêm 1). Khi truyền qua giá trị $FFFF của mô-đun đếm (TOP), lỗi tràn xảy ra và chu kỳ xung nhịp tiếp theo bắt đầu đếm từ giá trị $0000, cùng lúc đó cờ TOV1=1 được đặt trong thanh ghi TIFR và một ngắt có thể được tạo nếu cờ TOIE1=1 được đặt trong thanh ghi TIMSK. Để tạo tín hiệu có tần số nhất định trong chế độ này, cần phải ghi vào các bit COM1A1=0:COM1A0=1 cho đầu ra OC1A hoặc COM1B1=0:COM1B0=1 cho đầu ra OC1B của bộ điều khiển.

Ngoài ra, đối với mỗi chu kỳ xung nhịp, một sự so sánh được thực hiện giữa thanh ghi đếm TCNT1 và thanh ghi so sánh OCR1A:OCR1B; nếu có sự trùng khớp, cờ ngắt OCF1A=1:OCF1B=1 được đặt và nếu bit OCIE1A=1 :OCIE1B=1 của thanh ghi TIMSK, một ngắt được tạo ra. Đồng thời, trạng thái của chân OC1A:OC1B có thể được thay đổi tùy thuộc vào cài đặt của các bit COM1A1:COM1A0:COM1B1:COM1B0.

Chế độ CTC (đặt lại khi trận đấu)

Ở chế độ này, T1 hoạt động theo nguyên tắc tương tự như ở chế độ Bình thường. Sự khác biệt là giá trị tối đa có thể có của thanh ghi đếm TCNT1 bị giới hạn bởi giá trị của thanh ghi so sánh OCR1A hoặc ICR1 (xem bảng lựa chọn chế độ bộ đếm thời gian/bộ đếm). Khi TCNT1 đạt giá trị OCR1A hoặc ICR1 thì giá trị của TCNT1 được reset về TCNT1=$0000. Đồng thời, cờ TOV1=1 được đặt COM1A1:COM1A0:COM1B1:COM1B0 Xác định hành vi của chân OC1A:OC1B khi có một trận đấu.

Chế độPWM nhanh (PWM nhanh)

Sử dụng chế độ này, bạn có thể tạo tín hiệu tần số cao. Nguyên lý và quy trình hoạt động không khác với chế độ Bình thường, ngoại trừ sự hiện diện của bộ đệm đôi của thanh ghi OCR1A:OCR1B, giúp loại bỏ sự xuất hiện của các xung tín hiệu không đối xứng và cũng khác về hoạt động của các chân OC1A:OC1B ( xem bảng).


Chế độ điều chỉnh pha đúng pha

Sự khác biệt giữa chế độ này và các chế độ trước đó là thanh ghi đếm hoạt động như một bộ đếm ngược. Vì chế độ này được Atmel khuyến nghị là phù hợp nhất để điều chỉnh động cơ nên chúng tôi sẽ xem xét nó chi tiết hơn. Khi thanh ghi đếm TCNT1 đạt đến giá trị của mô đun đếm (TOP) (hoặc giá trị của thanh ghi ICR1 hoặc giá trị của thanh ghi OCR1A, xem bảng lựa chọn chế độ hẹn giờ/bộ đếm), hướng đếm sẽ thay đổi. Khi thanh ghi đếm TCNT1 đạt giá trị nhỏ nhất ($0000), hướng đếm cũng thay đổi và đồng thời cờ ngắt TOV1 của thanh ghi TIFR được đặt. Ngoài ra, nếu nội dung của thanh ghi đếm TCNT1 và thanh ghi so sánh OCR1A:OCR1B bằng nhau thì cờ OCF1A:OCF1B của thanh ghi TIFR được đặt và trạng thái của đầu ra OC1A:OC1B thay đổi theo bảng.

Để tránh phát xạ không đối xứng khi ghi một giá trị vào thanh ghi OCR1A:OCR1B, tính năng đệm ghi kép được triển khai ở chế độ này. Nhờ đó, sự thay đổi thực tế của giá trị thanh ghi thay đổi tại thời điểm thanh ghi bộ đếm TCNT1 đạt đến giá trị của mô đun đếm (TOP) (hoặc giá trị của thanh ghi ICR1 hoặc giá trị thanh ghi OCR1A, xem phần lựa chọn chế độ bộ đếm thời gian/bộ đếm bàn). Do đó, ngay từ đầu, khi bộ đếm thời gian/bộ đếm được khởi tạo, chân OC1A:OC1B sẽ không thay đổi trạng thái khi khớp cho đến khi thanh ghi đạt giá trị (TOP).


Nhiệm vụ: Chúng ta hãy phát triển một chương trình điều khiển độ sáng của đèn sợi đốt 12 Volt bằng cách sử dụng phương pháp điều khiển xung điện xung lực. Khi bạn nhấn nút “Thêm”, độ sáng của đèn sẽ tăng lên và khi bạn nhấp vào nút “Ít hơn”, độ sáng sẽ giảm đi. Sơ đồ của thiết bị tương lai của chúng tôi được hiển thị trong hình. Như thường lệ, chúng tôi sử dụng bộ vi điều khiển Atmega8, bộ vi điều khiển này sẽ được tạo xung nhịp từ bộ tạo dao động bên trong với tần số 4 MHz. Trên thực tế, chúng ta sẽ có một bộ điều chỉnh độ sáng; những thiết bị này được thiết kế để điều chỉnh độ sáng của các thiết bị chiếu sáng. Ngày nay, đèn LED điều chỉnh độ sáng là phổ biến nhất.

Để đơn giản, bạn cũng có thể kết nối một đèn LED với mạch của chúng tôi, nhưng nó sẽ rõ ràng hơn với bóng đèn. Các nút được kết nối với chân PD0, PD1. Chúng tôi kết nối tải với đầu ra PB1(OC1A) thông qua một điện trở và một bóng bán dẫn hiệu ứng trường MOSFET, nó sẽ hoạt động như một chiếc chìa khóa cho chúng ta (ở chế độ chuyển mạch). Bóng bán dẫn hiệu ứng trường được ưa chuộng hơn vì cổng của nó được cách ly với mạch điện và được điều khiển bằng điện trường, đồng thời dòng điện điều khiển đạt tới microamp. Điều này cho phép, bằng cách sử dụng một hoặc hai bóng bán dẫn, để điều khiển một tải công suất cực lớn (lên đến hàng chục ampe và hàng chục hoặc hàng trăm vôn) mà không cần tải bộ vi điều khiển. Cũng tính đến thực tế là các bóng bán dẫn hiệu ứng trường có thể được kết nối song song (không giống như các bóng bán dẫn lưỡng cực), có thể thu được một dòng thậm chí còn mạnh hơn hàng trăm ampe.

Bây giờ chúng ta hãy tìm hiểu cách bộ vi điều khiển thực hiện điều khiển xung điện và viết chương trình. Như đã đề cập trước đó, MK của chúng tôi có 3 bộ hẹn giờ và tất cả chúng đều có thể hoạt động ở chế độPWM. Chúng ta sẽ làm việc với bộ định thời/bộ đếm 16 bit. Chút ít WGM13-10 hãy định cấu hình bộ hẹn giờ của chúng tôi để hoạt động FastPWM với giới hạn số lượng trên ICR1. Nguyên tắc của chương trình là thế này: bộ đếm thời gian của chúng tôi đếm từ 0 đến 65535(0xFFFF), vào thanh ghi ICR1 Hãy nhập số 255, đây sẽ là giới hạn trên của bộ đếm thời gian (TOP), tần số của tín hiệu Xung điều khiển sẽ không đổi. Ngoài ra, bộ hẹn giờ của chúng tôi được cấu hình sao cho nếu thanh ghi đếm và thanh ghi so sánh khớp nhau (TCNT1 = OCR1A), đầu ra của bộ điều khiển sẽ chuyển đổi OC1A. Chu kỳ nhiệm vụ củaPWM có thể được thay đổi bằng cách ghi vào thanh ghi so sánh OCR1A một số nhất định từ 0 đến 255, số này càng lớn thì hệ số lấp đầy càng lớn thì đèn sẽ cháy càng sáng. Tùy thuộc vào nút nào được nhấn, biến sẽ thay đổi Tôi, và sau đó nó được ghi vào sổ đăng ký OCR1A.

Toàn văn chương trình được trình bày dưới đây. Các ý kiến ​​​​mô tả hoạt động của chương trình chi tiết hơn.

/***Bài số 8. Tạo tín hiệuPWM***/ #include #bao gồm int main(void) ( unsigned int i=0; //xác định biến i /***Cấu hình các cổng I/O***/ PORTB = 0x00; DDRB |= (1<< PB1); PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы DDRD = 0x00; /***Настройка таймера***/ TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1 |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя TCNT1 = 0x00; // начальная установка счетчика ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255, // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz OCR1A = 0x00; // начальный коэффициент заполнения ШИМ /***Основной цикл программы***/ while(1) { if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата { if (i < 254) { // коэффициент заполнения ШИМ изменяется от 0 до 255 i=i+1; // увеличиваем i на единицу OCR1A = i; // записываем переменную в регистр сравнения _delay_ms(30); // задержка 30ms } } if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата { if (i >0) // Chu kỳ nhiệm vụ của CPU thay đổi từ 255 thành 0 ( i--; // giảm i đi một (bạn cũng có thể viết cái này) OCR1A = i; // ghi một biến vào thanh ghi so sánh _delay_ms(30); // độ trễ 30ms ) ) ) )

Chú ý!Đầu tiên, chúng ta cấp nguồn cho vi điều khiển, sau đó bạn cần đảm bảo rằng bóng bán dẫn được kết nối với chân MK, sau đó chỉ cấp nguồn cho mạch có đèn và bóng bán dẫn hiệu ứng trường. Nếu không bạn có thể đốt cháy bóng bán dẫn. Thực tế là khi tắt, “chân” của MK “lủng lẳng trong không trung” - chúng không được kết nối với bất cứ thứ gì và xảy ra hiện tượng nhiễu trên chúng. Những giao thoa yếu này đủ để mở một phần bóng bán dẫn hiệu ứng trường rất nhạy. Sau đó, điện trở giữa cực máng và nguồn sẽ giảm từ vài MOhm xuống vài Ohms hoặc một phần Ohms và một dòng điện lớn sẽ chạy qua nó đến đèn. Nhưng bóng bán dẫn sẽ không mở hoàn toàn, vì để làm được điều này, bạn cần áp dụng nhiễu không phải 1-3 V vào cổng mà là 5 V ổn định và điện trở của nó sẽ lớn hơn nhiều so với mức tối thiểu. Điều này sẽ dẫn đến việc tỏa một lượng nhiệt lớn lên nó, nó sẽ bốc khói và có thể cháy.

Điều chế độ rộng xung (PWM) là phương pháp chuyển đổi tín hiệu trong đó thời lượng xung (hệ số nhiệm vụ) thay đổi, nhưng tần số không đổi. Trong thuật ngữ tiếng Anh, nó được gọi làPWM (điều chế độ rộng xung). Trong bài viết này, chúng ta sẽ xem xét chi tiết vềPWM là gì, nó được sử dụng ở đâu và hoạt động như thế nào.

Khu vực ứng dụng

Với sự phát triển của công nghệ vi điều khiển, những cơ hội mới đã mở ra choPWM. Nguyên lý này đã trở thành cơ sở cho các thiết bị điện tử vừa yêu cầu điều chỉnh các thông số đầu ra vừa duy trì chúng ở mức nhất định. Phương pháp điều chế độ rộng xung được sử dụng để thay đổi độ sáng của ánh sáng, tốc độ quay của động cơ cũng như trong việc điều khiển bóng bán dẫn điện của bộ nguồn dạng xung (PSU).

Điều chế độ rộng xung (PW) được sử dụng tích cực trong việc xây dựng hệ thống kiểm soát độ sáng LED. Do quán tính thấp, đèn LED có thời gian chuyển đổi (nhấp nháy và tắt) ở tần số vài chục kHz. Hoạt động của nó ở chế độ xung được mắt người cảm nhận như một ánh sáng rực rỡ liên tục. Đổi lại, độ sáng phụ thuộc vào thời lượng xung (trạng thái mở của đèn LED) trong một khoảng thời gian. Nếu thời gian xung bằng thời gian tạm dừng, nghĩa là chu kỳ hoạt động là 50% thì độ sáng của đèn LED sẽ bằng một nửa giá trị danh nghĩa. Với sự phổ biến của đèn LED 220V, câu hỏi đặt ra là tăng độ tin cậy hoạt động của chúng với điện áp đầu vào không ổn định. Giải pháp được tìm ra dưới dạng một vi mạch vạn năng - một bộ điều khiển công suất hoạt động theo nguyên lý độ rộng xung hoặc điều chế tần số xung. Mạch dựa trên một trong các trình điều khiển này được mô tả chi tiết.

Điện áp nguồn cung cấp cho đầu vào của chip điều khiển liên tục được so sánh với điện áp tham chiếu trong mạch, tạo ra tín hiệuPWM (PWM) ở đầu ra, các thông số được đặt bằng điện trở bên ngoài. Một số vi mạch có một chân để cung cấp tín hiệu điều khiển analog hoặc digital. Do đó, hoạt động của bộ điều khiển xung có thể được điều khiển bằng bộ chuyển đổi PHI khác. Điều thú vị là đèn LED không nhận xung tần số cao mà nhận dòng điện được làm mịn bởi cuộn cảm, đây là thành phần bắt buộc của các mạch như vậy.

Việc sử dụng rộng rãi xung điện được phản ánh trong tất cả các màn hình LCD có đèn nền LED. Thật không may, trong màn hình LED, hầu hết các bộ chuyển đổi PWB đều hoạt động ở tần số hàng trăm Hertz, điều này ảnh hưởng tiêu cực đến thị lực của người dùng PC.

Bộ vi điều khiển Arduino cũng có thể hoạt động ở chế độ bộ điều khiểnPWM. Để thực hiện việc này, hãy gọi hàm AnalogWrite(), cho biết giá trị từ 0 đến 255 trong ngoặc đơn. Số 0 tương ứng với 0V và 255 đến 5V. Các giá trị trung gian được tính tương ứng.

Sự phổ biến rộng rãi của các thiết bị hoạt động theo nguyên lýPWM đã cho phép nhân loại tránh xa các nguồn cung cấp điện biến áp kiểu tuyến tính. Kết quả là hiệu suất tăng lên và trọng lượng cũng như kích thước của bộ nguồn giảm đi nhiều lần.

Bộ điều khiển PLC là một phần không thể thiếu của nguồn điện chuyển mạch hiện đại. Nó điều khiển hoạt động của một bóng bán dẫn điện nằm trong mạch sơ cấp của máy biến áp xung. Do có mạch phản hồi nên điện áp ở đầu ra của nguồn điện luôn ổn định. Độ lệch nhỏ nhất của điện áp đầu ra được phát hiện thông qua phản hồi của một vi mạch, vi mạch này sẽ điều chỉnh ngay lập tức chu kỳ hoạt động của các xung điều khiển. Ngoài ra, bộ điều khiểnPWM hiện đại còn giải quyết một số nhiệm vụ bổ sung giúp tăng độ tin cậy của nguồn điện:

  • cung cấp chế độ khởi động mềm cho bộ chuyển đổi;
  • giới hạn biên độ và chu kỳ hoạt động của xung điều khiển;
  • kiểm soát mức điện áp đầu vào;
  • bảo vệ chống đoản mạch và quá nhiệt của công tắc nguồn;
  • nếu cần, hãy chuyển thiết bị sang chế độ chờ.

Nguyên lý hoạt động của bộ điều khiểnPWM

Nhiệm vụ của bộ điều khiểnPWM là điều khiển công tắc nguồn bằng cách thay đổi các xung điều khiển. Khi hoạt động ở chế độ chuyển mạch, Transistor ở một trong hai trạng thái (mở hoàn toàn, đóng hoàn toàn). Ở trạng thái đóng, dòng điện qua điểm nối p-n không vượt quá vài μA, điều đó có nghĩa là công suất tiêu tán có xu hướng bằng không. Ở trạng thái mở, mặc dù dòng điện cao nhưng điện trở của tiếp giáp pn cực kỳ thấp, điều này cũng dẫn đến tổn thất nhiệt không đáng kể. Lượng nhiệt lớn nhất được giải phóng tại thời điểm chuyển từ trạng thái này sang trạng thái khác. Nhưng do thời gian chuyển tiếp ngắn so với tần số điều chế nên tổn thất điện năng trong quá trình chuyển mạch là không đáng kể.

Điều chế độ rộng xung được chia thành hai loại: analog và kỹ thuật số. Mỗi loại đều có những ưu điểm riêng và có thể được thực hiện theo những cách khác nhau trong thiết kế mạch.

Analog tương tự

Nguyên lý hoạt động của bộ điều chế tín hiệu analog tương tự dựa trên việc so sánh hai tín hiệu có tần số khác nhau vài bậc độ lớn. Phần tử so sánh là bộ khuếch đại thuật toán (bộ so sánh). Một điện áp răng cưa có tần số không đổi cao được cung cấp cho một trong các đầu vào của nó và điện áp điều chế tần số thấp với biên độ thay đổi được cung cấp cho đầu vào kia. Bộ so sánh so sánh cả hai giá trị và tạo ra các xung hình chữ nhật ở đầu ra, thời lượng của xung này được xác định bởi giá trị hiện tại của tín hiệu điều chế. Trong trường hợp này, tần sốPWM bằng tần số của tín hiệu răng cưa.

kỹ thuật số kỹ thuật số

Điều chế độ rộng xung trong giải thích kỹ thuật số là một trong nhiều chức năng của bộ vi điều khiển (MCU). Hoạt động độc quyền với dữ liệu số, MK có thể tạo ra mức điện áp cao (100%) hoặc thấp (0%) ở đầu ra của nó. Tuy nhiên, trong hầu hết các trường hợp, để điều khiển tải hiệu quả, điện áp ở đầu ra MC phải được thay đổi. Ví dụ như điều chỉnh tốc độ động cơ, thay đổi độ sáng của đèn LED. Tôi nên làm gì để nhận được bất kỳ giá trị điện áp nào trong phạm vi từ 0 đến 100% ở đầu ra của vi điều khiển?

Vấn đề được giải quyết bằng cách sử dụng phương pháp điều chế độ rộng xung và sử dụng hiện tượng lấy mẫu quá mức, khi tần số chuyển đổi được chỉ định cao hơn vài lần so với đáp ứng của thiết bị được điều khiển. Bằng cách thay đổi chu kỳ hoạt động của các xung, giá trị trung bình của điện áp đầu ra sẽ thay đổi. Theo quy định, toàn bộ quá trình xảy ra ở tần số hàng chục đến hàng trăm kHz, cho phép điều chỉnh trơn tru. Về mặt kỹ thuật, điều này được thực hiện bằng cách sử dụng bộ điều khiểnPWM - một vi mạch chuyên dụng là “trái tim” của bất kỳ hệ thống điều khiển kỹ thuật số nào. Việc sử dụng tích cực các bộ điều khiển dựa trên xung điện là do những ưu điểm không thể phủ nhận của chúng:

  • hiệu suất chuyển đổi tín hiệu cao;
  • sự ổn định của công việc;
  • tiết kiệm năng lượng tiêu thụ của tải;
  • giá thấp;
  • độ tin cậy cao của toàn bộ thiết bị.

Bạn có thể nhận tín hiệuPWM ở các chân của vi điều khiển theo hai cách: phần cứng và phần mềm. Mỗi MK đều có một bộ hẹn giờ tích hợp có khả năng tạo ra các xungPWM ở một số chân nhất định. Đây là cách thực hiện phần cứng đạt được. Nhận tín hiệu điều khiển bằng lệnh phần mềm có nhiều khả năng hơn về độ phân giải và cho phép bạn sử dụng số lượng chân lớn hơn. Tuy nhiên, phương pháp phần mềm dẫn đến tải MK cao và chiếm nhiều bộ nhớ.

Đáng chú ý là trong điều khiển xung kỹ thuật số, số lượng xung trong mỗi chu kỳ có thể khác nhau và bản thân các xung có thể nằm ở bất kỳ phần nào của chu kỳ. Mức tín hiệu đầu ra được xác định bởi tổng thời lượng của tất cả các xung trong một khoảng thời gian. Cần hiểu rằng mỗi xung bổ sung là sự chuyển đổi của bóng bán dẫn điện từ trạng thái mở sang trạng thái đóng, dẫn đến tổn thất tăng lên trong quá trình chuyển mạch.

Ví dụ về việc sử dụng bộ điều chỉnh độ rộng xung

Một trong những lựa chọn để triển khai bộ điều chỉnh đơn giản PLC đã được mô tả trước đó. Nó được xây dựng trên cơ sở một vi mạch và có một dây nịt nhỏ. Tuy nhiên, mặc dù có thiết kế mạch đơn giản nhưng bộ điều chỉnh có phạm vi ứng dụng khá rộng: mạch điều khiển độ sáng của đèn LED, dải đèn LED, điều chỉnh tốc độ quay của động cơ DC.

Đọc thêm

xung điện- Điều chế độ rộng xung
xung điện- Điều chế độ rộng xung (tức là giống như xung)

PWM là gì và tại sao nó lại cần thiết?

Tại sao bạn cần phần mềm PLC?

Sau đó, trên chính AVR (Atmega) có 1-2 kênh shim, thường không đủ cho những gì cần thiết.

Hãy để chúng tôi có 3 (ba) đèn LED và chúng tôi muốn kiểm soát độ sáng của từng đèn riêng lẻ. Các kênh hẹn giờ xung tích hợp sẵn là không đủ. Và nói chung, có lẽ chúng ta vẫn muốn thực hiện một số biện pháp kiểm soát đặc biệt đối với từng người trong số họ. Do đó, chúng tôi đặt chúng trên các chân bình thường (trong ví dụ PORTC là các chân 3,4,5) và điều khiển chúng theo chương trình.

Thông tin bổ sung về kết nối: http://www.radiokot.ru/start/mcu_fpga/avr/05/ và trong biểu dữ liệu tới bộ điều khiển.

Tính toán điện trở cho đèn LED:

Nguồn điện: 5V. Điện áp rơi trên đèn LED có thể được coi là 1,5V. Dòng điện trên đèn LED không được quá 20mA (một số người sẽ cho rằng cần 15mA, nhưng tôi thích nó sáng hơn).
Theo định luật Ohm: I=U/R, R=U/I=(5-1.5)/0.02=175 Ohm. Tôi đã lắp các điện trở R1, R2 và R2 - 220 Ohms.

Thuật toán

Lựa chọn đơn giản nhất là một chu kỳ vĩnh cửu. Tùy chọn bị gián đoạn sẽ có sau (bên dưới), bây giờ chúng ta hãy xem một ví dụ đơn giản để hiểu bản chất.

Đầu tiên, bạn cần xác định hai điều: đèn LED sẽ nhấp nháy ở tần số nào để không nhìn thấy hiện tượng nhấp nháy này và thứ hai là đèn LED có thể có bao nhiêu mức độ sáng.

Về mặt mức độ sáng, hãy đặt nó là 256. 0 - tắt hoàn toàn, 255 - bật hoàn toàn (tức là kênhPWM luôn ở mức logic, tức là chu kỳ nhiệm vụ = 100%.

Tuy nhiên, bây giờ tôi sẽ làm bạn bối rối một chút.

Vấn đề là chúng ta có CỘNG của diode trong mạch được nối trực tiếp với nguồn điện, và điểm trừ đi qua điện trở đến chân (nơi điện trở không quan trọng, điều quan trọng là chân MK là gì) . Do đó, đèn LED sáng lên khi mức trên chân MK thấp, tức là. không, tức là chân bên trong MK được ném về GND, tức là. xuống đất. Điều này có nghĩa là các số 0 và 1 trong xung thực sự phải được đảo ngược. Những thứ kia. Tín hiệu chứa số 0 càng dài so với số 1 thì diode sẽ càng sáng.

Và như vậy, có 256 mức độ sáng.

Chúng ta đang nói về kiểu chớp mắt nào? Điểm mấu chốt là nếu chúng ta phải áp tín hiệuPWM cho nhiều điốt và thực hiện việc này một cách tuần tự cho từng điốt, thì sau khi xuất tín hiệu đến điốt đầu tiên, chúng ta phải quay lại xuất tín hiệu cho nó trong thời gian sao cho:

  1. có thời gian để tạo ra tín hiệu đầy đủ,
  2. không quá 1/25 giây trôi qua, nếu không đèn LED sẽ nhấp nháy rõ rệt,
  3. Không có sự tạm dừng đáng chú ý nào trong quá trình tạo xung xung giữa các phân đoạn của tín hiệu xung xung, tức là. để tín hiệu xung lực xung lực không bị biến dạng.

Dưới đây là một ví dụ về méo tín hiệu điều khiển từ xa:

Chúng tôi sẽ ghi nhớ tất cả những điều này, nhưng trên thực tế, nó không quan trọng đối với chúng tôi ở đây, vì chúng tôi sẽ có một đèn flash mượt mà rất đơn giản và nó sẽ chỉ thay đổi độ sáng, tức là. sẽ có rất nhiều thời gian và nhiệm vụ này đơn giản đến mức nó sẽ không ngốn thời gian tạo ra tín hiệuPWM.

Và đây là mã nguồn (dành cho studio AVR, tức là gcc):

#define F_CPU 1000000UL #include #bao gồm #define LEDS_N 3 #define LEDS_PORT PORTC #define LEDS_DDR DDRC int main() ( register unsigned char scancounter=0; register unsigned char i; register unsigned char Glow=0; unsigned char level=(0,16,32); // phần nào của tất cả các chu kỳ mà đèn led BẬT unsigned char ledbits=(0b00001000,0b00010000, 0b00100000); // đặt hướng C5 - đầu ra LEDS_DDR=0b11111111; // tắt tất cả các đèn led LEDS_PORT=0b11111111; for(;;)( // phần pwm chính cho (i=0;i =level[i])( // off - bật chân LEDS_PORT|=ledbits[i]; ) else ( // bật - tắt chân pin LEDS_PORT&=~ledbits[i]; ) ) scancounter++; // thay đổi độ sáng led if (!scancounter)( for (i=0;i 128)cấp[i]=0; ) ) ) )

Chương trình hoạt động như thế nào

Có bộ đếm khoảng thời gian - số lượng quét. Giá trị tối đa của bộ đếm này là số mức độ sáng trừ đi 1. Mỗi vòng quay của chu kỳ, nó tăng thêm một, sau đó vượt quá 255 và lại trở thành 0. Ở mỗi vòng quay của chu kỳ, một tín hiệu được đặt cho mỗi đèn LED. Nếu bộ đếm nhỏ hơn hoặc bằng mức độ sáng thì hãy tắt diode. Nếu bộ đếm nhỏ hơn mức độ sáng được chỉ định cho diode thì hãy bật diode. Và giống như mọi chu kỳ. Ví dụ: nếu mức độ sáng là 0 thì bộ đếm sẽ luôn bằng hoặc lớn hơn 0 và diode sẽ luôn tắt. Nếu mức độ sáng là 255 thì bộ đếm sẽ nhỏ hơn giá trị này 254 trên 255 vòng quay của bộ đếm và sẽ cháy ở cường độ gần như tối đa. Nếu độ sáng được đặt thành 50, thì trong 50 vòng quay đầu tiên của chu kỳ, diode sẽ bật và trong 206 vòng quay còn lại, nó sẽ tắt, tức là. 50/256 dòng điện tối đa sẽ được cung cấp cho nó.

Dưới đây trong chương trình, chúng tôi kiểm soát mức độ sáng của diode để có một số loại trình diễn. Với mỗi lần tràn bộ đếm, 1 sẽ được thêm vào độ sáng của tất cả các điốt, nhưng nếu độ sáng lớn hơn 128 thì nó được đặt lại về 0. Nói chung, nếu kiểm tra này không tồn tại thì sau khi đạt đến mức độ sáng 255 lẽ ra sẽ đặt lại về 0, nhưng kinh nghiệm cho thấy rằng sau độ sáng 128, nó tăng đến mức chúng ta có thể cho rằng ở giá trị 128 thì nó đã gần như là mức tối đa. Và để hiệu ứng thu được năng động hơn, kiểm tra này đã được giới thiệu.

Bạn cũng nên biết rằng sự phụ thuộc của độ sáng vào dòng điện đối với đèn LED KHÔNG PHẢI TUYẾN TÍNH. Những thứ kia. 128 không mờ gấp đôi 255 và không sáng gấp đôi 64.

Ở đây chúng tôi không quan tâm đến việc mất bao lâu để quay toàn bộ chu kỳ với tất cả các điốt, vì rõ ràng là ở độ tinh khiết 1 MHz (đó là nơi MK của tôi hoạt động), nó sẽ đủ nhanh để mắt không nhìn thấy. thấy có hiện tượng nhấp nháy.

Ảnh lắp ráp:


Bấm vào hình để phóng to

Và đây là video về tác phẩm: (avi, divx, 3MB)
Video không hiển thị rõ quá trình chuyển đổi độ sáng vì ma trận camera không có quán tính thị giác giống như mắt người, nhưng nhìn chung, quá trình này có thể nhìn thấy được.

Hình 1

T = T0+T1. Chu kỳ xung

T = 1/F

S = T/T1

Chu kỳ nhiệm vụ

Hệ số lấp đầy D=1/S hoặc là D = T1/T*100%

Ví dụ: các thiết bị kỹ thuật số, bộ vi điều khiển chỉ có thể hoạt động với hai mức tín hiệu, tức là. không và một hoặc tắt và bật. Do đó, bạn có thể dễ dàng sử dụng nó để theo dõi trạng thái tải, chẳng hạn như bật hoặc tắt đèn LED. Bạn cũng có thể sử dụng nó để điều khiển bất kỳ thiết bị điện nào bằng cách sử dụng các trình điều khiển thích hợp (bóng bán dẫn, triac, rơle, v.v.) Nhưng đôi khi bạn cần nhiều hơn là chỉ “bật” và “tắt” thiết bị. Vì vậy, nếu bạn muốn kiểm soát độ sáng của đèn LED (hoặc đèn) hoặc tốc độ của động cơ DC, thì tín hiệu số đơn giản là không thể làm được điều đó. Tình trạng này rất phổ biến trong công nghệ số và được gọi là Điều chế độ rộng xung (PWM).

Hầu hết tất cả các bộ vi điều khiển hiện đại đều có phần cứng chuyên dụng để tạo tín hiệu xung điện. Trong hướng dẫn này, chúng ta sẽ tìm hiểu những kiến ​​thức cơ bản về kỹ thuậtPWM và sau đó chúng ta sẽ xem cách triển khaiPWM bằng bộ vi điều khiển AVR.

Các thiết bị kỹ thuật số như vi điều khiển chỉ có thể tạo ra hai mức trên đường đầu ra, cao = 5V và thấp = 0V. Nhưng nếu chúng ta muốn có được 2,5 hoặc 3,1 hoặc bất kỳ điện áp nào trong khoảng 0-5V thì sao? Để làm điều này, thay vì tạo ra điện áp DC không đổi ở đầu ra, chúng ta sẽ tạo ra một sóng vuông có mức cao = 5V và mức thấp = 0V (xem Hình 1).

Hình 1

Hình vẽ cho thấy tín hiệu vẫn luân phiên ở mức thấp và cao trong một thời gian. T0 - mức thấp, T1 - mức cao. Chu kỳ tín hiệu sẽ bằng T = T0+T1. Chu kỳ xung- đây là khoảng thời gian giữa hai điểm đặc trưng của hai xung liền kề. Thông thường, khoảng thời gian được đo giữa hai lần tăng hoặc giảm của các xung liền kề và được biểu thị bằng chữ in hoa T.

Khoảng thời gian lặp lại xung liên quan trực tiếp đến tần số của chuỗi xung và có thể được tính bằng công thức: T = 1/F

Nếu độ dài xung T1 chính xác bằng một nửa chu kỳ T thì tín hiệu như vậy thường được gọi là “sóng vuông”.

Chu kỳ hoạt động của xung là tỷ lệ giữa khoảng thời gian lặp lại xung với thời lượng của chúng và được ký hiệu bằng chữ S: S = T/T1

Hệ số nhiệm vụ là đại lượng không thứ nguyên và không có đơn vị đo lường nhưng có thể được biểu thị bằng phần trăm. Thuật ngữ này thường được tìm thấy trong các văn bản tiếng Anh Chu kỳ nhiệm vụ, đây được gọi là giá trị chu kỳ nhiệm vụ hoặc chu kỳ nhiệm vụPWM. Chu kỳ nhiệm vụ D là nghịch đảo của chu kỳ nhiệm vụ.

Hệ số lấp đầy thường được biểu thị bằng phần trăm và được tính bằng công thức: D=1/S hoặc là D = T1/T*100%

Trong hình trên (Hình 1), bạn có thể thấy T1 = T0, bằng một nửa khoảng thời gian. Vì vậy, chu kỳ nhiệm vụ củaPWM là 50%. Nếu tần số của các xung như vậy đủ cao (giả sử là 5000 Hz), thì chúng ta sẽ nhận được một nửa 5V, tức là. 2,5V. Do đó, nếu đầu ra của bộ điều khiển được ghép nối với động cơ (sử dụng trình điều khiển thích hợp), nó sẽ hoạt động ở mức 50% tốc độ tối đa. Kỹ thuật PLC sử dụng thực tế này để tạo ra bất kỳ điện áp nào giữa hai mức (ví dụ: trong khoảng 0-12V). Bí quyết là khi giá trị chu kỳ nhiệm vụ thay đổi trong khoảng 0-100%, chúng ta sẽ nhận được cùng một tỷ lệ phần trăm điện áp đầu vào ở đầu ra. Dưới đây là một số ví dụ về tín hiệuPWM với các chu kỳ nhiệm vụ khác nhau.

Nếu bạn cài đặt bộ lọc R/C ở đầu ra, bạn có thể nhận được mức tín hiệu DC thuần túy thay vì sóng vuông. Nhưng điều này không bắt buộc đối với động cơ chổi than hoặc để kiểm soát độ sáng của đèn LED. Để thực hiện việc này, bạn có thể cấp trực tiếp tín hiệu vào trình điều khiển (ví dụ: bóng bán dẫn lưỡng cực, MOSFET, v.v.).

Dưới chế độ hoạt động 16-bit. Bộ định thời được hiểu là thuật toán đếm của nó và hoạt động của đầu ra bộ tạo xung liên quan đến nó, được xác định bởi sự kết hợp của các bit xác định chế độ vận hành bộ định thời (WGMn3-0) và chế độ tạo tín hiệu đầu ra (COMnx1:0) . Trong trường hợp này, các bit để thiết lập chế độ tạo tín hiệu đầu ra không ảnh hưởng đến thuật toán đếm, bởi vì Thuật toán đếm chỉ phụ thuộc vào trạng thái của các bit để thiết lập chế độ vận hành bộ hẹn giờ. Trong chế độPWM, các bit COMnx1:0 cho phép bạn bật/tắt tính năng đảo ngược trên đầu raPWM được tạo ra (tức là chọnPWM có đảo ngược hoặcPWM không đảo ngược). Đối với các chế độ không phảiPWM, các bit COMnx1:0 xác định hành động cần thực hiện khi khớp xảy ra: đặt lại, đặt hoặc đảo ngược đầu ra (xem thêm “Khối điều hòa tín hiệu đầu ra” và “Sơ đồ định giờ bộ đếm thời gian 16-bit”) .

Hoạt động binh thương

Chế độ hoạt động đơn giản nhất là chế độ bình thường (WGMn3-0 = 0b0000). Ở chế độ này, bộ đếm hoạt động như bộ đếm tổng (tăng dần) và bộ đếm không được đặt lại. Bộ đếm tràn khi đi qua mức tối đa 16 bit. giá trị (0xFFFF) đến giới hạn số lượng thấp hơn (0x0000). Trong quá trình hoạt động bình thường, cờ tràn bộ đếm thời gian TOVn sẽ được đặt trên cùng một chu kỳ xung nhịp khi TCNTn về 0.

Trong thực tế, cờ tràn TOVn là bit thứ 17 của bộ đếm thời gian, ngoại trừ việc nó chỉ được đặt chứ không bị xóa. Tuy nhiên, thuộc tính này có thể được sử dụng theo chương trình để tăng độ phân giải của bộ định thời bằng cách sử dụng ngắt tràn bộ định thời, khi đó cờ TOVn sẽ tự động được đặt lại. Không có tình huống đặc biệt nào đối với hoạt động bình thường nên trạng thái đồng hồ mới có thể được ghi lại bất kỳ lúc nào.

Ở chế độ bình thường, bạn có thể sử dụng khối chụp. Tuy nhiên, phải đảm bảo rằng khoảng thời gian tối đa giữa khi xảy ra các sự kiện bên ngoài không vượt quá khoảng thời gian tràn bộ đếm. Nếu điều kiện này không được đáp ứng thì cần phải sử dụng ngắt tràn bộ đếm thời gian hoặc bộ chia tỷ lệ trước.

Khối so sánh có thể được sử dụng để tạo ra các ngắt. Không nên sử dụng đầu ra OCnx để tạo tín hiệu trong hoạt động bình thường, vì trong trường hợp này, một phần đáng kể thời gian của bộ xử lý sẽ được sử dụng.

Chế độ đặt lại hẹn giờ trận đấu (CTC)

Ở chế độ CTC (WGM01, WGM00 =0b10), thanh ghi OCR0 được sử dụng để đặt độ phân giải của bộ đếm. Nếu chế độ CTC được đặt và giá trị bộ đếm (TCNT0) khớp với giá trị của thanh ghi OCR0, bộ đếm sẽ được đặt lại về 0 (TCNT0=0). Do đó, OCR0 chỉ định số lượng trên cùng của bộ đếm và do đó, độ phân giải của nó. Chế độ này cung cấp phạm vi điều chỉnh tần số rộng hơn của các xung hình chữ nhật được tạo ra. Nó cũng đơn giản hóa hoạt động của bộ đếm sự kiện bên ngoài.

Trong thiết lập lại bộ định thời ở chế độ khớp (WGMn3-0 = 0b0100 hoặc 0b1100), độ phân giải của bộ định thời được đặt bởi các thanh ghi OCRnA hoặc ICRn. Trong chế độ CTC, bộ đếm (TCNTn) được đặt lại nếu giá trị của nó khớp với giá trị của thanh ghi OCRnA (WGMn3-0 = 0b0100) hoặc ICRn (WGMn3-0 = 0b1100). Giá trị của thanh ghi OCRnA hoặc ICRn xác định giới hạn đếm trên và do đó độ phân giải của bộ định thời. Chế độ này cung cấp phạm vi điều chỉnh tần số rộng hơn của các xung hình chữ nhật được tạo ra. Nó cũng đơn giản hóa hoạt động của bộ đếm sự kiện bên ngoài. Sơ đồ thời gian hoạt động của bộ định thời ở chế độ CTC được hiển thị trong Hình 1. Bộ đếm (TCNTn) tăng trạng thái của nó cho đến khi xảy ra khớp với giá trị OCRnA hoặc ICRn, sau đó bộ đếm (TCNTn) được đặt lại.

Hình 1 - Sơ đồ định thời cho chế độ STS

Khi đạt đến giới hạn đếm trên, một ngắt có thể được tạo bằng cờ OCFnA hoặc ICFn tương ứng với các thanh ghi được sử dụng để đặt giới hạn đếm trên. Nếu ngắt được kích hoạt thì thủ tục ngắt có thể được sử dụng để cập nhật giới hạn số lượng trên. Tuy nhiên, việc đặt giá trị đếm trên gần với giá trị của giới hạn đếm dưới khi bộ đếm hoạt động mà không có bộ đếm gộp trước hoặc với giá trị bộ đếm gộp nhỏ phải được thực hiện hết sức thận trọng, bởi vì Không có bộ đệm đôi trong chế độ CTC. Nếu giá trị được ghi vào OCRnA hoặc ICRn nhỏ hơn giá trị hiện tại của TCNTn thì bộ đếm sẽ reset khi xảy ra điều kiện trùng khớp khi đạt giá trị lớn nhất (0xFFFF), sau đó reset về 0x0000 và đạt giá trị mới là OCRnA hoặc ICRn. Trong nhiều trường hợp, tình trạng này là không mong muốn. Một cách khác là chế độ xung nhịp nhanh, trong đó thanh ghi OCRnA xác định giới hạn đếm trên (WGMn3-0 = 0b1111), bởi vì trong trường hợp này OCRnA được đệm đôi.

Để tạo tín hiệu ở chế độ CTC, đầu ra OCnA có thể được sử dụng để thay đổi mức logic trên mỗi trận đấu bằng cách đặt chế độ chuyển mạch (COMnA1, COMnA0 = 0b01). Giá trị OCnA sẽ chỉ xuất hiện trên chân cổng nếu hướng đầu ra được chỉ định cho chân đó. Tần số tối đa của tín hiệu được tạo là fOC0 = fclk_I/O/2 nếu OCRnA = 0x0000. Đối với các giá trị OCRn khác, tần số của tín hiệu được tạo ra có thể được xác định theo công thức:

trong đó biến N chỉ định hệ số chia của bộ đếm gộp trước (1, 8, 32, 64, 128, 256 hoặc 1024).

Giống như hoạt động bình thường, cờ TOV0 được đặt ở cùng thời điểm hẹn giờ khi giá trị của nó thay đổi từ 0xFFFF thành 0x0000.

Chế độPWM nhanh

Chế độ điều chế độ rộng xung nhanh (PWM) (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) được thiết kế để tạo ra các xungPWM có tần số tăng lên. Không giống như các chế độ hoạt động khác, chế độ này sử dụng hoạt động đếm một chiều. Việc đếm được thực hiện theo hướng từ giới hạn đếm dưới lên giới hạn đếm trên.

Nếu chế độ đầu ra không đảo được đặt thì khi TCNTn và OCRnx trùng nhau, tín hiệu OCnx được đặt và đặt lại ở giới hạn đếm trên. Nếu chế độ đảo ngược được chỉ định, đầu ra OCnx sẽ được đặt lại khi khớp và được đặt ở giới hạn số lượng cao. Do tính năng đếm một chiều, tần số hoạt động của chế độ này cao gấp đôi so với chế độ điều chỉnh pha, trong đó sử dụng tính năng đếm hai chiều. Khả năng tạo ra tín hiệu điều khiển tần số cao giúp cho việc sử dụng chế độ này trở nên hữu ích trong các nhiệm vụ ổn định nguồn điện, chỉnh lưu và chuyển đổi kỹ thuật số sang tương tự. Đồng thời, tần số cao cho phép sử dụng các phần tử bên ngoài có kích thước vật lý nhỏ (cuộn cảm, tụ điện), do đó giảm chi phí chung của hệ thống.

Độ phân giảiPWM có thể được cố định 8, 9 hoặc 10 bit hoặc được đặt bởi thanh ghi ICRn hoặc OCRnA, nhưng không ít hơn 2 bit (ICRn hoặc OCRnA = 0x0003) và không quá 16 bit (ICRn hoặc OCRnA = 0xFFFF). Độ phân giảiPWM ở giá trị giới hạn trên (UL) nhất định được tính như sau:

Ở chế độ FastPWM, bộ đếm được tăng dần cho đến khi giá trị của nó khớp với một trong các giá trị cố định 0x00FF, 0x01FF hoặc 0x03FF (nếu WGMn3:0 = 0b0101, 0b0110 hoặc 0b0111, tương ứng), giá trị trong ICRn (nếu WGMn3:0 = 0b1110) hoặc giá trị trong OCRnA (nếu WGMn3:0 = 0b1111) rồi đặt lại bằng tích tắc đồng hồ hẹn giờ tiếp theo. Sơ đồ thời gian cho chế độ xung nhịp nhanh được hiển thị trong Hình 2. Hình này hiển thị chế độ xung nhịp nhanh khi thanh ghi OCRnA hoặc ICRn được sử dụng để đặt giới hạn trên. Giá trị TCNTn trong sơ đồ thời gian được hiển thị dưới dạng biểu đồ hàm để minh họa việc đếm một chiều. Sơ đồ hiển thị cả đầu raPWM đảo ngược và không đảo ngược. Một đường ngang ngắn hiển thị các điểm trên biểu đồ TCNTn nơi giá trị OCRnx và TCNTnx trùng nhau. Cờ ngắt OCnx được đặt khi xảy ra sự trùng khớp.

Hình 2 - Sơ đồ thời gian cho chế độ xung nhanh

Cờ tràn bộ đếm thời gian (TOVn) được đặt bất cứ khi nào bộ đếm đạt đến giới hạn cao. Ngoài ra, cùng một xung đồng hồ, cùng với cờ TOVn, có thể đặt cờ OCnA hoặc ICFn nếu thanh ghi OCRnA hoặc ICRn được sử dụng để đặt giới hạn trên tương ứng. Nếu một trong những ngắt này được bật, quy trình ngắt có thể cập nhật giới hạn số lượng trên và ngưỡng so sánh.

Nếu giá trị giới hạn trên thay đổi thì phải đáp ứng điều kiện là giá trị giới hạn trên mới được ghi lớn hơn hoặc bằng các giá trị trong tất cả các thanh ghi ngưỡng so sánh. Nếu không, trận đấu giữa TCNTn và OCRnx sẽ không bao giờ xảy ra. Lưu ý rằng khi sử dụng các giá trị giới hạn trên cố định, các bit không sử dụng sẽ được che dấu bằng 0 khi ghi vào thanh ghi OCRnx.

Cơ chế sửa đổi thanh ghi ICRn khác với OCRnA khi nó được sử dụng để đặt giới hạn trên. Thanh ghi ICRn không được đệm đôi. Điều này có nghĩa là nếu một giá trị nhỏ được ghi vào ICRn trong khi bộ đếm đang chạy với rất ít hoặc không có sự định tỷ lệ trước thì sẽ có nguy cơ ghi một giá trị vào thanh ghi ICRn nhỏ hơn giá trị hiện tại của TCNTn. Kết quả là trong tình huống này, trận đấu đứng đầu bảng sẽ bị bỏ lỡ. Trong trường hợp này, bộ đếm sẽ đạt giá trị tối đa (0xFFFF), khởi động lại ở 0x0000 và chỉ sau đó tạo ra kết quả khớp. Thanh ghi OCRnA chứa sơ đồ đệm đôi, vì vậy nó có thể được sửa đổi bất kỳ lúc nào.

lớp="eliadunit">

Nếu việc ghi được thực hiện vào địa chỉ OCRnA, giá trị thực sự được đặt trong thanh ghi bộ đệm OCRnA. Nếu xảy ra sự trùng khớp giữa TCNTn và đỉnh của bộ đếm thì chu kỳ xung nhịp tiếp theo của bộ định thời là việc sao chép thanh ghi đệm sang thanh ghi ngưỡng so sánh OCRnA. Thanh ghi được cập nhật trong cùng chu kỳ xung nhịp khi TCNTn được đặt lại và cờ TOVn được đặt.

Nên sử dụng thanh ghi ICRn để đặt giới hạn trên nếu giới hạn đếm trên là hằng số. Trong trường hợp này, thanh ghi OCRnA cũng được giải phóng để tạo tín hiệuPWM ở đầu ra OCnA. Tuy nhiên, nếu tần sốPWM thay đổi linh hoạt (do thay đổi giới hạn trên), thì trong trường hợp này sẽ thuận lợi hơn khi sử dụng thanh ghi OCRnA để đặt giới hạn trên, bởi vì nó hỗ trợ bộ đệm đôi.

Ở chế độ xung nhịp nhanh, các đơn vị so sánh cho phép bạn tạo tín hiệu xung điện xung trên các chân OCnx. Nếu COMnx1:0 = 0b10 thì chế độPWM được thiết lập mà không đảo ngược đầu ra và nếu COMnx1:0 = 0b11 thì chế độPWM với đảo ngược đầu ra sẽ được đặt (xem Bảng 59). Giá trị OCnx thực tế có thể được quan sát trên chân cổng nếu nó được đặt thành hướng đầu ra (DDR_OCnx). Tín hiệuPWM được tạo bằng cách cài đặt (đặt lại) thanh ghi OCnx khi xảy ra sự trùng khớp giữa OCRnx và TCNTn và bằng cách đặt lại (cài đặt) thanh ghi OCnx cùng với việc đặt lại bộ đếm (thay đổi từ giới hạn cao xuống giới hạn thấp).

Tần sốPWM của tín hiệu đầu ra đối với một giá trị giới hạn trên (UL) nhất định được xác định bằng biểu thức:

trong đó N là biến xác định giá trị của hệ số phân chia trước (1, 8, 32, 64, 128, 256 hoặc 1024).

Việc ghi các giá trị giới hạn vào thanh ghi OCRnx có liên quan đến các trường hợp đặc biệt trong quá trình tạo xung điều khiển. Nếu OCRnx được đặt bằng giới hạn dưới (0x0000), thì một xung ngắn sẽ xuất hiện ở đầu ra trong mỗi chu kỳ xung nhịp thứ (VP+1) của bộ hẹn giờ. Việc ghi một giá trị bằng giới hạn trên vào OCRnx sẽ dẫn đến việc thiết lập mức nhật ký không đổi. 1 hoặc 0 ở đầu ra (tùy thuộc vào cực tính của tín hiệu đầu ra được chọn bằng bit COMnx1: 0).

Nếu cần tạo sóng vuông tần số cao (xung hình chữ nhật có chu kỳ nhiệm vụ lấp đầy 2 hoặc 50%), thì cần phải sử dụng chế độ xung nhanh với các bit COMnA1:0 = 0b01 được đặt, điều này gây ra mức logic tại đầu ra OCnA để chuyển đổi (đảo ngược) trên mỗi trận đấu. Điều này chỉ áp dụng nếu OCRnA được sử dụng để đặt giới hạn trên (WGMn3-0 =0b1111). Tần số sóng vuông được tạo tối đa trong trường hợp này là fOCnA = fclk_I/O/2, nếu OCRnA = 0x0000. Tính năng này tương tự như chuyển đổi OCnA ở chế độ CTC, ngoại trừ bộ đệm đôi, hiện diện ở chế độ SW nhanh.

Chế độ điều chế độ rộng xung có hiệu chỉnh pha (Phase Correct)

Chế độ điều chế độ rộng xung điều chỉnh pha (PWM FC) (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 hoặc 0b1011) được thiết kế để tạo ra tín hiệu điều chỉnh pha với độ phân giải cao. Chế độ FC FC dựa trên hoạt động hai chiều của bộ đếm thời gian. Bộ đếm quay vòng từ giới hạn thấp (0x0000) đến giới hạn cao và sau đó quay trở lại từ giới hạn cao đến giới hạn thấp. Nếu chế độ đầu ra bộ tạo xung được đặt thành không đảo, đầu ra OCnx được đặt lại/đặt khi giá trị TCNTn và OCRnx khớp nhau trong quá trình đếm lên/xuống. Nếu chế độ đầu ra đảo ngược được đặt thì ngược lại, trong quá trình đếm trực tiếp, cài đặt sẽ xảy ra và trong khi đếm ngược, đầu ra OCnx sẽ được đặt lại. Tuy nhiên, với hoạt động hai chiều, tần số tối đa của tín hiệuPWM thấp hơn so với hoạt động một chiều, do các đặc điểm như tính đối xứng trong chế độPWM với hoạt động hai chiều, các chế độ này được ưu tiên sử dụng khi giải quyết các vấn đề điều khiển truyền động.

Độ phân giảiPWM ở chế độ này có thể được cố định (8, 9 hoặc 10 bit) hoặc được đặt bằng thanh ghi ICRn hoặc OCRnA. Độ phân giải tối thiểu là 2 bit (ICRn hoặc OCRnA = 0x0003) và tối đa là 16 bit (ICRn hoặc OCRnA = 0xFFFF). Nếu giới hạn trên được chỉ định thì độ phân giảiPWM ở chế độ này được xác định như sau:

Trong chế độ AFC FC, bộ đếm được tăng dần cho đến khi đạt đến một trong các giá trị cố định 0x00FF, 0x01FF hoặc 0x03FF (tương ứng với WGMn3-0 = 0b0001, 0b0010 hoặc 0b0011), cũng như giá trị bằng ICRn (nếu WGMn3- 0 = 0b1010) hoặc OCRnA (nếu WGMn3 :0 = 0b1011). Hơn nữa, khi đạt đến giới hạn trên, bộ đếm sẽ thay đổi hướng đếm. Giá trị TCNTn vẫn ở giới hạn trên trong một chu kỳ đồng hồ hẹn giờ. Sơ đồ định thời cho chế độ PCPW được hiển thị trong Hình 3. Hình này hiển thị chế độ PCPW sử dụng thanh ghi OCRnA hoặc ICRn để đặt giới hạn trên. Trạng thái TCNTn được biểu diễn dưới dạng biểu đồ hàm để minh họa việc đếm hai chiều. Hình vẽ cho thấy cả đầu raPWM không đảo và không đảo. Các đường ngang ngắn biểu thị các điểm trên biểu đồ TCNTn nơi xảy ra sự trùng khớp với giá trị OCRnx. Cờ ngắt OCnx được đặt khi xảy ra sự trùng khớp.

Hình 3 – Sơ đồ định thời cho chế độ AFC FC

Cờ tràn bộ đếm thời gian (TOVn) được đặt bất cứ khi nào bộ đếm đạt đến giới hạn dưới. Nếu thanh ghi OCRnA hoặc ICRn được sử dụng để đặt giới hạn trên thì cờ OCnA hoặc ICFn được đặt tương ứng với cùng xung đồng hồ mà tại đó thanh ghi OCRnx được cập nhật từ thanh ghi đệm (ở đầu bộ đếm). Cờ ngắt có thể được sử dụng để tạo ra ngắt khi bộ đếm đạt đến giới hạn thấp hoặc cao.

Khi thay đổi giá trị của giới hạn đếm trên, bạn phải đảm bảo rằng nó lớn hơn hoặc bằng các giá trị trong tất cả các thanh ghi so sánh. Nếu không, trận đấu giữa TCNTn và OCRnx sẽ không bao giờ xảy ra. Lưu ý rằng khi sử dụng các giá trị đếm trên cố định, các bit không sử dụng sẽ bị xóa về 0 khi ghi vào thanh ghi OCRnx. Chu kỳ thứ ba trong Hình 53 minh họa trường hợp khi có sự thay đổi động trong giới hạn số đếm trên dẫn đến việc tạo ra xung không đối xứng. Tính năng này dựa trên thời gian cập nhật của thanh ghi OCRnx. Vì bản cập nhật OCRnx xảy ra ở đầu bộ đếm nên khoảng thời gianPWM bắt đầu và kết thúc ở đầu bộ đếm. Điều này ngụ ý rằng thời lượng đếm ngược được xác định bởi giá trị giới hạn trên trước đó và thời lượng đếm xuôi được xác định bởi giá trị giới hạn trên mới. Nếu hai giá trị này khác nhau thì thời lượng đếm tiến và đếm lùi cũng sẽ khác nhau. Sự khác biệt về thời lượng dẫn đến sự bất đối xứng của các xung đầu ra.

Nếu nhiệm vụ là thay đổi giới hạn trên trong khi bộ đếm đang chạy thì thay vì chế độ này, nên sử dụng chế độ PFC PFC (hiệu chỉnh pha và tần số). Nếu sử dụng giá trị giới hạn trên tĩnh thì thực tế không có sự khác biệt giữa các chế độ này.

Trong chế độ AFC FC, các đơn vị so sánh cho phép bạn tạo tín hiệuPWM ở các chân OCnx. Nếu bạn đặt COMnx1:0 = 0b10, thì đầu raPWM sẽ không đảo ngược và nếu COMnx1:0=0b11 thì có đảo ngược. Giá trị thực của OCnx có thể được quan sát trên chân cổng nếu thanh ghi hướng dữ liệu cho chân cổng đó được đặt thành hướng đầu ra (DDR_OCnx). Tín hiệu PLC được tạo bằng cách thiết lập (đặt lại) thanh ghi OCnx khi các giá trị của OCRnx và TCNTn khớp nhau trong quá trình đếm ngược và bằng cách đặt lại (đặt lại) thanh ghi OCnx khi có sự trùng khớp giữa OCRnx và TCNTn trong quá trình đếm ngược. Tần số thu được của tín hiệuPWM ở chế độPWM FC ở giới hạn trên (UL) nhất định có thể được tính bằng biểu thức sau:

Việc ghi các giá trị giới hạn vào thanh ghi OCRnx có liên quan đến các trường hợp đặc biệt trong việc tạo tín hiệu điều khiển xung ở chế độ AFC FC. Nếu bạn đặt chế độPWM mà không đảo ngược và đặt OCRnx bằng giới hạn dưới thì đầu ra sẽ liên tục được đặt thành nhật ký. 0 và nếu bằng giới hạn trên thì nhật ký luôn xuất hiện ở đầu ra. 1. Đối với chế độ đảo ngược của xung điện, các mức được chỉ định phải được thay thế bằng các mức ngược lại.

Nếu bạn chỉ định sử dụng OCnA làm giới hạn trên (WGMn3:0 = 0b1011) và đặt COMnA1:0 =0b01, sóng vuông sẽ được tạo ở đầu ra OCnA.

Chế độ điều chế độ rộng xung với hiệu chỉnh pha và tần số (Phase and Frequency Correct)

Chế độ điều chế độ rộng xung với hiệu chỉnh pha và tần số (PWM PFC) (WGMn3-0 = 0b1000 hoặc 0b1001) được thiết kế để tạo ra các xungPWM có độ phân giải cao với hiệu chỉnh pha và tần số. Cũng giống như chế độ AFC FC, chế độ AFC FC dựa trên hoạt động hai chiều của bộ đếm. Bộ đếm quay vòng từ giới hạn thấp (0x0000) đến giới hạn cao và sau đó quay trở lại từ giới hạn cao đến giới hạn thấp. Nếu chế độPWM không đảo được chỉ định, thì đầu ra OCnx sẽ được đặt lại nếu xảy ra khớp giữa TCNTn và OCRnx trong quá trình đếm lên và được đặt nếu khớp xảy ra trong quá trình đếm xuống. Trong chế độ đảo ngược hoạt động là nghịch đảo. Hoạt động hai chiều, so với hoạt động một chiều, có liên quan đến việc tạo ra tần số thấp hơn. Tuy nhiên, do tính đối xứng trong các chế độ điều khiển bằng bộ đếm hai chiều nên việc sử dụng chúng được ưa chuộng hơn trong các nhiệm vụ điều khiển truyền động.

Sự khác biệt chính giữa chế độ AFC FC và chế độ AFC FC là thời điểm thanh ghi OCRnx được cập nhật từ thanh ghi bộ đệm OCRnx (xem Hình 3 và Hình 4).

Độ phân giảiPWM ở chế độ này có thể được đặt bằng thanh ghi ICRn hoặc OCRnA. Độ phân giải tối thiểu là 2 bit (ICRn hoặc OCRnA = 0x0003) và độ phân giải tối đa là 16 bit (ICRn hoặc OCRnA = 0xFFFF). Độ phân giảiPWM tính bằng bit có thể được tính bằng biểu thức sau:

Trong chế độ FCC FCC, bộ đếm được tăng lên cho đến khi khớp với giá trị trong ICRn (WGMn3:0 = 0b1000) hoặc trong OCRnA (WGMn3:0 = 0b1001). Điều này có nghĩa là đạt đến đỉnh của số đếm, sau đó hướng của số đếm sẽ thay đổi. Giá trị của TCNTn vẫn ở đầu số đếm trong một chu kỳ đồng hồ hẹn giờ. Sơ đồ định thời cho chế độ FCC FCC được hiển thị trong Hình 54. Hình này hiển thị chế độ FCC FCC khi đỉnh đếm được thiết lập bởi thanh ghi OCRnA hoặc ICRn. Giá trị TCNTn được hiển thị dưới dạng biểu đồ hàm để minh họa quá trình đếm hai chiều. Sơ đồ hiển thị cả đầu raPWM không đảo và không đảo. Các đường ngang ngắn biểu thị các điểm trên biểu đồ TCNTn nơi xảy ra sự trùng khớp giữa OCRnx và TCNTn. Cờ ngắt OCnx được đặt sau khi xảy ra sự trùng khớp.

Hình 4 - Sơ đồ định thời của chế độPWM với hiệu chỉnh pha và tần số

Cờ tràn bộ đếm thời gian (TOVn) được đặt ở cùng chu kỳ xung nhịp khi các thanh ghi được cập nhật với giá trị từ thanh ghi đệm (ở giới hạn đếm thấp hơn). Nếu thanh ghi OCRnA hoặc ICRn được sử dụng để đặt giới hạn trên thì khi bộ đếm đạt đến giới hạn trên, cờ OCnA hoặc ICFn sẽ được đặt tương ứng. Cờ ngắt có thể được sử dụng để tạo ra ngắt khi bộ đếm đạt đến giới hạn cao hoặc thấp.

Khi thay đổi giới hạn trên, bạn phải đảm bảo rằng giá trị mới lớn hơn hoặc bằng các giá trị trong tất cả các thanh ghi ngưỡng so sánh. Mặt khác, nếu giới hạn trên được đặt thành giá trị nhỏ hơn bất kỳ giá trị nào trong thanh ghi ngưỡng so sánh, thì sự trùng khớp giữa TCNTn và OCRnx sẽ không bao giờ xảy ra.

Hình 4 cho thấy, không giống như chế độ AFC FC, tín hiệu đầu ra được tạo ra là đối xứng ở mọi chu kỳ. Vì các thanh ghi OCRnx được cập nhật ở giới hạn đếm thấp hơn nên khoảng thời gian đếm tiến và đếm lùi luôn bằng nhau. Kết quả là các xung đầu ra có hình dạng đối xứng và do đó có tần số được điều chỉnh.

Nên sử dụng thanh ghi ICRn để đặt giới hạn trên nếu giá trị giới hạn trên là hằng số. Trong trường hợp này, thanh ghi OCRnA cũng được giải phóng để điều chế độ rộng xung của các xung ở chân OCnA. Tuy nhiên, nếu bạn cần thay đổi động tần sốPWM bằng cách thay đổi giới hạn trên thì nên sử dụng thanh ghi OCRnA để đặt giới hạn trên do bộ đệm kép của nó.

Ở chế độPWM, các đơn vị so sánh cho phép bạn tạo ra các xungPWM ở chân OCnx. Nếu COMnx1:0 = 0b10 thì đầu raPWM không đảo được đặt và nếu COMnx1:0=0b11 thì đầu ra có đảo ngược (xem bảng 60). Giá trị OCnx sẽ chỉ xuất hiện trên chân cổng tương ứng nếu nó được đặt ở hướng đầu ra. Tín hiệuPWM được tạo bằng cách thiết lập (đặt lại) thanh ghi OCnx trên sự trùng khớp giữa OCRnx và TCNTn trong quá trình đếm ngược và đặt lại (cài đặt) thanh ghi OCnx trên sự trùng khớp giữa OCRnx và TCNTn trong quá trình đếm ngược. Tần sốPWM ở chế độ này với giới hạn đếm trên (UP) nhất định được xác định như sau:

Trong đó N là hệ số chia của bộ đếm gộp trước (1, 8, 32, 64, 128, 256 hoặc 1024).

Việc ghi các giá trị giới hạn vào thanh ghi OCRnx có liên quan đến các trường hợp đặc biệt trong quá trình tạo tín hiệu xung ở chế độ này. Nếu bạn đặt OCRnx bằng giới hạn dưới (0x0000) thì ở chế độ không đảo, đầu ra sẽ liên tục có mức logic thấp và khi ghi giá trị bằng giới hạn trên, đầu ra sẽ có mức logic cao cho một thời gian dài. Ở chế độ đảo ngược, các mức đã cho sẽ ngược lại.

Nếu OCRnA được sử dụng để đặt giới hạn trên (WGMn3:0 = 0b1001) và COMnA1:0 = 0b01, thì sóng vuông sẽ được tạo ở đầu ra OCnA.

Việc triển khai phần cứng củaPWM mang lại những lợi thế chắc chắn so với phần mềm, vì nó giúp bộ xử lý giảm bớt cả mã và thời gian không cần thiết, cồng kềnh cho việc bảo trì, đồng thời cũng mang lại nhiều cơ hội hơn để sử dụng công việc vớiPWM. Chỉ cần khởi tạo bộ định thời/bộ đếm (nhập các giá trị cần thiết vào các thanh ghi được bộ định thời/bộ đếm sử dụng) là đủ và bộ định thời/bộ đếm có thể hoạt động độc lập với bộ xử lý; theo đó, bộ xử lý có thể xử lý các tác vụ khác, chỉ thỉnh thoảng liên lạc vào thời điểm cần thiết để điều chỉnh hoặc thay đổi chế độ hoặc lấy kết quả từ bộ đếm thời gian/bộ đếm.

Mô tả cờ ngắt

T1 có thể tạo ra ngắt khi:

  1. thanh ghi truy cập TCNT1 tràn;
  2. nếu thanh ghi đếm TCNT1 và thanh ghi so sánh OCR1A và OCR1B bằng nhau (riêng cho từng thanh ghi);
  3. trong khi lưu trữ thanh ghi đếm trong thanh ghi chụp ICR1.

T2 có thể tạo ra ngắt khi:

  1. tràn thanh ghi bộ đếm TCNT2;
  2. khi thanh ghi đếm TCNT2 và thanh ghi so sánh OCR2 bằng nhau.

Cờ của tất cả các ngắt nằm trong thanh ghi TIFR và việc bật/tắt ngắt nằm trong thanh ghi TIMSK.

Bit thanh ghi TIMSK
Đăng ký7 6 5 4 3 2 1 0
TIMSK OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2- Cờ cho phép ngắt cho sự kiện “khớp” của bộ định thời/bộ đếm T2
  • TOIE2- Cờ cho phép ngắt tràn bộ định thời/bộ đếm T2
  • TICIE1- Cờ cho phép ngắt cho sự kiện “bắt” của bộ định thời/bộ đếm T1
  • OCIE1A- Cờ cho phép ngắt cho sự kiện “khớp A” của bộ định thời/bộ đếm T1
  • OCIE1B- Cờ cho phép ngắt đối với sự kiện “khớp B” của bộ định thời/bộ đếm T1
  • TOIE1- Cờ cho phép ngắt tràn bộ định thời/bộ đếm T1
  • OCIE0*- Cờ cho phép ngắt cho sự kiện “trùng hợp” của bộ định thời/bộ đếm T0 (* - không có trong ATmega8)
  • TOIE0- Cờ cho phép ngắt tràn bộ định thời/bộ đếm T0
  • OCF2- Cờ ngắt cho sự kiện “trùng hợp” của bộ định thời/bộ đếm T2
  • TOV2- Cờ ngắt tràn bộ định thời/bộ đếm T2
  • ICF1- Cờ ngắt cho sự kiện bắt giữ của bộ định thời/bộ đếm T1
  • OCF1A- Cờ ngắt cho sự kiện “trùng hợp A” của bộ định thời/bộ đếm T1
  • OCF1B- Cờ ngắt cho sự kiện “trùng hợp B” của bộ định thời/bộ đếm T1
  • TOV1- Cờ ngắt tràn bộ định thời/bộ đếm T1
  • OCF0- Cờ ngắt cho sự kiện “trùng hợp” của bộ định thời/bộ đếm T0
  • TOV0- Cờ ngắt tràn bộ định thời/bộ đếm T0

Mô tả hoạt động của bộ định thời/bộ đếm T1 trong bộ điều khiển ATmega8/16

Bộ định thời/bộ đếm 16 bit T1 có thể được sử dụng để tạo ra các khoảng thời gian, đếm số lượng tín hiệu bên ngoài và tạo ra các tín hiệuPWM với các chu kỳ và khoảng thời gian làm việc khác nhau trên các chân OC1A và OC1B. Ngoài ra, bằng tín hiệu bên ngoài từ chân ICP1 hoặc từ bộ so sánh tương tự, T1 có thể lưu trạng thái hiện tại của nó vào một thanh ghi chụp riêng ICR1.

Đăng ký bit TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Đăng ký7 6 5 4 3 2 1 0
TCCR1A COM1A1 COM1A0 COM1B1 COM1BO FOC1A FOC1B WGM11 WGM10
TCCR1B ICNC1 ICES1 * WGM13 WGM12 CS12 CS11 CS10
TCNT1:H R/W R/W R/W R/W R/W R/W R/W R/W
TCNT1:L R/W R/W R/W R/W R/W R/W R/W R/W
OCR1A:H R/W R/W R/W R/W R/W R/W R/W R/W
OCR1A:L R/W R/W R/W R/W R/W R/W R/W R/W
OCR1B:H R/W R/W R/W R/W R/W R/W R/W R/W
OCR1B:L R/W R/W R/W R/W R/W R/W R/W R/W
ICR1:H R/W R/W R/W R/W R/W R/W R/W R/W
ICR1:L R/W R/W R/W R/W R/W R/W R/W R/W

Mỗi thanh ghi 16 bit được đặt vật lý trong hai thanh ghi 8 bit, vì vậy khi đọc một mục vào chúng, phải thực hiện hai thao tác. Khi ghi, byte cao được tải trước, sau đó là byte thấp; khi đọc thì ngược lại, byte thấp được đọc trước, sau đó là byte cao.

TCCR1A:TCCR1B- Thanh ghi điều khiển bộ định thời/bộ đếm 8 bit T1

TCNT1- Thanh ghi định thời/bộ đếm 16 bit T1. Tùy thuộc vào chế độ vận hành, nội dung của thanh ghi này sẽ bị xóa, tăng (giá trị tăng lên 1) hoặc giảm (giá trị giảm đi 1) cho mỗi xung của tín hiệu đồng hồ hẹn giờ/bộ đếm.

OCR1A:OCR1B- Thanh ghi so sánh 16-bit

ICR1- Thanh ghi chụp 16 bit, lưu trữ giá trị TCNT1 khi cạnh tín hiệu hoạt động được cấp vào chân ICP1 hoặc bằng tín hiệu từ bộ so sánh.

gán bit

COM1A1:COM1A0:COM1B1:COM1B0- Các bit này xác định hoạt động của chân OC1A:OC1B khi giá trị của thanh ghi đếm TCNT1 và thanh ghi so sánh OCR1A:OCR1B khớp nhau

FOC1A:FOC1B- Các bit này được sử dụng để buộc thay đổi trạng thái của chân OC1A:OC1B

ICNC1- Bit điều khiển mạch nhiễu, nếu bit là “0” thì việc bắt sẽ ở cạnh hoạt động đầu tiên, nếu là “1” thì việc bắt sẽ ở sau mẫu thứ tư giống hệt của tín hiệu bắt.

ICES1- Bit chọn cạnh tích cực của tín hiệu, nếu giá trị là “0” thì việc lưu thanh ghi đếm TCNT1 trong thanh ghi bắt OCR1 sẽ nằm trên cạnh xuống của tín hiệu, nếu “1” ở cạnh lên.

WGM13:WGM12:WGM11:WGM10- Các bit này xác định chế độ hoạt động của bộ định thời/bộ đếm T1

CS22:CS21:C20- Các bit xác định nguồn tín hiệu xung clock/counter T1.

Lựa chọn chế độ hoạt động của bộ đếm thời gian/bộ đếm T1
WGM13WGM12WGM11WGM10Chế độ hoạt độngMô-đun tài khoản (TOP)
0 0 0 0 Bình thường $FFFF
0 0 0 1 Pha đúng pha

8 bit

$00FF
0 0 1 0 Pha đúng pha

9-bit

$01FF
0 0 1 1 Pha đúng pha

10-bit

$03FF
0 1 0 0 CTC (đặt lại khi trận đấu) OCR1A
0 1 0 1 nhanh chóng

8 bit

$00FF
0 1 1 0 nhanh chóng

9-bit

$01FF
0 1 1 1 nhanh chóng

10-bit

$03FF
1 0 0 0 ICR1
1 0 0 1 Đúng pha và tần sốPWM OCR1A
1 0 1 0 Pha đúng pha ICR1
1 0 1 1 Pha đúng pha OCR1A
1 1 0 0 CTC (đặt lại khi trận đấu) ICR1
1 1 0 1 Kín đáo *
1 1 1 0 nhanh chóng ICR1
1 1 1 1 nhanh chóng OCR1A

Chọn nguồn đồng hồ

Chế độ bình thường

Chế độ hoạt động đơn giản nhất là T1. Đối với mỗi xung của tín hiệu đồng hồ, thanh ghi đếm TCNT1 được tăng lên (giá trị tăng thêm 1). Khi truyền qua giá trị $FFFF của mô-đun đếm (TOP), lỗi tràn xảy ra và chu kỳ xung nhịp tiếp theo bắt đầu đếm từ giá trị $0000, cùng lúc đó cờ TOV1=1 được đặt trong thanh ghi TIFR và một ngắt có thể được tạo nếu cờ TOIE1=1 được đặt trong thanh ghi TIMSK. Để tạo tín hiệu có tần số nhất định trong chế độ này, cần phải ghi vào các bit COM1A1=0:COM1A0=1 cho đầu ra OC1A hoặc COM1B1=0:COM1B0=1 cho đầu ra OC1B của bộ điều khiển.

Ngoài ra, đối với mỗi chu kỳ xung nhịp, một sự so sánh được thực hiện giữa thanh ghi đếm TCNT1 và thanh ghi so sánh OCR1A:OCR1B; nếu có sự trùng khớp, cờ ngắt OCF1A=1:OCF1B=1 được đặt và nếu bit OCIE1A=1 :OCIE1B=1 của thanh ghi TIMSK, một ngắt được tạo ra. Đồng thời, trạng thái của chân OC1A:OC1B có thể được thay đổi tùy thuộc vào cài đặt của các bit COM1A1:COM1A0:COM1B1:COM1B0.

Chế độ CTC (đặt lại khi trận đấu)

Ở chế độ này, T1 hoạt động theo nguyên tắc tương tự như ở chế độ Bình thường. Sự khác biệt là giá trị tối đa có thể có của thanh ghi đếm TCNT1 bị giới hạn bởi giá trị của thanh ghi so sánh OCR1A hoặc ICR1 (xem bảng lựa chọn chế độ bộ đếm thời gian/bộ đếm). Khi TCNT1 đạt giá trị OCR1A hoặc ICR1 thì giá trị của TCNT1 được reset về TCNT1=$0000. Đồng thời, cờ TOV1=1 được đặt COM1A1:COM1A0:COM1B1:COM1B0 Xác định hành vi của chân OC1A:OC1B khi có một trận đấu.

Chế độPWM nhanh (PWM nhanh)

Sử dụng chế độ này, bạn có thể tạo tín hiệu tần số cao. Nguyên lý và quy trình hoạt động không khác với chế độ Bình thường, ngoại trừ sự hiện diện của bộ đệm đôi của thanh ghi OCR1A:OCR1B, giúp loại bỏ sự xuất hiện của các xung tín hiệu không đối xứng và cũng khác về hoạt động của các chân OC1A:OC1B ( xem bảng).


Chế độ điều chỉnh pha đúng pha

Sự khác biệt giữa chế độ này và các chế độ trước đó là thanh ghi đếm hoạt động như một bộ đếm ngược. Vì chế độ này được Atmel khuyến nghị là phù hợp nhất để điều chỉnh động cơ nên chúng tôi sẽ xem xét nó chi tiết hơn. Khi thanh ghi đếm TCNT1 đạt đến giá trị của mô đun đếm (TOP) (hoặc giá trị của thanh ghi ICR1 hoặc giá trị của thanh ghi OCR1A, xem bảng lựa chọn chế độ hẹn giờ/bộ đếm), hướng đếm sẽ thay đổi. Khi thanh ghi đếm TCNT1 đạt giá trị nhỏ nhất ($0000), hướng đếm cũng thay đổi và đồng thời cờ ngắt TOV1 của thanh ghi TIFR được đặt. Ngoài ra, nếu nội dung của thanh ghi đếm TCNT1 và thanh ghi so sánh OCR1A:OCR1B bằng nhau thì cờ OCF1A:OCF1B của thanh ghi TIFR được đặt và trạng thái của đầu ra OC1A:OC1B thay đổi theo bảng.

Để tránh phát xạ không đối xứng khi ghi một giá trị vào thanh ghi OCR1A:OCR1B, tính năng đệm ghi kép được triển khai ở chế độ này. Nhờ đó, sự thay đổi thực tế của giá trị thanh ghi thay đổi tại thời điểm thanh ghi bộ đếm TCNT1 đạt đến giá trị của mô đun đếm (TOP) (hoặc giá trị của thanh ghi ICR1 hoặc giá trị thanh ghi OCR1A, xem phần lựa chọn chế độ bộ đếm thời gian/bộ đếm bàn). Do đó, ngay từ đầu, khi bộ đếm thời gian/bộ đếm được khởi tạo, chân OC1A:OC1B sẽ không thay đổi trạng thái khi khớp cho đến khi thanh ghi đạt giá trị (TOP).

Nhiệm vụ: Chúng ta hãy phát triển một chương trình điều khiển độ sáng của đèn sợi đốt 12 Volt bằng cách sử dụng phương pháp điều khiển xung điện xung lực. Khi bạn nhấn nút “Thêm”, độ sáng của đèn sẽ tăng lên và khi bạn nhấp vào nút “Ít hơn”, độ sáng sẽ giảm đi. Sơ đồ của thiết bị tương lai của chúng tôi được hiển thị trong hình. Như thường lệ, chúng tôi sử dụng bộ vi điều khiển Atmega8, bộ vi điều khiển này sẽ được tạo xung nhịp từ bộ tạo dao động bên trong với tần số 4 MHz. Trên thực tế, chúng ta sẽ có một bộ điều chỉnh độ sáng; những thiết bị này được thiết kế để điều chỉnh độ sáng của các thiết bị chiếu sáng. Ngày nay, đèn LED điều chỉnh độ sáng là phổ biến nhất.

Để đơn giản, bạn cũng có thể kết nối một đèn LED với mạch của chúng tôi, nhưng nó sẽ rõ ràng hơn với bóng đèn. Các nút được kết nối với chân PD0, PD1. Chúng tôi kết nối tải với đầu ra PB1(OC1A) thông qua một điện trở và một bóng bán dẫn hiệu ứng trường MOSFET, nó sẽ hoạt động như một chiếc chìa khóa cho chúng ta (ở chế độ chuyển mạch). Bóng bán dẫn hiệu ứng trường được ưa chuộng hơn vì cổng của nó được cách ly với mạch điện và được điều khiển bằng điện trường, đồng thời dòng điện điều khiển đạt tới microamp. Điều này cho phép, bằng cách sử dụng một hoặc hai bóng bán dẫn, để điều khiển một tải công suất cực lớn (lên đến hàng chục ampe và hàng chục hoặc hàng trăm vôn) mà không cần tải bộ vi điều khiển. Cũng tính đến thực tế là các bóng bán dẫn hiệu ứng trường có thể được kết nối song song (không giống như các bóng bán dẫn lưỡng cực), có thể thu được một dòng thậm chí còn mạnh hơn hàng trăm ampe.

Bây giờ chúng ta hãy tìm hiểu cách bộ vi điều khiển thực hiện điều khiển xung điện và viết chương trình. Như đã đề cập trước đó, MK của chúng tôi có 3 bộ hẹn giờ và tất cả chúng đều có thể hoạt động ở chế độPWM. Chúng ta sẽ làm việc với bộ định thời/bộ đếm 16 bit. Chút ít WGM13-10 hãy định cấu hình bộ hẹn giờ của chúng tôi để hoạt động FastPWM với giới hạn số lượng trên ICR1. Nguyên tắc của chương trình là thế này: bộ đếm thời gian của chúng tôi đếm từ 0 đến 65535(0xFFFF), vào thanh ghi ICR1 Hãy nhập số 255, đây sẽ là giới hạn trên của bộ đếm thời gian (TOP), tần số của tín hiệu Xung điều khiển sẽ không đổi. Ngoài ra, bộ hẹn giờ của chúng tôi được cấu hình sao cho nếu thanh ghi đếm và thanh ghi so sánh khớp nhau (TCNT1 = OCR1A), đầu ra của bộ điều khiển sẽ chuyển đổi OC1A. Chu kỳ nhiệm vụ củaPWM có thể được thay đổi bằng cách ghi vào thanh ghi so sánh OCR1A một số nhất định từ 0 đến 255, số này càng lớn thì hệ số lấp đầy càng lớn thì đèn sẽ cháy càng sáng. Tùy thuộc vào nút nào được nhấn, biến sẽ thay đổi Tôi, và sau đó nó được ghi vào sổ đăng ký OCR1A.

Toàn văn chương trình được trình bày dưới đây. Các ý kiến ​​​​mô tả hoạt động của chương trình chi tiết hơn.

/***Bài số 8. Tạo tín hiệuPWM***/ #include #bao gồm int main(void) ( unsigned int i=0; //xác định biến i /***Cấu hình các cổng I/O***/ PORTB = 0x00; DDRB |= (1<< PB1); PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы DDRD = 0x00; /***Настройка таймера***/ TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1 |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя TCNT1 = 0x00; // начальная установка счетчика ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255, // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz OCR1A = 0x00; // начальный коэффициент заполнения ШИМ /***Основной цикл программы***/ while(1) { if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата { if (i < 254) { // коэффициент заполнения ШИМ изменяется от 0 до 255 i=i+1; // увеличиваем i на единицу OCR1A = i; // записываем переменную в регистр сравнения _delay_ms(30); // задержка 30ms } } if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата { if (i >0) // Chu kỳ nhiệm vụ của CPU thay đổi từ 255 thành 0 ( i--; // giảm i đi một (bạn cũng có thể viết cái này) OCR1A = i; // ghi một biến vào thanh ghi so sánh _delay_ms(30); // độ trễ 30ms ) ) ) )

Chú ý!Đầu tiên, chúng ta cấp nguồn cho vi điều khiển, sau đó bạn cần đảm bảo rằng bóng bán dẫn được kết nối với chân MK, sau đó chỉ cấp nguồn cho mạch có đèn và bóng bán dẫn hiệu ứng trường. Nếu không bạn có thể đốt cháy bóng bán dẫn. Thực tế là khi tắt, “chân” của MK “lủng lẳng trong không trung” - chúng không được kết nối với bất cứ thứ gì và xảy ra hiện tượng nhiễu trên chúng. Những giao thoa yếu này đủ để mở một phần bóng bán dẫn hiệu ứng trường rất nhạy. Sau đó, điện trở giữa cực máng và nguồn sẽ giảm từ vài MOhm xuống vài Ohms hoặc một phần Ohms và một dòng điện lớn sẽ chạy qua nó đến đèn. Nhưng bóng bán dẫn sẽ không mở hoàn toàn, vì để làm được điều này, bạn cần áp dụng nhiễu không phải 1-3 V vào cổng mà là 5 V ổn định và điện trở của nó sẽ lớn hơn nhiều so với mức tối thiểu. Điều này sẽ dẫn đến việc tỏa một lượng nhiệt lớn lên nó, nó sẽ bốc khói và có thể cháy.