ซอฟต์แวร์เข้ารหัส เอวีอาร์

ฉันต้องการที่จะปรับให้เข้ากับแล็ปท็อปของฉันโดยใช้ตัวควบคุมระดับเสียง ตัวเข้ารหัส- คุณจะต้องเชื่อมต่อตัวควบคุมนี้กับ USB เพื่อให้ทุกอย่าง "โต" (และไม่มีวิธีอื่นในการเชื่อมต่ออุปกรณ์ภายนอกกับแล็ปท็อป) หมุนตัวเข้ารหัสไปทางซ้าย - ระดับเสียงควรลดลง ไปทางขวา - ควรเพิ่มขึ้น เรากดปุ่มตัวเข้ารหัสลง - เราเปิดโปรแกรมที่มีประโยชน์หรือเปลี่ยนเป็นการควบคุมโทนเสียง

สำหรับผู้ที่ไม่รู้ว่าตัวเข้ารหัสคืออะไร มันเป็นปุ่มหมุน เช่นเดียวกับปุ่มปรับระดับเสียงที่ใช้ตัวต้านทานปกติ มีเพียงปุ่มนี้เท่านั้นที่ไม่มีตำแหน่งจำกัด คุณสามารถหมุนได้มากเท่าที่คุณต้องการในทุกทิศทาง ตัวเข้ารหัสหมุนด้วยการคลิกที่นุ่มนวล แต่ดูเหมือนตัวต้านทานแบบปรับค่าได้ทั่วไป

อุปกรณ์ดังกล่าวไม่ใช่เรื่องแปลกในวิทยุรถยนต์สมัยใหม่และอุปกรณ์ในครัวเรือนใด ๆ ซึ่งอินเทอร์เฟซผู้ใช้ซึ่งประมวลผลโดยไมโครคอนโทรลเลอร์ (และนี่คือเครื่องใช้ในครัวเรือนเกือบทุกชนิด) และเมื่อจำเป็นต้องปรับหรือปรับแต่งอย่างราบรื่น ผู้ติดต่อรายที่สามมักจะถูกสร้างไว้ในตัวเข้ารหัส ซึ่งทำงานเหมือนกับปุ่มบนที่จับ - เมื่อเรากดที่จับของตัวเข้ารหัสลง (ตามแกน) ปุ่มนี้จะเปิดใช้งาน มันช่วยเพิ่มความเป็นไปได้ของอินเทอร์เฟซผู้ใช้อย่างมาก - ในหนึ่งตัวเข้ารหัสคุณสามารถสร้างระบบควบคุมทั้งหมดของอุปกรณ์อิเล็กทรอนิกส์ได้ (แต่มันเพิ่มความปวดหัวให้กับโปรแกรมเมอร์ แต่นี่เป็นเรื่องเล็กน้อย) ฉันเพิ่งมีตัวเข้ารหัสดังกล่าว

หลักการทำงานของตัวเข้ารหัสนั้นค่อนข้างง่าย - มีเพียงสองหน้าสัมผัส (ไม่นับปุ่มบนที่จับ) ซึ่งจะเริ่มปิดทันทีที่ผู้ใช้เริ่มหมุนที่จับของตัวเข้ารหัส หน้าสัมผัสเชื่อมต่อกับไมโครคอนโทรลเลอร์สองขา (ทำงานเป็นอินพุตดิจิตอล) และเมื่อหมุนปุ่มเข้ารหัสพัลส์จะปรากฏที่ขาเหล่านี้ตามเฟสและปริมาณที่ไมโครคอนโทรลเลอร์กำหนดทิศทางของการหมุนและมุมของการหมุน ของปุ่มเข้ารหัส

เพื่อให้การควบคุมระดับเสียงทำงานได้ คุณต้องแก้ไขปัญหาทางวิศวกรรมอย่างน้อยสามข้อ:

ขั้นตอนที่ 1- การสร้างอุปกรณ์ USB ความเร็วต่ำบนเขียงหั่นขนม
ขั้นตอนที่ 2- เชื่อมต่อตัวเข้ารหัสกับอุปกรณ์ USB นี้ ตรวจสอบให้แน่ใจว่าไมโครคอนโทรลเลอร์ประมวลผลและส่งข้อมูลเกี่ยวกับการหมุนของตัวเข้ารหัสไปยังคอมพิวเตอร์
ขั้นตอนที่ 3- ทำความเข้าใจว่าคุณสามารถควบคุมการควบคุมระดับเสียงโดยทางโปรแกรมได้อย่างไร แน่นอนว่ามี API มัลติมีเดียบางประเภทที่ให้คุณทำเช่นนี้ได้ โปรแกรมขั้นต่ำ - คุณต้องเขียนโปรแกรมที่จะรับสัญญาณจากอุปกรณ์ USB และควบคุมระดับเสียง คงจะดีไม่น้อยถ้าเขียนไดรเวอร์ แต่ก็น่ากลัวนิดหน่อยที่ต้องทำ ทิ้งไว้ทีหลังดีกว่า

ดังนั้น ผมจะอธิบายกระบวนการสร้างตัวควบคุมทีละขั้นตอน ฉันจะละเว้นรายละเอียดไม่เช่นนั้นมันจะน่าเบื่อเกินไป สำหรับผู้ที่สนใจดูแหล่งที่มาและเอกสารประกอบได้ที่ลิงค์

[ขั้นตอนที่ 1: สร้างอุปกรณ์ USB ความเร็วต่ำบนเขียงหั่นขนม]

ขั้นตอนนี้ผ่านไปโดยไม่ได้เริ่มต้น - ง่ายเกินไปและซ้ำซาก ฉันดาวน์โหลดโครงการตัวอย่างอย่างโง่เขลาจากลิงก์ ฉันแก้ไขไฟล์ usbconfig.h - ฉันตั้งชื่ออุปกรณ์ของฉันเพื่ออวด การสาธิตการเข้ารหัสไม่มีจินตนาการเพียงพอสำหรับมากกว่านี้ ฉันตรวจสอบประเภทโปรเซสเซอร์ (ATmega16) และความถี่ควอตซ์ (16 MHz) ใน Makefile เพื่อให้ตรงกับเขียงหั่นขนม AVR-USB-MEGA16 ของฉัน ฉันรวบรวมโปรเจ็กต์ใน AVRStudio ฉายเขียงหั่นขนม เชื่อมต่อกับคอมพิวเตอร์ - ทุกอย่างเริ่มต้นครึ่งเทิร์น อุปกรณ์ USB ของฉันทำงานอย่างถูกต้องเป็นพอร์ต COM เสมือน - ทุกอย่างตรงตามที่เขียนในบทความทุกประการ

[ขั้นตอนที่ 2 เชื่อมต่อตัวเข้ารหัสกับอุปกรณ์ USB]

ขั้นตอนนี้ทำให้ฉันกลัวที่สุดว่าทุกอย่างจะทำงานอย่างที่ควรจะเป็น ว่าฉันจะเชื่อมต่อตัวเข้ารหัสและสามารถอ่านได้ - ฉันไม่สงสัยในเรื่องนี้ มีข้อสงสัยว่าฉันจะสามารถอ่านได้อย่างมีประสิทธิภาพเมื่อประมวลผลโปรโตคอล USB ที่ทำงานอยู่ในพื้นหลังด้วย - ท้ายที่สุดแล้วนี่ไม่ใช่งานง่ายสำหรับไมโครคอนโทรลเลอร์ (ตามที่ปรากฏในภายหลัง ฉันก็ไร้ประโยชน์เลยที่จะกังวล ).

