ฉันสามารถใช้ GPIO สำหรับการปรับความกว้างพัลส์ (PWM) ได้หรือไม่?


97

ฉันสามารถใช้ GPIO เป็นเอาต์พุตการปรับความกว้างพัลส์ได้หรือไม่

ถ้าเป็นเช่นนั้นฉันจะทำอย่างไรและฉันสามารถมีเอาต์พุต PWM ที่แตกต่างกันในเวลาเดียวกันได้อย่างไร


คุณอาจต้องระบุรุ่นที่คุณใช้ พวกเขาต่างกันเล็กน้อย
not2qubit

2
@ user1147688 คำถามนี้ถูกถามกลับเมื่อมีเพียงหนึ่งรุ่น!
berry120

คำตอบ:


76

ที่แนะนำโดยอเล็กซ์แชมเบอร์เลนที่WiringPiห้องสมุดปรากฏให้การสนับสนุนทั้งการส่งออกฮาร์ดแวร์ PWM ในหนึ่งหรือสองขา GPIO ขึ้นอยู่กับรุ่นและPWM ซอฟแวร์ใด ๆ ของหมุด GPIO อื่น ๆ ในขณะเดียวกันห้องสมุด RPIO.PWMก็ทำ PWM โดยDMAบนพิน GPIO ใด ๆ ได้อย่างมีประสิทธิภาพนี้เป็นบ้านครึ่งทางระหว่างฮาร์ดแวร์และซอฟแวร์ PWM ให้ 1 ไมโครวินาทีความละเอียดเวลาเมื่อเทียบกับ 100 ไมโครวินาทีกับ WiringPi ของซอฟท์แว PWM [1]

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

หากแอปพลิเคชันของคุณทนต่อความละเอียดต่ำและความกระวนกระวายใจสูงคุณสามารถใช้ซอฟต์แวร์หรือลูปช่วย DMA หากคุณต้องการความแม่นยำสูง / ความกระวนกระวายใจ PWM ที่ต่ำกว่าคุณอาจต้องการความช่วยเหลือด้านฮาร์ดแวร์

ซอฟต์แวร์ PWM จะเหมาะกับเมื่อใด

หากคุณต้องการกระพริบไฟ LED หลายพวงพร้อมกระดึบสายตาที่แตกต่างกันของมนุษย์ (10 เฮิร์ตซ์) ด้วยความต้องการการตอบสนองแบบเรียลไทม์ซอฟท์แวร์สามารถจัดการ PWM ได้มากเท่าที่คุณมีหมุด GPIO

เมื่อใดที่ PWM ของฮาร์ดแวร์จะเหมาะ

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

servo loop ที่เสถียรจำเป็นต้องอ่าน encoders ในอัตราปกติ (ตัวกระวนกระวายใจต่ำ) เขียนค่าเอาต์พุต PWM ที่ได้รับการแก้ไขในอัตราปกติและเวลาแฝงระหว่างสิ่งเหล่านี้ควรได้รับการแก้ไข หากคุณไม่สามารถทำสิ่งนี้ได้คุณจะต้องดำเนินการปรับแต่งมอเตอร์แบบนุ่มนวลเพื่อป้องกันไม่ให้โหลดไม่เสถียร นี่เป็นเรื่องยากที่จะทำกับระบบปฏิบัติการแบบมัลติทาสกิ้งโดยไม่มีการสนับสนุนในระดับต่ำ

จะทำอย่างไรถ้าฉันต้องการเอาต์พุตฮาร์ดแวร์ 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 ในการรันมอเตอร์กระแสตรงได้หรือไม่
gideon

@gideon - ใช่แล้วแอมพลิฟายเออร์กำลังมอเตอร์ที่ฉันใช้มี PWM ทั้งหมดเป็นอินพุตของพวกเขา
Mark Booth

2
FYI, ห้องสมุด RPI ( pythonhosted.org/RPIO/pwm_py.html ) ดูเหมือนว่าจะมีความละเอียดที่ดีกว่า (1us) เมื่อเทียบกับ WiringPi ที่มีความละเอียด 100us
dm76

@ MarkBooth - ไม่มีปัญหา ห้องสมุดเขียนได้ดีมากและสามารถใช้แทน drop-in สำหรับ RPi.GPIO ซึ่งมีประโยชน์มากถ้าคุณเริ่มต้นโปรเจคด้วยหลังและรู้ว่าจำเป็นต้องใช้สัญญาณ PWM ในภายหลัง ...
dm76

