คลาส ADC -- การแปลงค่าแอนะล็อกเป็นดิจิทัล¶
การใช้งาน:
import pyb
adc = pyb.ADC("P6")
val = adc.read()
ดู pyb.ADCAll สำหรับการเข้าถึงช่อง ADC ทุกช่องพร้อมกัน รวมถึงเซนเซอร์อุณหภูมิไดภายใน VBAT และ VREFINT ของ MCU
ตัวสร้าง¶
- class pyb.ADC(pin: int | str | Pin)¶
สร้างอ็อบเจกต์ ADC ที่เชื่อมโยงกับพินที่กำหนด ทำให้สามารถอ่านค่าแอนะล็อกบนพินนั้นได้
เมธอด¶
- read_timed(buf: bytearray | 'array.array', timer: Timer | int) int¶
อ่านค่าแอนะล็อกลงใน
bufด้วยอัตราที่กำหนดโดยอ็อบเจกต์timerbufสามารถเป็น bytearray หรือ array.array เป็นต้น ค่า ADC มีความละเอียด 12 บิตและจัดเก็บลงในbufโดยตรงหากขนาดองค์ประกอบมี 16 บิตหรือมากกว่า หากbufมีองค์ประกอบเพียง 8 บิต (เช่น bytearray) ความละเอียดของตัวอย่างจะลดลงเหลือ 8 บิตtimerควรเป็นอ็อบเจกต์ Timer และจะอ่านตัวอย่างทุกครั้งที่ตัวจับเวลาทำงาน ตัวจับเวลาต้องถูกกำหนดค่าและกำลังทำงานที่ความถี่การสุ่มตัวอย่างที่ต้องการก่อนเพื่อรองรับพฤติกรรมเดิมของฟังก์ชันนี้
timerยังสามารถเป็นจำนวนเต็มที่ระบุความถี่ (เป็น Hz) ในการสุ่มตัวอย่างได้ ในกรณีนี้ Timer(6) จะถูกกำหนดค่าให้ทำงานที่ความถี่ที่กำหนดโดยอัตโนมัติตัวอย่างการใช้อ็อบเจกต์ Timer (วิธีที่แนะนำ):
adc = pyb.ADC(pyb.Pin.board.P6) # create an ADC on pin P6 tim = pyb.Timer(6, freq=10) # create a timer running at 10Hz buf = bytearray(100) # buffer to hold the samples adc.read_timed(buf, tim) # sample 100 values, taking 10s
ตัวอย่างการใช้จำนวนเต็มสำหรับความถี่:
adc = pyb.ADC(pyb.Pin.board.P6) # create an ADC on pin P6 buf = bytearray(100) # buffer of 100 bytes adc.read_timed(buf, 10) # read 100 samples at 10Hz (10s total) for val in buf: print(val)
ฟังก์ชันนี้ไม่จัดสรรหน่วยความจำฮีปใดๆ มีพฤติกรรมแบบบล็อก: จะไม่กลับไปยังโปรแกรมที่เรียกจนกว่าบัฟเฟอร์จะเต็ม
- static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool¶
ดึงข้อมูลเวลาสัมพัทธ์หรือข้อมูลเฟสจาก ADC หลายตัว
อ่านค่าแอนะล็อกจาก ADC หลายตัวลงในบัฟเฟอร์ด้วยอัตราที่กำหนดโดยอ็อบเจกต์ timer ทุกครั้งที่ตัวจับเวลาทำงาน ตัวอย่างจะถูกอ่านอย่างรวดเร็วจาก ADC แต่ละตัวตามลำดับ
อินสแตนซ์ ADC และบัฟเฟอร์ถูกส่งในทูเพิลโดยแต่ละ ADC มีบัฟเฟอร์ที่เชื่อมโยงด้วย บัฟเฟอร์ทั้งหมดต้องมีชนิดและความยาวเท่ากัน และจำนวนบัฟเฟอร์ต้องเท่ากับจำนวน ADC
บัฟเฟอร์สามารถเป็น
bytearrayหรือarray.arrayเป็นต้น ค่า ADC มีความละเอียด 12 บิตและจัดเก็บลงในบัฟเฟอร์โดยตรงหากขนาดองค์ประกอบมี 16 บิตหรือมากกว่า หากบัฟเฟอร์มีองค์ประกอบเพียง 8 บิต (เช่นbytearray) ความละเอียดของตัวอย่างจะลดลงเหลือ 8 บิตtimer ต้องเป็นอ็อบเจกต์ Timer ตัวจับเวลาต้องถูกกำหนดค่าและกำลังทำงานที่ความถี่การสุ่มตัวอย่างที่ต้องการก่อน
OpenMV Cam ที่ใช้ STM32 เปิดเผยเพียงหนึ่งพินส่วนหัวที่รองรับ ADC (
P6) ดังนั้นบนฮาร์ดแวร์มาตรฐานread_timed_multiจะมีประโยชน์เฉพาะกับ ADC ตัวเดียว ต่อสายอินพุตแอนะล็อกเพิ่มเติมผ่านการอ้างอิงcpuของpyb.Pinเพื่อใช้กับ ADC มากกว่าหนึ่งตัวตัวอย่างการอ่าน ADC หนึ่งตัว:
import array adc = pyb.ADC(pyb.Pin.board.P6) tim = pyb.Timer(8, freq=100) rx = array.array("H", (0 for i in range(100))) # Sample 100 values at 100Hz (takes one second). pyb.ADC.read_timed_multi((adc,), (rx,), tim) for val in rx: print(val)
ฟังก์ชันนี้ไม่จัดสรรหน่วยความจำฮีปใดๆ มีพฤติกรรมแบบบล็อก: จะไม่กลับไปยังโปรแกรมที่เรียกจนกว่าบัฟเฟอร์จะเต็ม
ฟังก์ชันคืนค่า
Trueหากได้รับตัวอย่างทั้งหมดด้วยเวลาที่ถูกต้อง ที่อัตราการสุ่มตัวอย่างสูง เวลาที่ใช้ในการรับชุดตัวอย่างอาจเกินคาบเวลาของตัวจับเวลา ในกรณีนี้ฟังก์ชันจะคืนค่าFalseซึ่งบ่งชี้ว่าสูญเสียความแม่นยำในช่วงเวลาตัวอย่าง ในกรณีรุนแรงอาจพลาดตัวอย่างบางส่วนอัตราสูงสุดขึ้นอยู่กับปัจจัยต่างๆ รวมถึงความกว้างของข้อมูลและจำนวน ADC ที่กำลังอ่าน ในการทดสอบ ADC สองตัวถูกสุ่มตัวอย่างที่อัตราตัวจับเวลา 210kHz โดยไม่เกิด overrun และพลาดตัวอย่างที่ 215kHz สำหรับ ADC สามตัวขีดจำกัดอยู่ที่ประมาณ 140kHz และสำหรับสี่ตัวอยู่ที่ประมาณ 110kHz ที่อัตราการสุ่มตัวอย่างสูง การปิดใช้งานอินเทอร์รัปต์ตลอดระยะเวลาสามารถลดความเสี่ยงของการสูญเสียข้อมูลแบบประปรายได้