ตามปกติแล้ว ฉันเริ่มสำรวจอินเทอร์เน็ตเพื่อค้นหารูทีนย่อยสำเร็จรูปสำหรับการอ่านตัวเข้ารหัส ฉันพบสิ่งที่ต้องการอย่างรวดเร็ว โดยเฉพาะสำหรับ AVR ซึ่งเป็นโค้ดง่ายๆ ใน C, ไฟล์ encoder.c และ encoder.h ไม่ว่าคุณจะพูดอะไร โอเพ่นซอร์สก็เป็นสิ่งที่ดี

ฉันติดไฟ LED แสดงสถานะสองดวง - สีเขียวและสีเหลือง - เพื่อระบุทิศทางการหมุนของตัวเข้ารหัส เพื่อความสะดวก ฉันเชื่อมต่อตัวเข้ารหัสเข้ากับตัวเชื่อมต่อ ISP โดยตรง โดยใช้ประโยชน์จากข้อเท็จจริงที่ว่าสัญญาณ MOSI, MISO และ SCK เป็นเพียงพิน PB5, PB6 และ PB7 ของไมโครคอนโทรลเลอร์ ATmega16 (ฉันเชื่อมต่อเฟส A และ B ที่นั่น เช่นเดียวกับ ปุ่มตัวเข้ารหัส)

แก้ไขคำจำกัดความของขาและเพิ่มรหัสเริ่มต้น ฉันเพิ่มโมดูล encoder.c ให้กับโปรเจ็กต์ เพิ่มการควบคุมไฟ LED สีเขียวและสีเหลืองในลูปหลักเมื่อข้อมูลจากตัวเข้ารหัส ไฟ LED สีแดงผูกอยู่กับปุ่มตัวเข้ารหัส - เมื่อเรากดมัน ไฟ LED สีแดงจะสว่างขึ้น เมื่อเราปล่อย มันจะดับลง คอมไพล์ แฟลช มันใช้งานได้ ฉันหมุนปุ่มไปทางซ้าย และไฟ LED สีเขียวจะกะพริบทันเวลาด้วยการคลิกตัวเข้ารหัส ฉันหมุนปุ่มไปทางขวาแล้วไฟ LED สีเหลืองกะพริบ แม้ว่าตัวเข้ารหัสจะถูกอ่านโดยใช้วิธีการโพล แต่ด้วยโค้ดที่มีประสิทธิภาพ ไม่มีการร้องเรียนใด ๆ เกี่ยวกับการอ่านตัวเข้ารหัส แม้ว่าจะทำงานพร้อมกันกับไลบรารี V-USB (ด้วยความเคารพ Pashgan!) เพิ่มเอาต์พุตข้อมูลจากตัวเข้ารหัสไปยังพอร์ต COM เสมือน (หมุนตัวเข้ารหัสไปทางซ้าย ฉันแสดงเครื่องหมายลบ "-" ในคอนโซล บิดไปทางขวา ฉันแสดงเครื่องหมายบวก "+" ในคอนโซล) เมื่อใช้ตัวจับเวลาทุกๆ 10 มิลลิวินาทีฉันจะแสดงสถานะของปุ่มตัวเข้ารหัสและระบุด้วยไฟ LED สีแดง (กดปุ่ม - ฉันส่งสัญลักษณ์ "1" เมื่อปล่อย - "0") ทุกอย่างทำงานได้ น่าเบื่อ.

ในที่สุดฉันก็โยนโมดูล cmd.c, crc16.c, eepromutil.c, strval.c ออกไป ขนาดโค้ดลดลงเหลือ 3 กิโลไบต์ - เยี่ยมมากตอนนี้จะพอดีกับหน่วยความจำ ATtiny45 แล้ว (ในอนาคตคุณสามารถใช้เขียงหั่นขนม AVR-USB-TINY45 ซึ่งมีขนาดเล็กกว่าและถูกกว่า)

[ขั้นตอนที่ 3 ค้นหาวิธีควบคุมการควบคุมระดับเสียงโดยทางโปรแกรม]

ตามปกติฉันค้นหาคำถามใน Google ฉันแยกขยะออกไป และในที่สุดก็หยิบไข่มุกขึ้นมาได้ - ถ้าอย่างนั้นก็เป็นเรื่องของเทคโนโลยี ฉันนำชุดก่อสร้างสำหรับเด็กที่ฉันชื่นชอบ - Visual Studio ฉันสร้างแอปพลิเคชันแบบโต้ตอบโดยใช้ตัวช่วยสร้างโดยไม่ต้องคิดอะไร ฉันวางแถบเลื่อนควบคุมระดับเสียงลงบนแผงควบคุม ผูกตัวแปรเข้ากับมัน และเพิ่มตัวจัดการตำแหน่งแถบเลื่อน เมื่อแอปพลิเคชันเริ่มทำงาน ฉันตั้งค่ากลไกเป็นขั้นต่ำ 0 และสูงสุด 65535 (เพื่อให้สอดคล้องกับขอบเขตของค่าระดับเสียงที่จัดการโดยไลบรารีควบคุมมิกเซอร์) ฉันอ่านมันด้วยฟังก์ชั่น mixerGetControlรายละเอียดค่าระดับเสียงปัจจุบัน และตั้งค่าแถบเลื่อนไปยังตำแหน่งที่เหมาะสม ในตัวจัดการตำแหน่งตัวเลื่อน ทุกอย่างจะตรงกันข้าม - ฉันอ่านตำแหน่งตัวเลื่อนและใช้ฟังก์ชัน รายละเอียด mixerSetControlฉันตั้งระดับเสียงที่ต้องการ ฉันควบคุมระดับเสียงตามที่เขียนไว้ในบทความทุกประการ ฉันตรวจสอบแล้ว - มันใช้งานได้

ตอนนี้สิ่งที่คุณต้องทำคืออ่านสิ่งที่มาจากพอร์ต COM เสมือน (เรามีอุปกรณ์ USB ที่เพิ่งอบใหม่ซึ่งมีตัวเข้ารหัสห้อยอยู่) หากได้รับเครื่องหมายลบ (-) ให้เลื่อนแถบเลื่อนไปทางซ้าย (ลดระดับเสียง) และเครื่องหมายบวก (+) จากนั้นเลื่อนแถบเลื่อนไปทางขวา (เพิ่มระดับเสียง) หากอักขระ 0 และ 1 มาถึง เราจะควบคุมสถานะของช่องทำเครื่องหมายตามนั้น (เพียงเพื่อระบุว่ากดปุ่มตัวเข้ารหัสหรือไม่) คุณสามารถทำงานกับพอร์ต COM ได้เช่นเดียวกับไฟล์ปกติ (ดู) เราเริ่มต้นการเชื่อมต่อกับพอร์ต COM เมื่อเปิดไฟล์ (โดยการโทร ::สร้างไฟล์) ในโหมดการบล็อก เราเปิดตัวเธรดแยกต่างหาก เพิ่มการอ่านไฟล์ไปยังลูปไม่สิ้นสุด (พร้อมการบล็อกการโทร ::ReadFile) ทีละอักขระ และวิเคราะห์อักขระนี้ ขึ้นอยู่กับสัญลักษณ์ที่มาถึง เราจะหมุนตัวเลื่อนตัวเลื่อนไปในทิศทางที่ต้องการ (ตัวจัดการตัวเลื่อนจะปรับระดับเสียง) หรืออัปเดตสถานะของช่องทำเครื่องหมาย ฉันตรวจสอบแล้ว - มันใช้งานได้

