ฉันจะทำให้ Arduino ใช้ตัวเข้ารหัสแบบหมุนได้แม่นยำแค่ไหน


15

มอเตอร์สเต็ปเปอร์มักจะมีราคาแพงสำหรับมอเตอร์ขนาดใหญ่ อย่างไรก็ตามด้วยมอเตอร์กระแสตรงที่ทรงพลังและเข้ารหัสแบบหมุนคุณสามารถ "จำลอง" สเต็ปเปอร์มอเตอร์ เครื่องเข้ารหัส Rotary กับ Arduino มีความแม่นยำเพียงใดกับวงวนพื้นฐานและโค้ดอื่น ๆ ไม่มาก? มันจะ "คิดถึงการเต้นของชีพจร" และบันทึกการหมุนไม่เพียงพอหรือไม่? ฉันจะจัดการกับโค้ดนี้ได้มากขึ้นได้อย่างไร มีวิธีที่ดีกว่าในการทำเช่นนี้? การขัดจังหวะจะช่วยไหม มีวงจรบางประเภทที่จะช่วยแก้ไขปัญหานี้หรือไม่?

หมายเหตุ: อาจจะไม่เกิน 4 รอบการหมุนต่อวินาที ... (อาจเป็นจำนวนมาก แต่ถ้าคุณกำลังทำกลไกแบบสกรูนำที่จะเป็น 24 นิ้วต่อนาทีเท่านั้นหากมีการหมุนเชิงเส้น 10 ครั้งต่อนิ้ว )


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

คำตอบ:


10

การขัดจังหวะเป็นสิ่งที่คุณจะใช้ในสถานการณ์นี้

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

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

มีฟังก์ชั่นชื่อattachInterrupt()ซึ่งจะใช้เวลาสามข้อโต้แย้ง

  1. PIN ขัดจังหวะ
  2. รูทีนการบริการขัดจังหวะ
  3. โหมด

ด้านล่างเป็นตัวอย่างสำหรับการนับการขัดจังหวะ

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

โหมดมีดังนี้:

ต่ำเปลี่ยนเพิ่มขึ้นตกหล่น

ข้อมูลเพิ่มเติมเกี่ยวกับการใช้การขัดจังหวะสามารถพบได้ที่นี่

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

แก้ไข นี่คือตัวอย่างโค้ดจาก Arduino Sandbox สำหรับการใช้โปรแกรมเปลี่ยนไฟล์โรตารี


1
ตัวตรวจจับขอบที่ถูกขัดจังหวะโดยใช้การขัดจังหวะบน Duemilanove สามารถจัดการกับ 100 ขอบต่อวินาทีได้อย่างง่ายดาย (6500 รอบต่อนาทีบนมอเตอร์)
เดินทางคนแปลกหน้า

@WayfaringStranger ดังนั้นจึงไม่มีปัญหากับ Uno แล้ว ขอบคุณ!
ไม่ระบุชื่อเพนกวิน

1
@AnnonomusPerson - คุณเต็มใจทำงานมากแค่ไหน? หากคุณไปเปล่า ( ISR_NAKED()) คุณสามารถข้ามการบันทึกบริบท C อัตโนมัติและดึงอัตราการขัดจังหวะ 100-500 Khz โดยไม่มีปัญหา แต่โดยทั่วไปคุณเขียนการชุมนุมใน C ณ จุดนั้น
Connor Wolf

1
ถ้าคุณต้องการอย่างสมบูรณ์ banannas เอกสารเกี่ยวกับการเพิ่มประสิทธิภาพอึแน่นอนจากการตอบสนองการขัดจังหวะดูที่นี่ วางรหัสโดยตรงในตารางขัดจังหวะเพื่อลดความล่าช้าในการขัดจังหวะ!
Connor Wolf

1
นอกจากนี้โปรดทราบว่าหากคุณกำลังขัดจังหวะเวลาแฝงต่ำฟังก์ชั่น arduino attachInterrupt จะแทรกค่าใช้จ่ายการเรียกใช้ฟังก์ชันเพิ่มเติมทั้งหมดเมื่อเทียบกับการใช้การขัดจังหวะISR()โดยตรง
Connor Wolf

3

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

การอ่านตัวเข้ารหัสแบบหมุน: http://playground.arduino.cc/Main/RotaryEncoders

Encoder Quadrature เร็วเกินไปสำหรับ Arduino (พร้อมโซลูชัน): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

ไลบรารี Encoder Teensy: https://www.pjrc.com/teensy/td_libs_Encoder.html

การอ่านตัวเข้ารหัสแบบหมุนบน Arduino: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.