คลาส 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() int

อ่านค่าบนพินแอนะล็อกและส่งคืนค่านั้น ค่าที่ส่งคืนจะอยู่ระหว่าง 0 ถึง 4095

read_timed(buf: bytearray | 'array.array', timer: Timer | int) int

อ่านค่าแอนะล็อกลงใน buf ด้วยอัตราที่กำหนดโดยอ็อบเจกต์ timer

buf สามารถเป็น 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 ที่อัตราการสุ่มตัวอย่างสูง การปิดใช้งานอินเทอร์รัปต์ตลอดระยะเวลาสามารถลดความเสี่ยงของการสูญเสียข้อมูลแบบประปรายได้