นั่นคือทั้งหมดจริงๆ จากนั้นคุณสามารถมีส่วนร่วมในการปรับปรุงอย่างไม่มีที่สิ้นสุด (และอาจไร้ประโยชน์) ทำการค้นหาพอร์ต COM เสมือนที่ต้องการโดยอัตโนมัติ (ตอนนี้เพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้น ชื่อของพอร์ต COM จะถูกส่งผ่านบรรทัดคำสั่ง) แปลงอุปกรณ์ USB ด้วย CDC- เปิดชั้นเรียน ซ่อน- สิ่งนี้สามารถลดความซับซ้อนของรหัสของอุปกรณ์ USB รวมถึงลดความซับซ้อนของการค้นหาทางโปรแกรมและการเปิดอุปกรณ์บนคอมพิวเตอร์ด้วย VID และ HID หรือเขียนบริการแทนโปรแกรม (เพื่อจะได้ไม่ต้องรันโปรแกรมแยกต่างหาก) หรือแม้แต่คนขับ.. สิ่งนี้น่าสนใจมาก แต่ฉันไม่รู้ว่าจะทำอย่างไร (บางที Khabravoites คนหนึ่งอาจสอนภูมิปัญญาให้ฉันได้?.. ) แนบการกระทำบางอย่างกับปุ่มตัวเข้ารหัส และไม่มีที่สิ้นสุด

ฉันหวังว่าบางคนจะพบว่างานวิจัยของฉันมีประโยชน์ในการพัฒนาตนเอง หากฉันพลาดสิ่งใดฉันยินดีที่จะได้ยินความคิดเห็นของคุณในความคิดเห็น

[UPD120803]

ผู้มีความสามารถคนหนึ่งประกอบ AVR บนไมโครคอนโทรลเลอร์

บ่อยครั้งในอุปกรณ์บนไมโครคอนโทรลเลอร์จำเป็นต้องจัดระเบียบการจัดการรายการเมนูหรือใช้การปรับเปลี่ยนบางอย่าง มีหลายวิธี: ใช้ปุ่ม ตัวต้านทานผันแปร หรือตัวเข้ารหัส ตัวเข้ารหัสส่วนเพิ่มช่วยให้คุณควบคุมบางสิ่งได้โดยการหมุนปุ่มอย่างไม่มีที่สิ้นสุด ในบทความนี้ เราจะมาดูวิธีทำให้ตัวเข้ารหัสส่วนเพิ่มและ Arduino ทำงานได้อย่างไร

คุณสมบัติของตัวเข้ารหัสแบบเพิ่มหน่วย

ตัวเข้ารหัสแบบเพิ่มหน่วยก็เหมือนกับตัวเข้ารหัสประเภทอื่นๆ คืออุปกรณ์ที่มีด้ามจับแบบหมุนได้ มันดูคล้ายกับโพเทนชิออมิเตอร์อย่างคลุมเครือ ข้อแตกต่างที่สำคัญจากโพเทนชิออมิเตอร์คือด้ามจับตัวเข้ารหัสหมุนได้ 360 องศา มันไม่มีตำแหน่งที่รุนแรง

ตัวเข้ารหัสมีหลายประเภท ส่วนที่เพิ่มขึ้นนั้นแตกต่างกันตรงที่ไม่สามารถใช้เพื่อค้นหาตำแหน่งของที่จับได้ แต่จะมีเพียงการหมุนในทิศทางใดทิศทางหนึ่งเท่านั้น - ซ้ายหรือขวา ด้วยจำนวนพัลส์สัญญาณ คุณสามารถคำนวณได้จากมุมที่มันหมุนไป

วิธีนี้ทำให้คุณสามารถส่งคำสั่ง ควบคุมเมนู ระดับเสียง เป็นต้น ในชีวิตประจำวันคุณสามารถเห็นสิ่งเหล่านี้ได้ในวิทยุติดรถยนต์และอุปกรณ์อื่นๆ ใช้เป็นตัวควบคุมแบบมัลติฟังก์ชั่นสำหรับการปรับระดับ อีควอไลเซอร์ และการนำทางเมนู

ภายในตัวเข้ารหัสแบบเพิ่มหน่วยจะมีดิสก์ที่มีเครื่องหมายและแถบเลื่อนสัมผัสกัน โครงสร้างของมันคล้ายกับโพเทนชิออมิเตอร์

ในภาพด้านบน คุณเห็นดิสก์ที่มีเครื่องหมาย ซึ่งจำเป็นต้องขัดจังหวะการเชื่อมต่อไฟฟ้ากับหน้าสัมผัสที่กำลังเคลื่อนที่ ส่งผลให้คุณได้รับข้อมูลเกี่ยวกับทิศทางการหมุน การออกแบบผลิตภัณฑ์ไม่สำคัญเรามาดูหลักการทำงานกันดีกว่า

ตัวเข้ารหัสมีพินข้อมูลสามพิน พินหนึ่งทั่วไป ส่วนอีกสองพินมักเรียกว่า "A" และ "B" ในรูปด้านบนคุณจะเห็นพินของเอ็นโค้ดเดอร์ด้วยปุ่ม - คุณสามารถรับสัญญาณได้เมื่อคุณกดเพลา

เราจะรับสัญญาณอะไรได้บ้าง? ขึ้นอยู่กับทิศทางของการหมุน ลอจิกหนึ่งจะปรากฏที่พิน A หรือ B ก่อน ดังนั้นเราจึงได้รับสัญญาณการเปลี่ยนเฟส และการเปลี่ยนแปลงนี้ช่วยให้เรากำหนดทิศทางได้ ได้รับสัญญาณเป็นรูปสี่เหลี่ยมผืนผ้าและไมโครคอนโทรลเลอร์จะถูกควบคุมหลังจากประมวลผลข้อมูลเกี่ยวกับทิศทางการหมุนและจำนวนพัลส์

รูปภาพแสดงสัญลักษณ์ของดิสก์ที่มีหน้าสัมผัส ตรงกลางคือกราฟสัญญาณเอาท์พุต และทางด้านขวาคือตารางสถานะ อุปกรณ์นี้มักจะวาดเป็นสองปุ่มซึ่งเป็นตรรกะ เพราะในความเป็นจริงเราได้รับสัญญาณ "ไปข้างหน้า" หรือ "ถอยหลัง" "ขึ้น" หรือ "ลง" และจำนวนการกระแทก

นี่คือตัวอย่างของ pinout ของตัวเข้ารหัสจริง:

น่าสนใจ:

ตัวเข้ารหัสที่ผิดปกติสามารถเปลี่ยนได้ด้วยปุ่มที่ไม่ล็อคสองปุ่ม และในทางกลับกัน: ผลิตภัณฑ์โฮมเมดที่ควบคุมโดยปุ่มดังกล่าวสองปุ่มสามารถแก้ไขได้โดยการติดตั้งตัวเข้ารหัส

