ADC 모듈, 센서값 측정

Hyun Ho An·2024년 1월 19일

최근에 노로바이러스 크리가 터져서 엄청 아픈 휴유증으로 블로그에 많이 신경을 못썻는데 이제 다시 시작해야지... 다들 건강합니다 허허

어쨋든 이제 GUI제작도 많이 완성되었고, 센서 데이터를 받아오는 것이 프로젝트의 가장 큰 목표이니 센서를 하나 둘 건드려 보기 시작했다. 하지만 역시 하드웨어 공부를 너무 어렵다.... 더 열심히해서 좋은 개발자가 되야지 허허

ADC 모듈

해당 프로젝트에서는 ads1150 모듈을 사용하였다.

ADC 모듈을 공부하면서 배운것들 정리

분해능 Resolution

디지털 출력을 한 등급만큼 변화시키기 위한 아날로그 입력의 최소 변화
ex) 0~10V Full Scale , 4bit ADC converter
-> 10/2^4 : 풀스케일이 높으면 분해능은 낮아지고, 비트수가 크면 분해능이 작아진다.
비트: 데이터 출력 범위 0~2^n-1

해당 개념은 엔코더 데이터 시트를 볼 때도 나와서 반가웠다.

Sampling rate

Analog-to-digital converter is the speed at which it samples an Analog waveform or signal.
Ex) 1초에 10번 샘플하면 10Hz

ADC 모듈의 Sampling rate만 높다고 좋은 것이 아닌 내가 사용하고 있는 센서가 주는 데이터의 주기도 확인하여야하고, 보드의 샘플링 주기도 확인해야한다.

나의 경우 센서에서 30Hz(데이터시트에는 40이라 적혀있었지만, 통신에서 좀 많이 늦어지는 것 같았다.) 샘플링 주기를 가지고 있기 때문에 ads1150 모듈에서 860Hz의 주기를 가지고 있어도 데이터 송신이 늦기 때문에 적당한 사양을 사용하면 된다.

그리고 피코에서 ADC 주기가 엄청 빠른데 상관없지만 3채널을 추가로 사용하여야하기 때문에 모듈을 사용하였다.

Nyquist frequency

aliasing

엘리어싱 컴퓨터 그래픽에서 해상도의 한계로 선 들이 우둘투둘하게 되는 현상인데, 사인파를 디지털 컨버트한다고 생각하면 아날로그 신호값을 변환할 때 디지털 출력이 완벽하게 사인파가 아닌 계단 형식으로 변환되는 것을 의미한다.

센서 측정

센서는 광섬유를 사용하여 수중의 산소 농도를 측정한다. 센서에서 출력되는 값이 아주 작기 때문에 amplifier도 추가로 설치하여야한다.

이번에 사용한 amplifier는 pyroscience에서 나온 FSO2이다. 내가 튜닝을 하지 않았지만 해당 증폭기를 PC에 연결해서 설정하여야하는데 GUI 좀 그지같다...(이런 말해도 되나?)

어쨌든 amplifier + 산소 농도 센서를 12V 전압을 가변 dcdc 컨버터를 사용해 5V로 맞추고 ADC 모듈에 연결해서 사용하였다.

측정 코드

import utime
from machine import I2C, Pin

#I2C Pin setting
dev = I2C(1, scl = Pin(7), sda = Pin(6))

print( dev.scan())

address = 72

def readConfig():
    dev.writeto(address,bytearray([1]))
    result = dev.readfrom(address,2)
    
    return result[0]<<8 | result[0]

def readValueFrom(channel):
    config = readConfig()
    
    config &= ~(7<<12) #clear MUX bits
    config &= ~(7<<9) #clear PGA
    
    config |= (7&(4+channel))<<12
    config |= (1<<15)
    config |= (1<<9)
    
    config = [int(config>>i & 0xff) for i in [8,0]]
    
    dev.writeto(address, bytearray([1] + config))
    
    config = readConfig()
    while (config & 0x8000) == 0:
        config = readConfig()
        
    dev.writeto(address, bytearray([0]))
    result = dev.readfrom(address,2)
    
    return result[0]<<8 | result[0]

val = [0,0]

while True:
    val[0] = readValueFrom(0) #Chanel
    val[1] = readValueFrom(1)
    val[2] = readValueFrom(2)
    val[3] = readValueFrom(3)
    
    print(val)
    
    utime.sleep(0.03)

별거없다... 그냥 데이터 출력한 것이다...

profile
한국해양대학교/인공지능공학부

0개의 댓글