Mục lục:

Cách diễn giải hướng quay từ công tắc quay kỹ thuật số với PIC: 5 bước
Cách diễn giải hướng quay từ công tắc quay kỹ thuật số với PIC: 5 bước

Video: Cách diễn giải hướng quay từ công tắc quay kỹ thuật số với PIC: 5 bước

Video: Cách diễn giải hướng quay từ công tắc quay kỹ thuật số với PIC: 5 bước
Video: Dựng phim cơ bản - 5 tip ai cũng cần 2024, Tháng bảy
Anonim
Cách diễn giải hướng quay từ công tắc quay kỹ thuật số với PIC
Cách diễn giải hướng quay từ công tắc quay kỹ thuật số với PIC

Mục tiêu của Tài liệu hướng dẫn này là minh họa cách giao tiếp công tắc xoay kỹ thuật số (được mã hóa vuông góc) với bộ vi điều khiển. Đừng lo lắng, tôi sẽ giải thích ý nghĩa của mã hóa vuông góc cho chúng ta. Giao diện này và phần mềm đi kèm sẽ cho phép bộ vi điều khiển nhận biết hướng quay cho mỗi lần di chuyển từ chốt này sang chốt khác. Gần đây tôi đã sử dụng loại công tắc này trong một dự án vi điều khiển yêu cầu nhập điểm đặt áp suất bằng núm vặn 16 detents thay vì nút lên / xuống. Ý tưởng là cho phép người dùng "quay số" áp suất mong muốn. Do đó, chúng tôi phải phát triển một quy trình phần mềm để lấy thông tin vị trí từ công tắc và suy ra hướng quay để tăng hoặc giảm điểm đặt áp suất cho hệ thống chính. đến bộ vi điều khiển, lý thuyết hoạt động cho công tắc xoay, lý thuyết hoạt động cho phần mềm cũng như quy trình khấu trừ. Cuối cùng, tôi sẽ chỉ cho bạn ứng dụng của tôi về quy trình khấu trừ. Khi chúng tôi tiến bộ, tôi sẽ cố gắng giữ mọi thứ hơi chung chung để ý tưởng có thể được áp dụng trên nhiều nền tảng nhất có thể nhưng tôi cũng sẽ chia sẻ những gì tôi đã làm để bạn có thể xem một ứng dụng cụ thể.

Bước 1: Các bộ phận

Các bộ phận
Các bộ phận

Để thực hiện điều này, bạn sẽ cần: Một công tắc xoay (được mã hóa theo phương vuông góc) Kéo điện trở lên Nền tảng vi điều khiển phù hợp Đối với dự án của tôi, tôi đã sử dụng bộ mã hóa quang Grayhill 61C22-01-04-02. Bảng dữ liệu cho công tắc xoay gọi điện trở kéo lên 8,2k ohm trên hai đường dữ liệu đến từ công tắc. Bạn sẽ muốn kiểm tra bảng dữ liệu cho bộ mã hóa mà bạn chọn sử dụng. Công tắc xoay tôi đã sử dụng cũng có thể được đặt hàng với công tắc nút nhấn hướng trục. Đó là một tính năng hữu ích để thực hiện các lựa chọn đã được quay số, v.v. nhưng tôi sẽ không thảo luận về giao diện của nó ở đây. Tôi đã liệt kê "nền tảng vi điều khiển phù hợp" vì (tôi nghĩ) điều này có thể được triển khai trên nhiều nền tảng. Tôi đã thấy rất nhiều người sử dụng các bộ vi điều khiển khác cho Sách hướng dẫn nên tôi cũng muốn đưa ra cách tiếp cận chung. Tôi đã viết tất cả mã trong PIC Basic Pro để sử dụng với Microchip PIC16F877A. Thực sự, điều quan trọng mà bạn cần trên vi điều khiển là khả năng ngắt khi có sự thay đổi logic trên một trong hai chân. Trên PIC16F877A, đây được gọi là ngắt thay đổi PORTB. Có thể có các tên khác cho nó trên các bộ điều khiển khác. Tính năng ngắt của vi điều khiển này là một phần của những gì làm cho việc triển khai này trở nên thanh lịch.

Bước 2: Giao diện phần cứng

Giao diện phần cứng
Giao diện phần cứng