ในวิดีโอด้านล่าง คุณจะเห็นการสลับสัญญาณที่หมุด - ด้วยการหมุนอย่างราบรื่น ไฟ LED จะสว่างขึ้นตามลำดับที่แสดงในกราฟก่อนหน้า

สิ่งนี้แสดงให้เห็นชัดเจนไม่น้อยในภาพเคลื่อนไหวต่อไปนี้ (คลิกที่ภาพ):

ตัวเข้ารหัสอาจเป็นแบบออปติคัล (สัญญาณถูกสร้างขึ้นโดยตัวปล่อยเครื่องตรวจจับแสง ดูรูปด้านล่าง) และแบบแม่เหล็ก (ใช้ได้กับเอฟเฟกต์ฮอลล์) ในกรณีนี้ไม่มีหน้าสัมผัสและมีอายุการใช้งานยาวนานขึ้น

ดังที่ได้กล่าวไปแล้ว ทิศทางการหมุนสามารถกำหนดได้โดยสัญญาณเอาท์พุตใดที่เปลี่ยนไปก่อน และนี่คือลักษณะที่ปรากฏในทางปฏิบัติ!

ความแม่นยำในการควบคุมขึ้นอยู่กับความละเอียดของตัวเข้ารหัส - จำนวนพัลส์ต่อการปฏิวัติ จำนวนพัลส์สามารถมีได้ตั้งแต่หน่วยถึงหลักพัน เนื่องจากตัวเข้ารหัสสามารถทำหน้าที่เป็นเซ็นเซอร์ตำแหน่งได้ ยิ่งมีพัลส์มากเท่าใด การพิจารณาก็จะยิ่งแม่นยำมากขึ้นเท่านั้น พารามิเตอร์นี้ถูกกำหนดให้เป็น PPR - พัลส์ต่อการปฏิวัติ

แต่มีความแตกต่างเล็กน้อยคือการกำหนด LPR ที่คล้ายกันคือจำนวนป้ายกำกับบนดิสก์

และจำนวนแรงกระตุ้นที่ประมวลผล แต่ละเครื่องหมายบนดิสก์จะสร้างคลื่นสี่เหลี่ยม 1 คลื่นในแต่ละเอาต์พุตทั้งสอง ชีพจรมีสองด้านหน้า - ด้านหลังและด้านหน้า เนื่องจากมีเอาต์พุตสองเอาต์พุต จากแต่ละเอาต์พุตเราจึงได้รับพัลส์ทั้งหมด 4 พัลส์ซึ่งคุณสามารถประมวลผลค่าได้

เชื่อมต่อกับ Arduino

เราได้พูดถึงสิ่งที่คุณต้องรู้เกี่ยวกับตัวเข้ารหัสส่วนเพิ่มแล้ว ตอนนี้เรามาดูวิธีเชื่อมต่อกับ Arduino กัน ลองดูแผนภาพการเชื่อมต่อ:

โมดูลตัวเข้ารหัสเป็นบอร์ดที่มีตัวเข้ารหัสส่วนเพิ่มและตัวต้านทานแบบดึงขึ้นอยู่ คุณสามารถใช้พินใดก็ได้

หากคุณไม่มีโมดูล แต่มีตัวเข้ารหัสแยกต่างหาก คุณเพียงแค่ต้องเพิ่มตัวต้านทานเหล่านี้ วงจรจะไม่แตกต่างกันโดยพื้นฐาน เพื่อตรวจสอบทิศทางการหมุนและการทำงานของมันเราสามารถอ่านข้อมูลจากพอร์ตอนุกรมได้

มาดูโค้ดโดยละเอียดทีละอัน ในการตั้งค่าเป็นโมฆะ() เราได้ประกาศว่าเราจะใช้การสื่อสารแบบอนุกรม จากนั้นตั้งค่าพิน 2 และ 8 เป็นโหมดอินพุต คุณเลือกหมายเลขพินด้วยตัวเองตามแผนภาพการเชื่อมต่อของคุณ ค่าคงที่ INPUT_PULLUP ตั้งค่าโหมดอินพุต Arduino มีสองตัวเลือก:

    INPUT - อินพุตที่ไม่มีตัวต้านทานแบบดึงขึ้น

    INPUT_PULLUP - การเชื่อมต่อตัวต้านทานแบบดึงขึ้นกับอินพุต ภายในไมโครคอนโทรลเลอร์มีตัวต้านทานอยู่แล้วซึ่งอินพุตเชื่อมต่อกับแหล่งจ่ายไฟเป็นบวก (พูลอัพ)

หากคุณใช้ตัวต้านทานเพื่อดึงแหล่งจ่ายไฟดังที่แสดงในแผนภาพด้านบน หรือใช้โมดูลตัวเข้ารหัส ให้ใช้คำสั่ง INPUT และหากคุณไม่สามารถหรือไม่ต้องการใช้ตัวต้านทานภายนอกได้ด้วยเหตุผลบางประการ ให้ใช้ INPUT_PULLUP

ตรรกะของโปรแกรมหลักมีดังนี้: หากเรามีอันหนึ่งที่อินพุต "2" มันจะส่งออก H ไปยังมอนิเตอร์พอร์ตถ้าไม่ใช่ L ดังนั้นเมื่อหมุนไปในทิศทางเดียวบนมอนิเตอร์พอร์ตอนุกรมคุณจะได้บางอย่าง เช่นนี้: LL HL HH LH LL และไปในทิศทางตรงกันข้าม: LL LH HH HL LL

หากคุณอ่านบรรทัดเหล่านี้อย่างละเอียด คุณอาจสังเกตเห็นว่าในกรณีหนึ่งอักขระตัวแรกมีความหมาย และอีกกรณีหนึ่งอักขระตัวที่สองเปลี่ยนไปก่อน

บทสรุป

ตัวเข้ารหัสแบบเพิ่มหน่วยพบการใช้งานจริงอย่างกว้างขวางในแอมพลิฟายเออร์สำหรับระบบลำโพง - พวกมันถูกใช้เป็นตัวควบคุมระดับเสียง ในวิทยุรถยนต์ - เพื่อปรับพารามิเตอร์เสียงและนำทางเมนู ในเมาส์คอมพิวเตอร์ คุณใช้เพื่อเลื่อนหน้าต่างๆ ทุกวัน (วงล้อคือ ติดตั้งอยู่บนเพลา) และยังรวมถึงเครื่องมือวัด เครื่องจักร CNC หุ่นยนต์ และซิงโครนัสด้วย ไม่เพียงแต่เป็นตัวควบคุมเท่านั้น แต่ยังใช้สำหรับการวัดปริมาณและการกำหนดตำแหน่งด้วย

ในโครงการสาธิตนี้ เราจะดูงานในการเชื่อมต่อองค์ประกอบควบคุมที่เรียกว่าตัวเข้ารหัสกับไมโครคอนโทรลเลอร์ PIC

เพื่อดำเนินโครงการสาธิต เราจะต้อง:

  • ตัวเข้ารหัส 24 ตำแหน่ง;
  • ไฟ LED 16 ดวง (3 มม.);
  • ไดร์เวอร์ LED;
  • ไมโครคอนโทรลเลอร์

ตัวเข้ารหัสเป็นองค์ประกอบควบคุมที่ทันสมัยและเป็นต้นฉบับสำหรับอุปกรณ์ดิจิทัล และในลักษณะที่ปรากฏจะคล้ายกับตัวต้านทานแบบปรับค่าได้ (ดูรูปด้านล่าง) อีกชื่อหนึ่งของการควบคุมนี้คือเซ็นเซอร์มุม เซ็นเซอร์การหมุน การหมุนของเพลาจะมาพร้อมกับการคลิก เช่น 24 คลิกต่อการปฏิวัติ ตัวเข้ารหัสมีเอาต์พุต 3 ช่อง - A, B, C และใช้สำหรับป้อนข้อมูลลงในอุปกรณ์ดิจิทัลอย่างรวดเร็ว บางรุ่นมีปุ่มในตัวที่เปิดใช้งานโดยการกดเพลาตัวเข้ารหัส (เพิ่มเอาต์พุตอื่น)

หลักการทำงานของตัวเข้ารหัส

เมื่อคลิกเพียงครั้งเดียว เช่น ไปทางขวา ผู้ติดต่อ A+C จะถูกปิดก่อน จากนั้นจึง B+C เมื่อหมุนเพลาด้วยการคลิกนี้ หน้าสัมผัสจะเปิดในลำดับเดียวกัน เมื่อเพลาหมุนไปในทิศทางอื่น ลำดับการปิดที่มีหน้าสัมผัส C จะเปลี่ยนไป เช่น เมื่อเลี้ยวซ้าย B+C แรก จากนั้น A+C จะปิด

การใช้ตัวเข้ารหัสในโครงการไมโครคอนโทรลเลอร์ เป็นไปได้ที่จะนำอินพุตข้อมูลหลายประเภทมาใช้โดยใช้ตัวเข้ารหัสเดียวกัน อย่างไรก็ตาม การดำเนินการนี้ต้องใช้คำติชมและการแสดงภาพเพื่อให้ผู้ใช้ทราบว่าข้อมูลที่เขาป้อนคืออะไร และตัวเข้ารหัสอยู่ที่ตำแหน่งใด


แผนผัง: การเชื่อมต่อตัวเข้ารหัสกับไมโครคอนโทรลเลอร์ PIC (คลิกเพื่อดูภาพขยาย)

พินตัวเข้ารหัส A และ B เชื่อมต่อกับพอร์ตไมโครคอนโทรลเลอร์ RB4 และ RB5 พินตัวเข้ารหัส C เชื่อมต่อกับกราวด์ เป็นที่น่าสังเกตว่าต้องเชื่อมต่อตัวต้านทานแบบดึงขึ้นเข้ากับสายสัญญาณของพิน A และ B ไม่ใช่เรื่องบังเอิญที่ตัวเข้ารหัสเชื่อมต่อกับสาย I/O ที่ระบุของไมโครคอนโทรลเลอร์ ประการแรก พอร์ต B มีตัวต้านทานแบบดึงขึ้นในตัว และเราไม่จำเป็นต้องเชื่อมต่อตัวภายนอก และประการที่สอง พอร์ต B ของไมโครคอนโทรลเลอร์ มีฟังก์ชันที่มีประโยชน์มาก - "interrupt-on-change" - การหยุดชะงักโดยการเปลี่ยนระดับซึ่งจะทำให้เราสามารถตรวจสอบสถานะของตัวเข้ารหัสได้

ใช้ไฟ LED ธรรมดาขนาด 3 มม. จำนวน 16 ดวงเพื่อแสดงภาพข้อมูลอินพุต และจะติดตั้งอยู่บนแผงวงจรพิมพ์รอบๆ ตัวเข้ารหัสที่ติดตั้งไว้ LED เชื่อมต่อกับชิป A6276

ชิปนี้เป็นไดรเวอร์ LED พร้อมอินพุตข้อมูลอนุกรม 16 บิต ไดรเวอร์ประกอบด้วย CMOS shift register 16 บิต แลตช์และไดรเวอร์ที่เกี่ยวข้องเพื่อควบคุม LED และสามารถขับเคลื่อน LED ได้มากกว่าที่ไมโครคอนโทรลเลอร์จะอนุญาต นอกจากนี้ ไดรเวอร์สามารถควบคุมผ่านอินเทอร์เฟซ SPI ซึ่งจะช่วยลดจำนวนสาย I/O ที่ใช้ และทำให้โปรเจ็กต์สามารถปรับขนาดได้

ซอฟต์แวร์ไมโครคอนโทรลเลอร์สำหรับการแก้ปัญหาของเรานั้นค่อนข้างง่าย มี 3 โหมดการทำงาน (ป้อนข้อมูล) และข้อเสนอแนะ:

  • โหมดการกำหนดตำแหน่ง 360° - ในโหมดนี้ ไฟ LED จะระบุ "ตำแหน่ง" ในปัจจุบันของตัวเข้ารหัส ผู้ใช้สามารถหมุนเพลาตัวเข้ารหัสไปทางซ้ายและขวาไปที่มุมใดก็ได้
  • โหมด "ระดับเสียง/ระดับ" - ในโหมดนี้ ไฟ LED จะแสดงค่าปัจจุบันระหว่างระดับต่ำสุดและสูงสุดของช่วงอินพุต (เช่น ระดับเสียงในอุปกรณ์เสียง)
  • โหมดสวิตช์โรตารี 3 ตำแหน่ง - ในโหมดนี้ จะมีตำแหน่งที่เลือกได้เพียงสามตำแหน่งเท่านั้นที่ผู้ใช้เลือกโดยการหมุนเพลาตัวเข้ารหัสไปทางซ้าย/ขวา

การสาธิตโครงการ

หลักการทำงาน แผนภาพการเชื่อมต่อ และซอร์สโค้ดของไลบรารีสำหรับการทำงานกับตัวเข้ารหัสแบบเพิ่มหน่วยได้ถูกกล่าวถึงแล้วในบทความหนึ่ง วันนี้เราจะมาพูดถึงการใช้งานจริงของตัวเข้ารหัส ตามตัวอย่าง ฉันเลือกโปรแกรมกำเนิดคลื่นสี่เหลี่ยมที่มีช่วงความถี่การทำงาน 1 - 100 Hz แผนเดิมสันนิษฐานว่าอยู่ในช่วง 1 - 1,000 Hz แต่ในทางปฏิบัติปรากฎว่าการผ่านค่านับพันค่านั้นน่าเบื่อแม้จะใช้ตัวเข้ารหัสก็ตาม

การตระเตรียม

สร้างโปรเจ็กต์ใหม่ในพื้นที่ทำงานว่าง

โครงการ > สร้างโครงการใหม่...

เทมเพลตประเภท C > หลัก

คัดลอกไฟล์ต้นฉบับของไลบรารีสำหรับการทำงานกับตัวเข้ารหัสไปยังโฟลเดอร์โปรเจ็กต์
encoder.h และ encoder.c

เราเชื่อมต่อไฟล์ encoder.c กับโครงการของเรา
ปุ่มเมาส์ขวาในหน้าต่างพื้นที่ทำงานและในเมนูที่เปิดขึ้น เพิ่ม > เพิ่มไฟล์...

คัดลอกไฟล์ bits_macros.h ไปยังโฟลเดอร์โปรเจ็กต์


รวมทั้งไฟล์ส่วนหัวด้วย

ที่จุดเริ่มต้นของไฟล์ main.c เราจะเขียนบรรทัดต่อไปนี้
#รวม
#รวม
#รวม "encoder.h"
#รวม "bits_macros.h"

