class DAC – 디지털-아날로그 변환

DAC는 두 개의 STM32 DAC 채널 중 하나에서 0 V와 3.3 V 사이의 아날로그 전압을 출력합니다.

pyb.DAC를 제공하는 모든 STM32 OpenMV Cam(M4 / M7 / H7 / H7 Plus / Pure Thermal)에서 채널은 다음과 같이 연결되어 있습니다:

DAC 채널

헤더 핀

STM32 핀

DAC(1)

(헤더에 없음)

PA4

DAC(2)

P6

PA5

OpenMV Cam N6에는 DAC 주변장치가 없습니다. 해당 보드에서는 pyb.DAC를 사용할 수 없습니다.

사용 예시:

from pyb import DAC

dac = DAC(1)            # create DAC channel 1
dac.write(128)          # write a value to the DAC (approximately 1.65 V)

dac = DAC(1, bits=12)   # use 12-bit resolution
dac.write(4095)         # output maximum value, 3.3 V

연속적인 사인파를 출력하려면:

import math
from pyb import DAC

# create a buffer containing a sine-wave
buf = bytearray(100)
for i in range(len(buf)):
    buf[i] = 128 + int(127 * math.sin(2 * math.pi * i / len(buf)))

# output the sine-wave at 400Hz
dac = DAC(1)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

12비트 해상도로 연속적인 사인파를 출력하려면:

import math
from array import array
from pyb import DAC

# 128-sample sine wave, half-word samples centred at 2048 (12-bit mid).
N = 128
buf = array("H", (
    2048 + int(2047 * math.sin(2 * math.pi * i / N))
    for i in range(N)
))

# Output the sine wave at 400Hz.
dac = DAC(1, bits=12)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

생성자

class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)

새 DAC 객체를 생성합니다.

portPin 객체이거나, DAC 채널 1 또는 2를 선택하는 정수(1 또는 2)일 수 있습니다. 각 채널이 라우팅되는 실제 핀은 OpenMV Cam에 따라 다릅니다.

bits는 해상도를 지정하는 정수로, 8 또는 12일 수 있습니다. write()write_timed()가 받아들이는 최댓값은 (2**bits) - 1입니다(8비트의 경우 255, 12비트의 경우 4095).

buffering 매개변수는 DAC 연산 증폭기(op-amp) 출력 버퍼의 동작을 선택하며, 이 버퍼의 목적은 출력 임피던스를 줄이는 것입니다. None으로 설정하면 기본값을 선택하고(DAC.noise(), DAC.triangle(), DAC.write_timed()에서는 버퍼링이 활성화되고 DAC.write()에서는 비활성화됨), False로 설정하면 버퍼링을 완전히 비활성화하며, True로 설정하면 출력 버퍼링을 활성화합니다.

버퍼링이 활성화되면 DAC 핀은 최소 5KΩ까지의 부하를 구동할 수 있습니다. 그렇지 않은 경우 최대 15KΩ의 출력 임피던스를 가지며, 결과적으로 버퍼링 없이 1% 정확도를 달성하려면 인가되는 부하가 1.5MΩ 미만이어야 합니다. 버퍼를 사용하면 특히 범위의 양 극단 부근에서 정확도에 손실이 발생합니다.

메서드

init(bits: int = 8, *, buffering: bool | None = None) None

DAC를 재초기화합니다. bits는 8 또는 12일 수 있습니다. bufferingNone, False 또는 True일 수 있으며, 이 매개변수의 의미는 위 생성자를 참조하십시오.

deinit() None

DAC를 해제하여 그 핀을 다른 용도로 사용할 수 있게 합니다.

noise(freq: int) None

의사 난수 노이즈 신호를 생성합니다. 주어진 주파수로 새로운 난수 샘플이 DAC 출력에 기록됩니다.

triangle(freq: int) None

삼각파를 생성합니다. DAC 출력 값은 주어진 주파수로 변하며 전체 12비트 범위를 거쳐 오르내립니다. 따라서 반복되는 삼각파 자체의 주파수는 8192배 더 작습니다.

write(value: int) None

DAC 출력에 직접 접근합니다. 최솟값은 0이고 최댓값은 (2**bits) - 1이며, 여기서 bits는 DAC 객체를 생성할 때 또는 init()을 통해 설정됩니다.

write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None

DMA 전송을 사용하여 RAM에서 DAC로의 버스트 전송을 시작합니다. 입력 데이터는 8비트 모드에서는 바이트 배열로, 12비트 모드에서는 부호 없는 하프워드 배열(배열 타입코드 ‘H’)로 취급됩니다.

freq는 Timer(6)을 사용하여 DAC 샘플을 기록할 주파수를 지정하는 정수일 수 있습니다. 또는 DAC 샘플을 트리거하는 데 사용되는 이미 초기화된 Timer 객체일 수도 있습니다. 유효한 타이머는 2, 4, 5, 6, 7, 8입니다.

modeDAC.NORMAL 또는 DAC.CIRCULAR일 수 있습니다.

두 DAC를 동시에 사용하는 예시:

dac1 = DAC(1)
dac2 = DAC(2)
dac1.write_timed(buf1, pyb.Timer(6, freq=100), mode=DAC.CIRCULAR)
dac2.write_timed(buf2, pyb.Timer(7, freq=200), mode=DAC.CIRCULAR)

상수

NORMAL: int

NORMAL 모드는 데이터 버퍼의 파형을 한 번 전송합니다.

CIRCULAR: int

CIRCULAR 모드는 데이터 버퍼의 파형을 전송하고 끝에 도달할 때마다 버퍼의 시작으로 되돌아가며, deinit()이 호출될 때까지 연속적인 루프를 생성합니다.