Một giải pháp "đơn giản" sẽ là có một công tắc "đơn cực-16 ném" với 16 kết nối với bộ vi điều khiển. Sau đó, mỗi đầu ra công tắc sẽ được gắn vào một chân trên bộ vi điều khiển để vi điều khiển có thể kiểm tra mọi vị trí quay số. Đây là việc sử dụng quá nhiều chân I / O. Mọi thứ thậm chí còn tồi tệ hơn nếu chúng ta muốn có hơn 16 vị trí (detents) cho chúng ta trên công tắc. Mỗi vị trí bổ sung trên công tắc sẽ yêu cầu một đầu vào bổ sung cho bộ vi điều khiển. Điều này nhanh chóng trở thành một cách sử dụng đầu vào rất kém hiệu quả trên một bộ vi điều khiển. Chỉ có bốn mức logic khả thi mà các dòng này có thể nhận: AB = 00, 01, 10 và 11. Điều này làm giảm đáng kể số lượng dòng đầu vào mà bạn phải sử dụng khi kết nối công tắc với bộ vi điều khiển. Vì vậy, chúng tôi đã giảm số lượng dòng đầu vào xuống chỉ còn hai. Giờ thì sao? Có vẻ như chúng ta thực sự cần 16 trạng thái khác nhau nhưng công tắc mới này chỉ có bốn. Chúng ta đã tự bắn vào chân mình chưa? Không. Đọc tiếp. Chúng tôi sẽ trình bày một chút lý thuyết đằng sau hoạt động của công tắc xoay để giải thích.

Bước 3: Lý thuyết phần cứng về hoạt động

Lý thuyết phần cứng về hoạt động
Lý thuyết phần cứng về hoạt động
Lý thuyết phần cứng về hoạt động
Lý thuyết phần cứng về hoạt động
Lý thuyết phần cứng về hoạt động
Lý thuyết phần cứng về hoạt động

Có thể cảm nhận hướng quay bằng cách sử dụng công tắc "đơn cực-16 ném" đã nói ở trên nhưng nó sử dụng rất nhiều đầu vào trên bộ vi điều khiển. Sử dụng công tắc xoay làm giảm số lượng đầu vào cho bộ vi điều khiển nhưng bây giờ chúng ta cần giải thích các tín hiệu đến từ công tắc và dịch chúng sang hướng quay. Tôi đã đề cập trước đó rằng công tắc được mã hóa cầu phương. Đây cũng là một trong những nét thanh lịch chính trong giải pháp này. Điều này có nghĩa là có một mã 2 bit mà công tắc cung cấp tương ứng với vị trí của công tắc. Bạn có thể đang nghĩ: "Nếu có một đầu vào hai bit cho bộ vi điều khiển, làm thế nào để chúng ta đại diện cho tất cả 16 vị trí?" Đó là một câu hỏi hay. Chúng tôi không đại diện cho tất cả. Chúng ta chỉ cần biết các vị trí tương đối của núm là có thể xác định được chiều quay. Vị trí tuyệt đối của núm là không liên quan. Đối với quay theo chiều kim đồng hồ, mã mà công tắc cung cấp lặp lại sau mỗi bốn lần tách và được mã hóa màu xám. Mã màu xám có nghĩa là chỉ có một bit thay đổi cho mỗi lần thay đổi vị trí. Thay vì đầu vào AB đếm ngược để quay theo chiều kim đồng hồ trong hệ nhị phân như sau: 00, 01, 10, 11, nó thay đổi như thế này: 00, 10, 11, 01. Lưu ý rằng đối với mẫu sau, chỉ có một đầu vào thay đổi giữa các bộ. Các giá trị ngược chiều kim đồng hồ cho đầu vào AB vào bộ vi điều khiển sẽ giống như sau: 00, 01, 11, 10. Đây chỉ đơn giản là ngược chiều kim đồng hồ với AB = 00 được liệt kê trước. Hãy xem sơ đồ để giải thích trực quan hơn..

Bước 4: Lý thuyết về hoạt động của phần mềm

Lý thuyết về hoạt động của phần mềm
Lý thuyết về hoạt động của phần mềm