การตั้งค่าโครงการ

โครงการ > ตัวเลือก

ประเภทไมโครคอนโทรลเลอร์
ตัวเลือกทั่วไป > เป้าหมาย > การกำหนดค่าตัวประมวลผล > ATMega8535

อนุญาตให้ใช้ชื่อบิตที่กำหนดไว้ในไฟล์ส่วนหัว
ตัวเลือกทั่วไป > ระบบ > เปิดใช้งานการป้องกันบิต...

การเพิ่มประสิทธิภาพโค้ดสำหรับขนาด
คอมไพเลอร์ C/C++ > การเพิ่มประสิทธิภาพ > ขนาดใหญ่

ประเภทไฟล์เอาท์พุต
Linker > ตรวจสอบไฟล์เอาต์พุต แทนที่ค่าเริ่มต้นและเปลี่ยนนามสกุลเป็นเลขฐานสิบหก
ตัวเชื่อมโยง > รูปแบบ > อื่นๆ เลือก Intel Standard

คลิกตกลง บันทึกโปรเจ็กต์และพื้นที่ทำงาน
ตอนนี้เรามีโปรเจ็กต์ว่างที่มีไลบรารีที่เชื่อมต่อและการตั้งค่าที่ระบุ

งาน

ทำให้ไมโครคอนโทรลเลอร์สร้างคลื่นสี่เหลี่ยมที่มีความถี่ตั้งแต่ 1 ถึง 100 Hz ต้องตั้งค่าความถี่โดยใช้ตัวเข้ารหัส การหมุนตัวเข้ารหัสหนึ่งตำแหน่งควรสอดคล้องกับการเปลี่ยนแปลงความถี่ของเครื่องกำเนิด 1 Hz

แผนภาพสำหรับตัวอย่างของเรา

LED เชื่อมต่อกับพินที่จะสร้างคดเคี้ยวเพื่อที่จะเห็นผลลัพธ์ของโปรแกรมเป็นอย่างน้อย ไม่น่าเป็นไปได้ที่คนจำนวนมากจะมีออสซิลโลสโคปอยู่ในมือ

อัลกอริธึมของโปรแกรม

สัญญาณคลื่นสี่เหลี่ยมถูกสร้างขึ้นโดยใช้ตัวจับเวลา 16 บิต T1 ซึ่งทำงานในโหมด CTC - รีเซ็ตเมื่อบังเอิญ หน่วยความจำแฟลชของไมโครคอนโทรลเลอร์จะจัดเก็บอาร์เรย์ที่มีค่าคงที่สำหรับแต่ละค่าของความถี่ที่ต้องการ ตัวแปร pTimerValue ใช้เพื่อเข้าถึงองค์ประกอบอาร์เรย์ ในการขัดจังหวะตัวจับเวลา T1 ค่าของค่าคงที่จะถูกอ่านและเขียนไปยังรีจิสเตอร์การเปรียบเทียบ

ขา PD5 (OC1A) ใช้สร้างสัญญาณ มีฟังก์ชันทางเลือก - สามารถเปลี่ยนสถานะเป็นตรงกันข้ามได้หากรีจิสเตอร์การนับและรีจิสเตอร์การเปรียบเทียบเท่ากัน

ในโปรแกรมหลัก ในการวนซ้ำแบบไม่มีสิ้นสุด ไมโครคอนโทรลเลอร์จะสำรวจบัฟเฟอร์ตัวเข้ารหัส และจะลดหรือเพิ่มตัวแปร pTimerValue ขึ้นอยู่กับค่าของมัน

ที่จุดเริ่มต้นของ main จะมีโค้ดสำหรับเตรียมใช้งานอุปกรณ์ต่อพ่วงและตัวแปรที่จำเป็น

โครงสร้างโปรแกรม

เพื่อความชัดเจน ฉันได้อธิบายโครงสร้างของโปรแกรมในรูปแบบไดอะแกรม

นี่เป็นโครงสร้างทั่วไปสำหรับการสร้างโปรแกรมอย่างง่าย การขัดจังหวะมักเกิดขึ้นที่ตำแหน่งสุ่มในวง

  • การเริ่มต้น.
  • การวนซ้ำไม่สิ้นสุด (ที่เรียกว่า ซูเปอร์ลูป) ซึ่งมีเหตุการณ์รออยู่ โดยปกติจะอยู่ในรูปแบบของโพลแฟล็กหรือบัฟเฟอร์บางประเภท
  • การทำงานแบบขนานของอุปกรณ์ต่อพ่วงที่ทำให้เกิดการหยุดชะงัก พวกเขาเรียกใช้โค้ดบางส่วน (ควรสั้นกว่า) และตั้งค่าสถานะ

สำหรับงานง่ายๆ แนวทางนี้ก็เพียงพอแล้ว สำหรับโปรแกรมที่ซับซ้อน มีวิธีอื่นในการจัดระเบียบโปรแกรม อดทนไว้ สิ่งต่างๆ จะเข้ามาหาพวกเขาในไม่ช้า

การคำนวณค่าคงที่สำหรับตัวจับเวลา T1

ลองคำนวณค่าคงที่สำหรับความถี่ 1 Hz ฉันได้ให้การคำนวณที่คล้ายกันแล้ว แต่จะมีประโยชน์ที่จะจำไว้

ความถี่สัญญาณนาฬิกาของไมโครคอนโทรลเลอร์คือ 16 MHz (ดูแผนภาพ) ปัจจัยพรีสเกลเลอร์ของตัวจับเวลาคือ 256 ซึ่งช่วยให้คุณได้รับการขัดจังหวะด้วยความถี่ใดก็ได้จากช่วงของเรา

คาบของตัวจับเวลาหนึ่งขีดจะเท่ากับ 1/(16 MHz/ 256) = 16 µs

ที่ขา PD5 เราต้องรับสัญญาณที่มีความถี่ 1 Hz พินจะเปลี่ยนสถานะสำหรับการขัดจังหวะตัวจับเวลาแต่ละครั้ง ซึ่งหมายความว่าความถี่ขัดจังหวะจะต้องสูงกว่า 2 เท่า สำหรับกรณีของเรา - 2 Hz

กี่ตัวจับเวลาจะพอดีกับ 2 เฮิรตซ์? (1/2 เฮิร์ตซ์)/16 µs = 31250
นี่คือค่าคงที่ที่ต้องการ

ค่าที่เหลือจะถูกคำนวณในลักษณะเดียวกัน ฉันมักจะใช้ Excel เพื่อสิ่งนี้


เราวางค่าผลลัพธ์ไว้ในอาร์เรย์

__แฟลช int ที่ไม่ได้ลงนามค่าตัวจับเวลา =
{

บันทึกเป็นไฟล์แยกต่างหาก - timer_value.h และเชื่อมต่อกับไฟล์ main.c

#รวม "timer_value.h"

ใช่ คุณยังต้องเพิ่มค่าคงที่สองสามค่าให้กับไฟล์นี้

#กำหนด MAX_TIM_VALUE 99
#กำหนด MIN_TIM_VALUE 0

ตรวจสอบให้แน่ใจว่าเราได้คำนวณค่าคงที่ของตัวจับเวลาอย่างถูกต้อง มาเปิดตัวกันเลย รหัสโปรแกรมจะเป็นแบบนี้

//การเขียนโปรแกรม AVR ใน C

//เว็บไซต์ 10.17.09
#รวม
#รวม
#รวม "encoder.h"
#รวม "bits_macros.h"
#รวม "timer_value.h"

//ดัชนีสำหรับการเข้าถึงองค์ประกอบอาร์เรย์
ถ่านที่ไม่ได้ลงนามระเหยง่าย pTimerValue = 0;

ภายในหลัก( เป็นโมฆะ )
{
// เริ่มต้นตัวจับเวลา T1
TCNT1 = 0;
TCCR1A = (0<TCCR1B = (0<

// ตั้งค่าพิน PD5 เป็นเอาต์พุต
เซทบิต(PORTD, PD5);
เซ็ตบิต(DDRD, PD5);

//ไม่ทำอะไรเลยวนซ้ำไม่รู้จบ
ในขณะที่(1);
กลับ 0;
}

ฉันคิดว่าเฉพาะส่วนการเริ่มต้นจับเวลาเท่านั้นที่ต้องการคำอธิบาย

การรีเซ็ตการลงทะเบียนตัวนับ
TCNT1 = 0;

การเริ่มต้นการลงทะเบียนการกำหนดค่าตัวจับเวลา T1
TCCR1A = (0<TCCR1B = (0<

โดยที่บิต WGM13, WGM12, WGM11, WGM10 ตั้งค่าโหมดการทำงานของตัวจับเวลา - CTC
CS12, CS11, CS10 - กำหนดค่าสัมประสิทธิ์พรีสเกลเลอร์ของตัวจับเวลา –256,

COM1A1, COM1A0 – กำหนดพฤติกรรมของพิน PD5(OC1F) – ในกรณีนี้ เมื่อสัญญาณจับเวลาจะเปลี่ยนสถานะเป็นสถานะตรงกันข้าม


เริ่มต้นการลงทะเบียนการแข่งขันให้เป็นค่าเริ่มต้น
OCR1A = ค่าตัวจับเวลา;

เรารวบรวมโปรแกรมและโหลดลงในไมโครคอนโทรลเลอร์ ไฟ LED ควรกระพริบที่ความถี่ 1 Hz
ไม่มีการหยุดชะงักในโปรแกรม ไม่มีการดัดแปลงพิน PD5 อย่างไรก็ตาม ไฟ LED กะพริบ!

โปรแกรม

ตอนนี้คุณต้อง "ขัน" ตัวเข้ารหัสให้กับโปรแกรมนี้ มาตั้งค่าในไฟล์ส่วนหัว encoder.h - พอร์ตและพินที่เชื่อมต่อตัวเข้ารหัสค่าของค่าคงที่


#กำหนด PORT_Enc PORTA
#กำหนด PIN_Enc PINA
#กำหนด DDR_Enc DDRA
#กำหนด Pin1_Enc 2
#กำหนด Pin2_Enc 1

#กำหนด RIGHT_SPIN 0x01
#กำหนด LEFT_SPIN 0xff

ส่วนหัวประกอบด้วยต้นแบบของสามฟังก์ชัน เรามาจำจุดประสงค์ของพวกเขากันดีกว่า

เป็นโมฆะ ENC_InitEncoder (เป็นโมฆะ)กำหนดค่าพินไมโครคอนโทรลเลอร์ที่ตัวเข้ารหัสเชื่อมต่อกับอินพุต ต้องเรียกฟังก์ชันนี้ที่จุดเริ่มต้นของ main


เป็นโมฆะ ENC_PollEncoder (เป็นโมฆะ)– สำรวจตัวเข้ารหัสหนึ่งครั้ง วิเคราะห์สถานะปัจจุบันและก่อนหน้า และเขียนค่าคงที่ที่สอดคล้องกัน (RIGHT_SPIN และ LEFT_SPIN) ลงในบัฟเฟอร์ ฟังก์ชั่นนี้จะนั่งอยู่ในการขัดจังหวะตัวจับเวลา T0


ถ่าน ENC_GetStateEncoder ที่ไม่ได้ลงนาม (เป็นโมฆะ)– ส่งคืนเนื้อหาของบัฟเฟอร์ตัวเข้ารหัส หากการหมุนไม่คงที่ ฟังก์ชันจะส่งกลับค่า 0 หากการหมุนได้รับการแก้ไข ฟังก์ชันจะส่งคืนค่าของค่าคงที่ที่สอดคล้องกัน นี่จะเป็นการล้างค่าบัฟเฟอร์ ฟังก์ชั่นนี้จะถูกเรียกใช้ในโปรแกรมหลัก - ในลูป while


เรากำลังขยายโปรแกรมของเรา คุณสามารถลองทำสิ่งนี้ด้วยตัวเอง

//การเขียนโปรแกรม AVR ใน C
//ตัวอย่างการใช้ตัวเข้ารหัส
//เว็บไซต์ 10.17.09

#รวม
#รวม
#รวม "encoder.h"
#รวม "bits_macros.h"
#รวม "timer_value.h"

#กำหนด TCNT0_const 253
#define TCCR0_const 5

ถ่านที่ไม่ได้ลงนามระเหยง่าย pTimerValue = 0;

ภายในหลัก( เป็นโมฆะ )
{
ENC_Initตัวเข้ารหัส();

// เริ่มต้นตัวจับเวลา t0
TCNT0 = TCNT0_const;
TCCR0 = TCCR0_const;

//เริ่มต้นตัวจับเวลา t1
TCNT1 = 0;
TCCR1A = (0<TCCR1B = (0<OCR1A = ค่าตัวจับเวลา;

// เปิดใช้งานการขัดจังหวะตัวจับเวลา
//t0 - โดยล้น t1 - โดยบังเอิญ

ทิมสค์ = (1<

//ตั้งค่า PD5 เป็นเอาท์พุต
เซทบิต(PORTD, PD5);
เซ็ตบิต(DDRD, PD5);

__เปิดใช้งาน_ขัดจังหวะ ();
ในขณะที่ (1){
//อ่านเนื้อหาของบัฟเฟอร์ตัวเข้ารหัส
//อ่านแล้วเคลียร์เลย

ถ่านที่ไม่ได้ลงนาม stateEnc = ENC_GetStateEncoder();

//ถ้าไม่ว่าง
ถ้า(สถานะEnc != 0)(
//กำหนดทิศทางการหมุนและเปลี่ยนตัวแปร timerValue
ถ้า(stateEnc == ขวา_หมุน)(
ถ้า(pTimerValue == MAX_TIM_VALUE) pTimerValue = MIN_TIM_VALUE;
อื่น pTimerValue++;
}
ถ้า(stateEnc == LEFT_SPIN) (
ถ้า(pTimerValue == MIN_TIM_VALUE) pTimerValue = MAX_TIM_VALUE;
อื่น pTimerValue--;
}
}
}
กลับ 0;
}

// สำรวจตัวเข้ารหัส
#pragma vector=TIMER0_OVF_vect
__ขัดจังหวะเป็นโมฆะ ตัวจับเวลา0_ovf_my( เป็นโมฆะ)
{
TCNT0 = TCNT0_const;
ENC_PollEncoder();
}

#pragma vector=TIMER1_COMPA_vect
__ขัดจังหวะ เป็นโมฆะ timer1_compa_my( เป็นโมฆะ)
{
// อัพเดตค่าของรีจิสเตอร์การเปรียบเทียบ
OCR1A = ค่าตัวจับเวลา;
}

ดูเหมือนว่าทุกอย่างควรจะชัดเจน
ส่วนของโค้ดที่เปลี่ยนค่าของ pTimerValue สามารถเขียนได้ดังนี้:

ถ้า(สถานะEnc != 0) (
pTimerValue = pTimerValue + stateEnc;
ถ้า(pTimerValue == (MAX_TIM_VALUE + 1)) pTimerValue = MIN_TIM_VALUE;
อย่างอื่นถ้า(pTimerValue == (MIN_TIM_VALUE - 1)) pTimerValue = MAX_TIM_VALUE;
}

เมื่อหมุนตัวเข้ารหัสไปทางขวา pTimerValue จะถูกเพิ่มเป็น 1 นั่นคือจะเพิ่มขึ้น

เมื่อหมุนตัวเข้ารหัสไปทางซ้าย pTimerValue จะถูกเพิ่มเข้าไปใน 0хff ซึ่งเทียบเท่ากับการลบ 1 ซึ่งเป็นการดำเนินการเดียวกัน แต่ผลลัพธ์กลับตรงกันข้ามทุกประการ

เพื่อดำเนินโครงการสาธิต เราจะต้อง:

  • ตัวเข้ารหัส 24 ตำแหน่ง;
  • ไฟ LED 16 ดวง (3 มม.);
  • ไดรเวอร์ LED A6276;
  • ไมโครคอนโทรลเลอร์ PIC18F2550.

ตัวเข้ารหัสเป็นองค์ประกอบควบคุมที่ทันสมัยและเป็นต้นฉบับสำหรับอุปกรณ์ดิจิทัล และในลักษณะที่ปรากฏจะคล้ายกับตัวต้านทานแบบปรับค่าได้ (ดูรูปด้านล่าง) อีกชื่อหนึ่งของการควบคุมนี้คือเซ็นเซอร์มุม เซ็นเซอร์การหมุน การหมุนของเพลาจะมาพร้อมกับการคลิก เช่น 24 คลิกต่อการปฏิวัติ ตัวเข้ารหัสมีเอาต์พุต 3 ช่อง - A, B, C และใช้สำหรับป้อนข้อมูลลงในอุปกรณ์ดิจิทัลอย่างรวดเร็ว บางรุ่นมีปุ่มในตัวที่เปิดใช้งานโดยการกดเพลาตัวเข้ารหัส (เพิ่มเอาต์พุตอื่น)

หลักการทำงานของตัวเข้ารหัส

เมื่อคลิกเพียงครั้งเดียว เช่น ไปทางขวา ผู้ติดต่อ A+C จะถูกปิดก่อน จากนั้นจึง B+C เมื่อหมุนเพลาด้วยการคลิกนี้ หน้าสัมผัสจะเปิดในลำดับเดียวกัน เมื่อเพลาหมุนไปในทิศทางอื่น ลำดับการปิดที่มีหน้าสัมผัส C จะเปลี่ยนไป เช่น เมื่อเลี้ยวซ้าย B+C แรก จากนั้น A+C จะปิด

การใช้ตัวเข้ารหัสในโครงการไมโครคอนโทรลเลอร์ เป็นไปได้ที่จะนำอินพุตข้อมูลหลายประเภทมาใช้โดยใช้ตัวเข้ารหัสเดียวกัน อย่างไรก็ตาม การดำเนินการนี้ต้องใช้คำติชมและการแสดงภาพเพื่อให้ผู้ใช้ทราบว่าข้อมูลที่เขาป้อนคืออะไร และตัวเข้ารหัสอยู่ที่ตำแหน่งใด

แผนภาพ

พินตัวเข้ารหัส A และ B เชื่อมต่อกับพอร์ตไมโครคอนโทรลเลอร์ RB4 และ RB5 พินตัวเข้ารหัส C เชื่อมต่อกับกราวด์ เป็นที่น่าสังเกตว่าต้องเชื่อมต่อตัวต้านทานแบบดึงขึ้นเข้ากับสายสัญญาณของพิน A และ B ไม่ใช่เรื่องบังเอิญที่ตัวเข้ารหัสเชื่อมต่อกับสาย I/O ที่ระบุของไมโครคอนโทรลเลอร์ ประการแรก พอร์ต B มีตัวต้านทานแบบดึงขึ้นในตัว และเราไม่จำเป็นต้องเชื่อมต่อตัวภายนอก และประการที่สอง พอร์ต B ของไมโครคอนโทรลเลอร์ มีฟังก์ชันที่มีประโยชน์มาก - "interrupt-on-change" - การหยุดชะงักโดยการเปลี่ยนระดับซึ่งจะทำให้เราสามารถตรวจสอบสถานะของตัวเข้ารหัสได้

ใช้ไฟ LED ธรรมดาขนาด 3 มม. จำนวน 16 ดวงเพื่อแสดงภาพข้อมูลอินพุต และจะติดตั้งอยู่บนแผงวงจรพิมพ์รอบๆ ตัวเข้ารหัสที่ติดตั้งไว้ LED เชื่อมต่อกับชิป A6276

ชิป A6276 เป็นไดรเวอร์ LED พร้อมอินพุตอนุกรม 16 บิต ไดรเวอร์ประกอบด้วย CMOS shift register 16 บิต แลตช์และไดรเวอร์ที่เกี่ยวข้องเพื่อควบคุม LED และสามารถขับเคลื่อน LED ได้มากกว่าที่ไมโครคอนโทรลเลอร์จะอนุญาต นอกจากนี้ ไดรเวอร์สามารถควบคุมผ่านอินเทอร์เฟซ SPI ซึ่งจะช่วยลดจำนวนสาย I/O ที่ใช้ และทำให้โปรเจ็กต์สามารถปรับขนาดได้

ซอฟต์แวร์ไมโครคอนโทรลเลอร์สำหรับการแก้ปัญหาของเรานั้นค่อนข้างง่าย มี 3 โหมดการทำงาน (ป้อนข้อมูล) และข้อเสนอแนะ:

  • โหมดการกำหนดตำแหน่ง 360° - ในโหมดนี้ ไฟ LED จะระบุ "ตำแหน่ง" ในปัจจุบันของตัวเข้ารหัส ผู้ใช้สามารถหมุนเพลาตัวเข้ารหัสไปทางซ้ายและขวาไปที่มุมใดก็ได้
  • โหมด "ระดับเสียง/ระดับ" - ในโหมดนี้ ไฟ LED จะแสดงค่าปัจจุบันระหว่างระดับต่ำสุดและสูงสุดของช่วงอินพุต (เช่น ระดับเสียงในอุปกรณ์เสียง)
  • โหมดสวิตช์โรตารี 3 ตำแหน่ง - ในโหมดนี้ จะมีตำแหน่งที่เลือกได้เพียงสามตำแหน่งเท่านั้นที่ผู้ใช้เลือกโดยการหมุนเพลาตัวเข้ารหัสไปทางซ้าย/ขวา

การสาธิตโครงการ

ดาวน์โหลด

ไฟล์ ZIP ที่มีโปรเจ็กต์ในสภาพแวดล้อม MPLAB และซอร์สโค้ดใน Hitech C รวมถึงแผนภาพวงจรและโทโพโลยีของแผงวงจรพิมพ์