ฉันสามารถใช้ GPIO เป็นเอาต์พุตการปรับความกว้างพัลส์ได้หรือไม่
ถ้าเป็นเช่นนั้นฉันจะทำอย่างไรและฉันสามารถมีเอาต์พุต PWM ที่แตกต่างกันในเวลาเดียวกันได้อย่างไร
ฉันสามารถใช้ GPIO เป็นเอาต์พุตการปรับความกว้างพัลส์ได้หรือไม่
ถ้าเป็นเช่นนั้นฉันจะทำอย่างไรและฉันสามารถมีเอาต์พุต PWM ที่แตกต่างกันในเวลาเดียวกันได้อย่างไร
คำตอบ:
ที่แนะนำโดยอเล็กซ์แชมเบอร์เลนที่WiringPiห้องสมุดปรากฏให้การสนับสนุนทั้งการส่งออกฮาร์ดแวร์ PWM ในหนึ่งหรือสองขา GPIO ขึ้นอยู่กับรุ่นและPWM ซอฟแวร์ใด ๆ ของหมุด GPIO อื่น ๆ ในขณะเดียวกันห้องสมุด RPIO.PWMก็ทำ PWM โดยDMAบนพิน GPIO ใด ๆ ได้อย่างมีประสิทธิภาพนี้เป็นบ้านครึ่งทางระหว่างฮาร์ดแวร์และซอฟแวร์ PWM ให้ 1 ไมโครวินาทีความละเอียดเวลาเมื่อเทียบกับ 100 ไมโครวินาทีกับ WiringPi ของซอฟท์แว PWM [1]
สิ่งใดที่เหมาะกับแอปพลิเคชันของคุณขึ้นอยู่กับจำนวนเอาต์พุต PWM ที่คุณต้องการและประสิทธิภาพที่คุณต้องการจากเอาต์พุตเหล่านั้น
หากแอปพลิเคชันของคุณทนต่อความละเอียดต่ำและความกระวนกระวายใจสูงคุณสามารถใช้ซอฟต์แวร์หรือลูปช่วย DMA หากคุณต้องการความแม่นยำสูง / ความกระวนกระวายใจ PWM ที่ต่ำกว่าคุณอาจต้องการความช่วยเหลือด้านฮาร์ดแวร์
หากคุณต้องการกระพริบไฟ LED หลายพวงพร้อมกระดึบสายตาที่แตกต่างกันของมนุษย์ (10 เฮิร์ตซ์) ด้วยความต้องการการตอบสนองแบบเรียลไทม์ซอฟท์แวร์สามารถจัดการ PWM ได้มากเท่าที่คุณมีหมุด GPIO
หากคุณต้องการควบคุมเซอร์โวมอเตอร์ด้วยข้อกำหนดการตอบกลับแบบเรียลไทม์อย่างหนักคุณจะต้องใช้ฮาร์ดแวร์ PWM ถึงแม้ว่าคุณอาจมีปัญหาในการรับรองการตอบสนองแบบเรียลไทม์สำหรับเซอร์โวลูปซึ่งเชื่อมโยงอินพุตตัวเข้ารหัสเข้ากับเอาต์พุต PWM
servo loop ที่เสถียรจำเป็นต้องอ่าน encoders ในอัตราปกติ (ตัวกระวนกระวายใจต่ำ) เขียนค่าเอาต์พุต PWM ที่ได้รับการแก้ไขในอัตราปกติและเวลาแฝงระหว่างสิ่งเหล่านี้ควรได้รับการแก้ไข หากคุณไม่สามารถทำสิ่งนี้ได้คุณจะต้องดำเนินการปรับแต่งมอเตอร์แบบนุ่มนวลเพื่อป้องกันไม่ให้โหลดไม่เสถียร นี่เป็นเรื่องยากที่จะทำกับระบบปฏิบัติการแบบมัลติทาสกิ้งโดยไม่มีการสนับสนุนในระดับต่ำ
หากคุณจำเป็นต้องใช้เซอร์โวลูปมากกว่าที่คุณมี PWM ผลฮาร์ดแวร์แล้วคุณอาจจะต้อง offload พวกเขาไปยังอุปกรณ์อื่นเพื่อให้ประสิทธิภาพจริงเวลาที่ยากผลักไสราสเบอร์รี่ Pi ของคุณจะเป็นแบบ real-time นุ่มบังคับบัญชา
ตัวเลือกหนึ่งจะเป็นอะไรที่เหมือนAdafruit 16-Channel 12-bit PWM / Servo Driver - อินเตอร์เฟสI²C - PCA9685ซึ่งจะช่วยให้คุณสามารถควบคุมเอาต์พุต PWM 16 ด้วย GPIO เพียงไม่กี่พินสำหรับI²Cบัส สำหรับตัวอย่างการใช้งานดูที่I²C 16 Channel PWM / Servo Breakout -โพสต์ที่ใช้งานได้บนฟอรัม Raspberry Pi
1. ขอขอบคุณที่dm76สำหรับข้อเสนอแนะ แต่ทุ่งหญ้าบอกว่า RPIO.PWM อาจไม่ทำงานสำหรับรุ่นปี่ใหม่
ใช่มีเอาต์พุตฮาร์ดแวร์ PWM หนึ่งรายการใน Raspberry Pi เชื่อมต่อกับ P1-12 (GPIO18) นอกจากนี้สามารถเพิ่มเอาต์พุต PWM โดยใช้I²Cหรืออินเตอร์เฟสSPI ; บางคนประสบความสำเร็จกับสิ่งนี้ ( โพสต์ฟอรัม )
คุณสามารถใช้ไลบรารี WiringPiเพื่อควบคุมพิน PWM; คุณสามารถดูรหัสเพื่อหลีกเลี่ยงการรวมไลบรารีทั้งหมด
Raspberry Pi ไม่เหมาะสำหรับซอฟต์แวร์ PWM ที่รุนแรงเนื่องจาก Linux ไม่ใช่ระบบปฏิบัติการแบบเรียลไทม์
Pis ล่าสุดมีสองช่องสัญญาณ PWM ของฮาร์ดแวร์ นอกจากนี้พัลส์ PWM ที่หมดเวลาของฮาร์ดแวร์อาจถูกสร้างขึ้นอย่างอิสระใน GPIO ทั้งหมดที่เชื่อมต่อกับส่วนหัวการขยาย 40 พิน
ในทางปฏิบัติหมายความว่ามีสองช่องสัญญาณ PWM ที่มีความแม่นยำสูงและ GPIO อื่น ๆ ทั้งหมดอาจมี PWM สไตล์ Arduino (800 Hz, ปิด 0 - 255 เต็มเปิด)
เช่นservoblasterและpigpioของฉันเป็นต้น
ไม่ใช่ OS แบบเรียลไทม์ แต่RISC OSสำหรับ Raspberry Pi เป็นระบบมัลติทาสก์ที่ทำงานร่วมกันดังนั้นคุณจึงสามารถเรียกใช้แอปพลิเคชันที่มี CPU 100% ได้อย่างง่ายดายเพื่อให้คุณสามารถจัดการเวลาได้ดีขึ้น อย่าคาดหวังว่าจะทำอะไรอย่างอื่นนอกจากรหัสของคุณเอง
ฉันพบไลบรารีนี้ ( pi-blaster ) ซึ่งอ้างว่า "มีประสิทธิภาพมาก: ไม่ใช้ CPU และให้ความเสถียรสูง"
ฉันยังไม่ได้ทดสอบ แต่จะอัปเดตทันทีที่ฉันทำ (อาจเป็นวันนี้)