Quy trình suy ra hướng quay được điều khiển gián đoạn. Bộ vi điều khiển mà bạn chọn cần có khả năng ngắt bất kỳ lúc nào có sự thay đổi trên một trong hai (ít nhất) hai chân khi ngắt được bật. Đây được gọi là ngắt thay đổi PORTB trên PIC16F877A. Bất cứ khi nào công tắc được xoay, bộ vi điều khiển sẽ bị ngắt và việc thực thi chương trình sẽ được gửi đến Quy trình Dịch vụ Ngắt (ISR). ISR sẽ nhanh chóng tìm ra cách xoay công tắc, đặt cờ thích hợp và nhanh chóng quay trở lại chương trình chính. Chúng tôi cần điều này xảy ra nhanh chóng trong trường hợp người dùng xoay công tắc rất nhanh. Chú ý rằng trong một chu kỳ bốn vị trí, có bốn cạnh. Một cạnh tăng và một cạnh giảm cho đầu vào A cũng như đầu vào B. Bộ vi xử lý sẽ bị ngắt mỗi khi có một cạnh có nghĩa là bộ vi điều khiển sẽ bị ngắt bất kỳ khi nào xoay núm xoay. Do đó, ISR cần tìm ra cách xoay núm. Để giúp chúng tôi tìm ra cách thực hiện việc này, chúng tôi chuyển sang dạng sóng để quay theo chiều kim đồng hồ. Chú ý rằng bất kỳ lúc nào A có một cạnh, giá trị mới của nó luôn khác với B. Khi núm xoay đi từ vị trí 1 đến 2, A chuyển từ logic-0 sang logic-1. B vẫn là 0 đối với quá trình chuyển đổi này và không khớp với giá trị mới của A. Khi núm xoay đi từ vị trí 3 đến 4, A có một cạnh rơi trong khi B vẫn ở mức logic-1. Lưu ý một lần nữa, rằng B và giá trị mới của A là khác nhau. Ngay bây giờ, chúng ta có thể thấy rằng bất kỳ lúc nào A gây ra ngắt trong quá trình quay theo chiều kim đồng hồ, giá trị mới của nó sẽ khác với giá trị của B. Hãy kiểm tra B để xem điều gì sẽ xảy ra. B có cạnh lên khi công tắc chuyển từ vị trí 2 sang 3. Ở đây, giá trị mới của B bằng A. Nhìn cạnh cuối cùng còn lại để quay theo chiều kim đồng hồ, B có cạnh xuống chuyển từ vị trí 4 đến 5. (Vị trí 5 giống với vị trí 1.) Giá trị mới của B cũng giống như A ở đây! Bây giờ chúng tôi có thể thực hiện một số khấu trừ! Nếu A gây ra ngắt và giá trị mới của A khác với giá trị của B, thì vòng quay sẽ theo chiều kim đồng hồ. Ngoài ra, nếu B gây ra ngắt và giá trị mới của B giống với A, thì chuyển động quay theo chiều kim đồng hồ. Hãy nhanh chóng kiểm tra trường hợp quay ngược chiều kim đồng hồ. Cũng giống như quay theo chiều kim đồng hồ, xoay ngược chiều kim đồng hồ sẽ gây ra bốn lần ngắt trong một chu kỳ: hai lần cho đầu vào A và hai cho đầu vào B. Đầu vào A có một cạnh tăng khi núm xoay chuyển từ vị trí 4 sang 3 và một cạnh xuống di chuyển từ vị trí 2 sang 1 Khi núm xoay chuyển từ vị trí 4 sang vị trí 3, giá trị mới của A bằng giá trị của B. Chú ý rằng khi A chuyển từ vị trí 2 sang 1 giá trị mới của nó cũng giống như giá trị của B. Bây giờ, chúng ta có thể thấy rằng khi A gây ra ngắt và giá trị mới của nó khớp với giá trị của B thì vòng quay ngược chiều kim đồng hồ. Nhanh chóng, chúng tôi sẽ xem xét đầu vào B để xác minh mọi thứ. B sẽ gây ra ngắt khi núm xoay chuyển từ vị trí 5 (giống với 1) sang 4 và khi núm chuyển từ vị trí 3 sang 2. Trong cả hai trường hợp này, giá trị mới của B không khớp với giá trị hiện có của A là trường hợp ngược lại với trường hợp B gây ra ngắt cho quay theo chiều kim đồng hồ. Đây là một tin tốt. Tóm lại, nếu A gây ra ngắt và giá trị mới của nó không khớp với giá trị của B hoặc nếu B gây ra ngắt và giá trị mới của B khớp với giá trị của A thì chúng ta biết rằng có sự quay theo chiều kim đồng hồ. Chúng ta có thể kiểm tra các trường hợp khác để xem quay ngược chiều kim đồng hồ trong phần mềm hoặc chúng ta có thể giả định rằng vì nó không quay theo chiều kim đồng hồ nên nó đã quay ngược chiều kim đồng hồ. Thói quen của tôi chỉ đơn giản là thực hiện giả định.

