คลาส Encoder -- ตัวถอดรหัส quadrature¶
คลาส Encoder ห่อหุ้มบล็อกฮาร์ดแวร์ i.MX RT QENC ที่กำหนดค่าเป็นตัวถอดรหัส quadrature ติดตามสัญญาณสองเฟส (phase_a / phase_b) ที่มาจาก rotary encoder เพิ่มหรือลดตัวนับตำแหน่ง 32 บิตตามความสัมพันธ์ของเฟส และสามารถรวมกับอินพุต index / reset เสริมสำหรับการอ้างอิงตำแหน่งแบบสัมบูรณ์
ใช้ได้เฉพาะบน OpenMV Cam RT1062 (พอร์ต mimxrt) เท่านั้น สำหรับ OpenMV Cam ที่ใช้ STM32 ให้ใช้ pyb.Timer ที่กำหนดค่าสำหรับโหมด encoder (Timer.ENC_AB) แทน ไม่เปิดเผยบน OpenMV Cam AE3 (พอร์ต alif)
ตัวอย่างการใช้งาน:
from machine import Pin, Encoder
enc = Encoder(0, Pin("P0", Pin.IN), Pin("P1", Pin.IN), phases=4)
enc.value(0)
# ... rotate the encoder ...
print("position:", enc.value())
ตัวสร้าง¶
- class machine.Encoder(id: int, phase_a: Pin | None = None, phase_b: Pin | None = None, *, phases: int = 1, filter_ns: int = 0, max: int | None = None, min: int = 0, index: Pin | None = None, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None)¶
สร้าง (หรือดึง singleton สำหรับ) บล็อก encoder QENC ที่ระบุด้วย
idอาร์กิวเมนต์เดียวกันนี้ยังได้รับโดยinit()เพื่อกำหนดค่าใหม่ให้กับอินสแตนซ์ที่มีอยู่phase_a/phase_bคือพินอินพุต quadrature สองตัวphases(keyword-only) เลือกความละเอียดของการถอดรหัส QENC รองรับ1(นับหนึ่งขอบต่อคู่พัลส์),2(ทั้งสองขอบของเฟส A) หรือ4("4x decoding" -- นับทุกขอบของทั้งสองเฟส) ค่าเริ่มต้น1filter_ns(keyword-only) -- เวลาที่อินพุตต้องคงที่ขั้นต่ำในหน่วยนาโนวินาที ไดรเวอร์จะใช้ตัวกรองฮาร์ดแวร์ที่ยาวที่สุดที่น้อยกว่าหรือเท่ากับค่านี้0(ค่าเริ่มต้น) จะปิดการกรองmax/min(keyword-only) -- ช่วง modulo ของตัวนับตำแหน่ง เมื่อตัวนับเกินmaxจะวนกลับไปที่minและตัวนับรอบจะเพิ่มขึ้น (ลดลงเมื่อเคลื่อนที่ทางอื่น) การส่งทั้งสองเป็น0จะปิดการใช้ช่วงindex(keyword-only) --Pinที่ขอบขาขึ้นจะโหลดตัวนับตำแหน่งกลับไปที่minและอัปเดตตัวนับรอบตามทิศทาง โดยทั่วไปใช้เป็นเครื่องหมาย Z-channel บน rotary encoderreset(keyword-only) --Pinที่ขอบขาขึ้นจะโหลดตัวนับตำแหน่งกลับสู่ค่าเริ่มต้น (โดยไม่เปลี่ยนตัวนับรอบ)match(keyword-only) -- ค่าตำแหน่งที่ทำให้เกิดอินเทอร์รัปต์IRQ_MATCHส่งNoneเพื่อปิดการใช้งานmatch_pin(keyword-only) --Pinที่ถูกขับให้เป็น high ขณะที่ตัวนับตำแหน่งเท่ากับmatchและเป็น low ในกรณีอื่นเมธอด¶
- init(phase_a: Pin | None = None, phase_b: Pin | None = None, *, phases: int = 1, filter_ns: int = 0, max: int | None = None, min: int = 0, index: Pin | None = None, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None) None¶
เริ่มต้น encoder ใหม่ด้วยพารามิเตอร์ที่กำหนดและรีเซ็ตตัวนับตำแหน่งและรอบ รับ keyword arguments เดียวกันกับตัวสร้าง
- deinit() None¶
หยุด encoder ปิดการใช้งานอินเทอร์รัปต์ที่รอดำเนินการ และปล่อยทรัพยากรฮาร์ดแวร์ QENC การ soft reset จะดีอินิเชียลไลซ์อินสแตนซ์
Encoderทั้งหมดโดยอัตโนมัติ
- value() int¶
- value(value: int, /) int
รับหรือตั้งค่าตัวนับตำแหน่งแบบมีเครื่องหมาย
เมื่อไม่มีอาร์กิวเมนต์ จะคืนค่าตำแหน่งปัจจุบัน
เมื่อมีอาร์กิวเมนต์
valueเพียงตัวเดียว จะตั้งค่าตัวนับตำแหน่งเป็นvalueแบบอะตอมิกและคืนค่าการนับก่อนหน้า สำนวนทั่วไปenc.value(0)รีเซ็ตตัวนับที่จุดเริ่มต้นของช่วงการวัด
- cycles() int¶
- cycles(value: int, /) int
รับหรือตั้งค่าตัวนับรอบ ซึ่งเป็นจำนวนเต็มแบบมีเครื่องหมาย 16 บิตที่ติดตามจำนวนครั้งที่ตัวนับตำแหน่งเกิน
max/minเมื่อไม่มีอาร์กิวเมนต์ จะคืนค่าการนับรอบปัจจุบัน
เมื่อมีอาร์กิวเมนต์
valueเพียงตัวเดียว จะตั้งค่าตัวนับรอบเป็นvalue(โดยไม่แตะต้องตัวนับตำแหน่ง) และคืนค่าการนับก่อนหน้า
- irq(handler: Callable[[Encoder], None] | None = None, trigger: int = 0, hard: bool = False) None¶
ลงทะเบียนคอลแบ็กเพื่อเรียกใช้เมื่อเหตุการณ์ QENC ที่รองรับเกิดขึ้น ตัวจัดการรับออบเจ็กต์
Encoderเป็นอาร์กิวเมนต์เพียงตัวเดียว สามารถระบุเหตุการณ์เฉพาะภายในตัวจัดการได้ผ่านirq.flags()triggerคือบิตมาสก์ของค่าคงที่IRQ_*หนึ่งค่าหรือมากกว่า:IRQ_RESET-- พินresetถูกยืนยันIRQ_INDEX-- พินindexถูกยืนยันIRQ_MATCH-- ตัวนับตำแหน่งถึงmatchแล้ว Match เป็นแบบ one-shot และต้องเปิดใช้ใหม่ด้วยการติดตั้ง IRQ ใหม่IRQ_ROLL_OVER-- ตัวนับตำแหน่งวนจากmaxไปยังminIRQ_ROLL_UNDER-- ตัวนับตำแหน่งวนจากminไปยังmax
hard=Trueลงทะเบียนตัวจัดการอินเทอร์รัปต์แบบ hard (เวลาแฝงต่ำกว่า แต่ตัวจัดการต้องไม่จัดสรรหน่วยความจำ) ค่าเริ่มต้นคือ scheduled callback ส่งhandler=Noneเพื่อปิดการใช้งานอินเทอร์รัปต์
ค่าคงที่¶