ฉันคิดว่า RPIO.PWM ไม่สามารถใช้งานกับ pi รุ่นใหม่กว่าได้อีก
ทุ่งหญ้า

39

ฮาร์ดแวร์ PWM

ใช่มีเอาต์พุตฮาร์ดแวร์ PWM หนึ่งรายการใน Raspberry Pi เชื่อมต่อกับ P1-12 (GPIO18) นอกจากนี้สามารถเพิ่มเอาต์พุต PWM โดยใช้I²Cหรืออินเตอร์เฟสSPI ; บางคนประสบความสำเร็จกับสิ่งนี้ ( โพสต์ฟอรัม )

รหัสตัวอย่าง

คุณสามารถใช้ไลบรารี WiringPiเพื่อควบคุมพิน PWM; คุณสามารถดูรหัสเพื่อหลีกเลี่ยงการรวมไลบรารีทั้งหมด

ซอฟต์แวร์ PWM

Raspberry Pi ไม่เหมาะสำหรับซอฟต์แวร์ PWM ที่รุนแรงเนื่องจาก Linux ไม่ใช่ระบบปฏิบัติการแบบเรียลไทม์


1
คำถามคำจำกัดความหรือตัวอย่างของซอฟต์แวร์อย่างจริงจัง PWM คืออะไร? และอะไรคือ "ระบบปฏิบัติการแบบเรียลไทม์" และมีโอกาสที่จะได้รับหนึ่งใน Pi
AnthonyBlake

@AnthonyBlake ดีคุณอาจควบคุมความสว่างของแสงโดยใช้ซอฟต์แวร์ PWM แต่ฉันสงสัยว่ามอเตอร์จะหยุดทำงาน ไม่จำเป็นต้องทำซอฟต์แวร์ PWM แต่ฮาร์ดแวร์นั้นง่ายกว่าและมีประสิทธิภาพมากกว่า Google จะอธิบายระบบปฏิบัติการแบบเรียลไทม์ได้ดีขึ้น พวกเขารับประกันบางสิ่งเกี่ยวกับระยะเวลาและซอฟต์แวร์ที่ใช้งานบ่อยครั้ง
อเล็กซ์แชมเบอร์เลน

2
@AnthonyBlake "Real-Time OS" (RTOS) เป็นระบบปฏิบัติการที่ให้การรับประกันกับคุณในการ จำกัด เวลาดำเนินการ เช่นบอกโปรแกรม "ใช่คุณจะมีเวลาดำเนินการใน 33ms (ให้หรือใช้ความอดทน 2 มิลลิวินาที) เพื่อพลิก GPIO pin bit เพื่อให้สัญญาณมอเตอร์ของคุณในหน้าต่างเวลาแน่นอนเมื่อเขาต้องการและคุณสามารถวางใจได้ บนนั้น! " มี RT Linux อยู่ตรงนั้น ไม่ทราบว่ามันถูกส่งไปยัง RPi แล้วหรือยัง
orithena

ขออภัย Alex ฉันไม่ได้ตั้งใจขโมยคำตอบของคุณอีกส่วนหนึ่ง แต่ฉันเพิ่งสังเกตเห็นว่าเรามาที่โพสต์ฟอรัมเดียวกันผ่านเส้นทางที่แตกต่างกัน
Mark Booth

2
รุ่นใหม่ที่มี 40 พินมีการเชื่อมต่อฮาร์ดแวร์ PWM ตัวที่สองกับ GPIO19 (พิน 35)
เควิน

12

Pis ล่าสุดมีสองช่องสัญญาณ PWM ของฮาร์ดแวร์ นอกจากนี้พัลส์ PWM ที่หมดเวลาของฮาร์ดแวร์อาจถูกสร้างขึ้นอย่างอิสระใน GPIO ทั้งหมดที่เชื่อมต่อกับส่วนหัวการขยาย 40 พิน

ในทางปฏิบัติหมายความว่ามีสองช่องสัญญาณ PWM ที่มีความแม่นยำสูงและ GPIO อื่น ๆ ทั้งหมดอาจมี PWM สไตล์ Arduino (800 Hz, ปิด 0 - 255 เต็มเปิด)

เช่นservoblasterและpigpioของฉันเป็นต้น


คำตอบที่ดี! ฉันจะใช้ HW PWM สองตัวเหล่านั้นได้อย่างไร ฉันต้องการควบคุมเซอร์โว 2 ตัวฉันรู้ว่าคุณบอกว่า servoblaster และ pigpio นั้นโอเค แต่ฉันแค่สงสัยเกี่ยวกับ HW PWM เพราะฉันไม่สามารถหาอะไรเกี่ยวกับพวกเขาได้ ... มีเอกสารบางอย่างสำหรับที่นั่นหรือไม่ ฉันมี RPi 2 V1.1 สำหรับการทดสอบ
Kozuch