Bước 5: Phần mềm

Phần mềm
Phần mềm
Phần mềm
Phần mềm

Tôi đã không sử dụng các ngắt tích hợp trong PIC Basic Pro. Tôi đã sử dụng một vài tệp mà tôi đã đưa vào mã của mình từ Darrel Taylor để thúc đẩy quy trình. Đây là nơi ghi công lớn cho Darrel! Các tập tin là miễn phí. Chỉ cần truy cập trang web của anh ấy để biết thêm thông tin, các ứng dụng khác và tải xuống các tệp. Bạn có thể bỏ qua phần này nếu bạn không sử dụng PIC với ngắt Darrel Taylor. Chỉ cần thiết lập ngắt khi cần thiết trên nền tảng bạn đang sử dụng. Để thiết lập ngắt Darrel Taylor (DT), có hai việc cần làm: 1.) Bao gồm các tệp DT_INTS-14.bas và ReEnterPBP.bas trong code.2.) Sao chép và dán mã này vào macro code. ASMINT_LIST của bạn; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, yes endm INT_CREATEENDASChèn các tab và khoảng trắng như hình ảnh ở cuối Có thể hướng dẫn để bạn có thể xem mọi thứ dễ dàng hơn một chút trong mã của mình. Bạn sẽ cần sửa đổi một chút để phù hợp với nhu cầu của mình. Trong Nhãn, thay thế ISR bằng tên của chương trình con là ISR của bạn. Đừng quên gạch dưới! Bạn cần nó! Để ngắt hoạt động, có hai việc nữa phải làm: 1.) Viết ISR. Bạn sẽ viết điều này giống như bạn sẽ viết một chương trình con PBP ngoại trừ việc bạn sẽ cần phải chèn @ INT_RETURN vào cuối chương trình con thay vì RETURN. Điều này sẽ xác nhận việc thực thi ngắt và đưa chương trình trở về vị trí mà nó đã dừng lại trong vòng lặp chính. Bên trong ISR, bạn cần xóa cờ ngắt để chương trình của bạn không bị gián đoạn đệ quy. Chỉ cần đọc PORTB là tất cả những gì cần làm để xóa cờ ngắt trên PIC16F877A. Mỗi bộ vi điều khiển khác nhau có một cách khác nhau để xóa cờ ngắt. Kiểm tra bảng dữ liệu cho bộ vi điều khiển của bạn. 2.) Khi bạn đạt đến điểm trong mã mà bạn muốn bật ngắt, hãy sử dụng dòng mã này: @ INT_ENABLE RBC_INTKhi bạn muốn tắt ngắt, chỉ cần sử dụng: @ INT_DISABLE RBC_INCó rất nhiều nội dung được đóng gói vào những gì tôi vừa đề cập, vì vậy tôi sẽ tóm tắt nhanh chóng. Cho đến nay, chương trình của bạn sẽ trông giống như thế này:; Bất kỳ thiết lập hoặc mã cần thiết nàoINCLUDE "DT_INTS-14.bas" BAO GỒM macro "ReEnterPBP.bas" ASMINT_LIST; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, có endm INT_CREATEENDASM; Bất kỳ thiết lập cần thiết nào khác hoặc mã @ INT_ENABLE RBC_INT; Mã cần biết cách xoay núm @ INT_DISABLE RBC_INT; Mã khácEND; Kết thúc chương trìnhISR:; Mã ISR tại đây @ INT_RETURN (Bảng thiết lập trình xử lý ngắt) Tôi nghĩ đây là nơi bất kỳ ai không sử dụng ngắt PIC hoặc DT đều có thể tham gia lại. Bây giờ, chúng ta thực sự cần viết ISR để bộ vi điều khiển biết núm xoay theo hướng nào. Nhớ lại phần lý thuyết phần mềm rằng chúng ta có thể suy ra hướng quay nếu chúng ta biết đầu vào gây ra ngắt, giá trị mới của nó và giá trị của đầu vào khác. Đây là mã giả: Đọc PORTB vào một biến đầu để xóa cờ ngắt Kiểm tra xem A có gây ra ngắt hay không. Nếu đúng, hãy So sánh A và B. Kiểm tra xem có khác nhau không, nếu khác, Đó là quay theo chiều kim đồng hồ Khác, Đó là ngược chiều kim đồng hồ Endif Kiểm tra xem B có gây ra ngắt không. Nếu đúng, hãy So sánh A và B Kiểm tra xem có khác nhau không, nếu giống nhau, Nó quay theo chiều kim đồng hồ Khác, Nó quay ngược chiều kim đồng hồ Việc khám phá giá trị mới của đầu vào đã thay đổi và đầu vào khác (không thay đổi) rất dễ dàng vì chúng ta có thể đọc chúng bên trong ISR. Chúng ta cần biết trạng thái của từng cái trước khi thực thi được gửi tới ISR. Điều này xảy ra trong thói quen chính. Quy trình chính ngồi và đợi một biến byte mà chúng tôi gọi là CWflag được đặt thành 1 hoặc xóa thành 0 bởi ISR. Sau mỗi thay đổi được thừa nhận của núm hoặc nếu không có hoạt động của núm, biến được đặt thành 5 để chỉ ra trạng thái không hoạt động. Nếu cờ được đặt hoặc bị xóa, quy trình chính ngay lập tức tăng hoặc giảm áp suất điểm đặt một cách thích hợp dựa trên chuyển động quay và sau đó đặt biến CWflag trở lại 5 vì núm xoay hiện không hoạt động trở lại. Vì thói quen chính là kiểm tra CWflag, nó cũng đang ghi lại trạng thái của các giá trị công tắc xoay A và B. Điều này thực sự đơn giản và trông như thế này: oldA = AoldB = BT Ở đây thực sự không có gì là cao siêu. Chỉ cần bao gồm hai dòng đó ở đầu vòng lặp để kiểm tra CWflag để xoay vòng. Chúng tôi chỉ cập nhật các giá trị logic của các đầu vào từ núm xoay bên trong vòng lặp tăng / giảm trong quy trình chính để chúng tôi có thể xem đầu vào nào đã gây ra ngắt khi ISR được thực thi. Đây là mã ISR: ABchange: xước = PORTB 'Đọc PORTB để xóa cờ ngắt' Nếu A gây ra ngắt, hãy kiểm tra B để biết hướng xoay IF oldA! = A THEN 'Nếu A và B khác nhau, nó quay theo chiều kim đồng hồ IF A! = B THEN GOTO CW 'Nếu không, nó quay ngược chiều kim đồng hồ ELSE GOTO CCW ENDIF ENDIF' Nếu B gây ra ngắt, hãy kiểm tra A để biết hướng quay NẾU oldB! = B THEN 'Nếu A và B giống nhau, nó quay theo chiều kim đồng hồ NẾU A == B THÌ GOTO CW 'Nếu không, nó quay ngược chiều kim đồng hồ ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1 @ INT_RETURNCCW: CWflag = 0 @ INT_RETURNTôi đã bao gồm mã ISR trong tệp AB_ISR.bas vì Các tab trong mã không hiển thị theo cách chúng cần. Hiện tại, vì ISR có các giá trị cũ cho đầu vào A và B nên nó có thể xác định đầu vào nào gây ra ngắt, so sánh nó với đầu vào khác (không thay đổi) và xác định hướng của vòng quay. Tất cả các công việc chính phải làm là kiểm tra CWflag để xem núm xoay đã quay theo hướng nào (nếu có) và tăng hoặc giảm bộ đếm, điểm đặt hoặc bất cứ điều gì bạn thích hoặc cần. gây nhầm lẫn. Loại giao diện này đặc biệt hữu ích nếu hệ thống của bạn đang sử dụng ngắt vì đây chỉ là một ngắt nữa cần thêm vào. Thưởng thức!

Đề xuất: