ทำความเข้าใจกับ GPIO แอนะล็อกและดิจิตอล


11

ฉันพยายามที่จะเข้าใจ GPIO และได้อ่านบล็อกโพสต์ต่าง ๆ มากมายและฉันคิดว่าฉันใกล้จะเข้าใจแล้ว แต่ยังคงดิ้นรนกับบางสิ่ง

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


ตามด้วยคำตอบบางอย่าง ... ค่าไบนารีหมายถึงอินพุตหรือเอาต์พุตดิจิตอล มันอาจจะเป็น 1 (ซึ่งควรจะเป็นแรงดันแหล่งที่มาที่เรียกว่า "hi" หรือ "บน") หรือ 0 (หมายถึง 0V เรียกว่า "lo" หรือ "off") นั่นคือความละเอียด 1 บิต อินพุตแบบอะนาล็อกสามารถเป็นช่วงซึ่งโดยทั่วไปจะอยู่ระหว่าง 0V ถึง VCC (แรงดันไฟฟ้าต้นทาง) ชิปดิจิตอลที่มีความละเอียด 8 บิตจะแปลงสัญญาณอนาล็อกนี้เป็นสัญญาณดิจิตอล 8 บิตในช่วง 0 - 255 (ไบนารี: 00000000 - 11111111) เนื่องจาก 2 ^ 8 - 1 = 255 (ฐานสองหมายถึงฐาน 8 และ 8 มาจาก 8 บิต ส่วนและ "- 1" เนื่องจากเนื้อหาดิจิทัลเริ่มนับที่ 0 ไม่ใช่ 1)
Kurt E. Clothier

คำตอบ:


14

GPIO pin เป็น 'อินพุต / เอาต์พุตสำหรับวัตถุประสงค์ทั่วไป' นี่คือโดยค่าเริ่มต้นเท่านั้นสูงหรือต่ำ (ระดับแรงดัน, กำลังสูงของแรงดันไฟฟ้าของไมโครคอนโทรลเลอร์, ต่ำมักจะเป็นดินหรือ 0V) แต่ระดับของ 'สูง' และ 'ต่ำ' มักจะได้รับเป็นแรงดันไฟฟ้าตามสัดส่วนของแรงดันไฟฟ้า ดังนั้นอะไรก็ตามที่มักจะสูงกว่า 66% ของแรงดันไฟฟ้าถือว่าเป็นระดับตรรกะ 'สูง' ซึ่งหมายความว่าอุปกรณ์แรงดันไฟฟ้าต่ำบางอย่างสามารถพูดคุยกับอุปกรณ์ไฟฟ้าแรงสูงได้ตราบใดที่ระดับนั้นอยู่ในระดับ 'สูง' ตัวอย่างเช่นคอนโทรลเลอร์ไมโครคอนโทรลเลอร์ 1.8-2.7V หรือตัวรับพลังงาน GPS จะมีปัญหาในการสื่อสารโดยตรงไปยังไมโครคอนโทรลเลอร์ 5V เนื่องจากอุปกรณ์แรงดันต่ำมองว่า 'สูง' อุปกรณ์ไฟฟ้าแรงสูงจะไม่คิดว่ามันจะสูง นี่คือการใช้ GPIO เป็นพินอินพุต

บางครั้งคุณสามารถใช้พิน SINGLE สำหรับค่า 'อะนาล็อก' โดยการกำหนดค่า GPIO พินที่จะใช้โดยอุปกรณ์ออนบอร์ดอื่นเช่นตัวแปลง 'อนาล็อกเป็นดิจิตอล' (ADC) หมุดถูกตั้งค่าเป็นช่องบน ADC และทำหน้าที่เป็นอินพุตไปยัง ADC ตอนนี้ไม่ใช่พิน GPIO ปกติ จากนั้นคุณสามารถตั้งค่า ADC เป็นตัวอย่างและอ่านค่าการลงทะเบียนผลลัพธ์ของ ADC สำหรับตัวเลขเช่น 0-1024 หากความละเอียด 10 บิต

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

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

ในคอนโทรลเลอร์รุ่นใหม่เช่น ARM Cortex A8 และ A9 เหมือนกับใน Raspberry Pi และ BeagleBone คอนโทรลเลอร์ GPIO และตัวเลือกต่าง ๆ นั้นซับซ้อนมาก พวกเขาใช้สถาปัตยกรรมแบบ 32 บิตดังนั้นพิน GPIO ส่วนใหญ่จึงถูกจัดเรียงไว้ในบล็อคแบบ 32 พินแม้ว่าจะไม่สามารถใช้งานได้จริงทั้งหมด BeagleBone (ที่ฉันเคยทำงานมาก่อน) มีตัวเลือกที่ยอดเยี่ยมมากสำหรับพินจำนวนมากและบางครั้งคุณจะต้องใช้เครื่องมือ 'pin mux' ซึ่งช่วยให้คุณตั้งโหมดพิเศษของพินบางอย่างสำหรับสิ่งต่าง ๆ เช่น PWM, การจับชีพจร, เอาต์พุตไทม์มิ่ง, อินพุตสัญญาณอนาล็อก (ADC), และแม้กระทั่ง (ใน BeagleBone ต่อไป) การแมปกับตัวประมวลผลย่อยทางอุตสาหกรรมที่มีอยู่บนแกน ARM แต่ถือว่าเป็นโปรเซสเซอร์อิสระและต้องการการทำแผนที่พินของตัวเอง ที่จะเชื่อมต่อกับโลกภายนอก