1
C , งูหลาม , สายหมูคำสั่ง
joan

2
ภาระของ CPU ที่หนักมากไม่ควรสร้างความแตกต่าง โหลดเครือข่ายจำนวนมากสามารถสร้างความแตกต่างให้กับ gpioServo โดยเฉพาะอย่างยิ่งหากสุ่มตัวอย่างที่ 1MHz แทนที่จะเป็น 200kHz เริ่มต้น ความถี่คือ 50 (Hz) ช่วงของรอบการทำงานจะเป็น 0 - 1000000 (แมปกับค่าพื้นฐานจริงของ 0 - 5000000) 1 ms คือ 1 ms ใน 20 ms ดังนั้น dutycycle 5% ดังนั้น 50000, 1.5ms-> 7.5% -> 75000, 2ms-> 10% -> 100000
joan

1
หน้า 102 ของอุปกรณ์ต่อพ่วง BCM2835 ARMแสดงโหมดต่างๆที่ GPIO สามารถกำหนดได้ ดูออนไลน์ที่ GPIO นำไปสู่ส่วนหัวของส่วนขยายโมเดล Pi ต่างๆ
joan

1
@ user1147688 PLLD (500MHz) ใช้เป็นนาฬิกา PWM หลัก เนื่องจากวิธีการ "ใช้งาน" ความถี่หลักของ PWM คือ 250 MHz เพื่อให้สามารถเปิดและปิด (สิ่งจำเป็นสำหรับ PWM) สูงสุดคือ 125 MHz คุณสามารถเพิ่มตัวเลขเป็นสองเท่าได้โดยใช้ PLLC (1000 MHz) แต่ PLL จะแปรผันตามความเร็วสัญญาณนาฬิกาหลัก
joan

2

ไม่ใช่ OS แบบเรียลไทม์ แต่RISC OSสำหรับ Raspberry Pi เป็นระบบมัลติทาสก์ที่ทำงานร่วมกันดังนั้นคุณจึงสามารถเรียกใช้แอปพลิเคชันที่มี CPU 100% ได้อย่างง่ายดายเพื่อให้คุณสามารถจัดการเวลาได้ดีขึ้น อย่าคาดหวังว่าจะทำอะไรอย่างอื่นนอกจากรหัสของคุณเอง


ฉันอ่านบางแห่งว่ามีการ จำกัด ฮาร์ดแวร์ตามความถี่การสลับของเอาต์พุตขาเช่นกัน ฉันคิดว่ามันประมาณ 20 MHz ดังนั้นอย่าคาดหวังว่าจะสามารถดึง 300 MHz PWM หรืออะไรทำนองนั้นได้แม้จะใช้งาน CPU 100%
Ponkadoodle

@ Wallacoloo: แอปพลิเคชันใดที่ต้องการ 300 MHz PWM
Peter Mortensen

2
@PeterMortensen: ฉันไม่รู้ว่าเครื่องส่งสัญญาณวิทยุและวิธีสร้างสัญญาณของพวกเขา แต่บางคนอาจทำด้วย PWM PiFM ทำเช่นนั้นที่ 100 MHz ที่ดูเหมือนจะขัดแย้งกับความคิดเห็นของฉันแม้ว่าฉันจึงสงสัยว่าบางทีอาจจะยังคงได้รับคำสั่งพินที่ความถี่นั้น แต่มันเป็นเพียงที่ความจุพินลดทอนสัญญาณดังกล่าวเพื่อให้ 100 MHz สแควร์คลื่นอาจแกว่งจริงจากเช่น (1.0 V 2.3 V) แทนช่วงเต็ม (0 V, 3.3 V)
Ponkadoodle

2

ฉันพบไลบรารีนี้ ( pi-blaster ) ซึ่งอ้างว่า "มีประสิทธิภาพมาก: ไม่ใช้ CPU และให้ความเสถียรสูง"

ฉันยังไม่ได้ทดสอบ แต่จะอัปเดตทันทีที่ฉันทำ (อาจเป็นวันนี้)


ฉันได้ลองแล้ว แต่ก็ยังไม่มีโชค เท่าที่ฉันสามารถบอกได้ว่ามันไม่ได้เปลี่ยนฮาร์ดแวร์จริงหรือ
MrMowgli

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