คุณสามารถยกตัวอย่างว่า "ขา SINGLE สามารถใช้สำหรับค่า" แอนะล็อก "ได้อย่างไร
Pavel

@ JimJim2000 เป็นเพียงการเปิด / ปิดหรือ PWM ที่เหมาะสมผ่านตัวกรอง RC เพื่อสร้างแรงดัน "เฉลี่ย" แบบอะนาล็อกที่ราบรื่นบนเอาต์พุต
KyranF

7

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

PWM สลับอย่างรวดเร็วสลับเอาต์พุตจากเอาต์พุตสูงถึงเอาต์พุตต่ำ (จุด) เพื่อสร้างค่าเฉลี่ย (รอบการทำงาน) เพื่อให้สิ่งที่ดูเหมือนเป็นค่าแอนะล็อก โดยการสลับ Binary GPIO ที่รอบการทำงาน 50% (หรือ 128) ผลลัพธ์จะยังคงเป็นแบบไบนารี แต่เฉลี่ยโดยเฉลี่ยครึ่งทางระหว่างสูงและต่ำ

คิดถึงหลอดไฟ คุณเห็นมันเป็นเปิดหรือปิด แต่มันเปิดและปิดได้ 60 ครั้งต่อวินาทีเร็วมากจนคุณไม่สังเกตว่ามันกะพริบเร็วจริงๆ แต่เปิดและปิดหลอดไฟด้วยตนเองอย่างช้า ๆ และคุณสังเกตเห็นว่ามันกระพริบ โดย 255 มันหมายถึง 100% ในและน้อยกว่า 255 เป็นเศษส่วนของ 100% ใน

นั่นคือวิธีที่ GPIO แบบไบนารีสามารถทำหน้าที่เหมือนเข็มสถานะอนาล็อก 255


ขอบคุณ @ Passerby นั่นชัดเจนกว่ามาก ฉันไม่ได้ดูที่ arduino โดยเฉพาะ แต่เป็นราสเบอร์รี่ pi และสายสืบ สิ่งที่คุณกำลังพูดหมายความว่าพินใด ๆ สามารถมีค่าระหว่าง 0 ถึง 255 ได้หรือไม่ ฉันสับสนระหว่างเอกสารที่บอกว่าค่าสามารถเป็นเลขฐานสองกับคนอื่น ๆ ที่บอกว่าค่านั้นอาจเป็น 0-255
pedalpete

1
@pedalpete RPI และ Arduino มีจำนวนมากของการทับซ้อนกันในฝูงชนและความคิด แต่ A PWM จาก 0 ถึง 255 เป็นสิ่งที่ไม่แน่นอน อาจเป็น 0 ถึง 65535 หรือ 0 ถึง 16 0 ถึง 255 คือความแม่นยำ 8 บิต ที่ 255 หรือ 65535 หรืออะไรก็ตามที่เป็น 100% GPIO เท่านั้นที่มีไบนารีเปิดและปิด แต่คุณใช้ PWM เพื่อแกล้งทำว่าสามารถมีได้มากกว่าหรือปิด มันเป็นภาพลวงตาทางแสงที่มีประโยชน์และจงใจ
Passerby

2
หลอดไฟไม่กระพริบและดับที่ 60 ครั้งต่อวินาที ไส้หลอดร้อนขึ้นและคงความร้อนได้ดี
Scott Seidman

0

GPIO บิตสามารถเป็น 0 หรือ 1 พอร์ต GPIO 8 บิตทำจาก 8 บิตติดต่อกันสามารถอยู่ในช่วงระหว่าง 00000000 ถึง 11111111 หรือ 255 ทศนิยม สิ่งนี้เกี่ยวข้องกับแนวคิดของ "analog" เพียงเล็กน้อย


ขอบคุณสก็อตต์ถึงแม้ว่าฉันคิดว่าฉันสับสนมากขึ้นกว่า แต่ก่อน พอร์ต GPIO คืออะไร ถ้าฉันมี GPIO pin (ตัวอย่างบน Raspberry Pi) แต่ละขาถือว่าเป็นพอร์ตหรือไม่? หากเป็นเช่นนั้นแต่ละพินสามารถทำงานกับช่วงทศนิยม 0-255 ดังกล่าวหรือไม่
pedalpete

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