ADC
A : analog 온도,소리 와 같은 연속성
D : digital 0,1 비연속성
> ex) 사진 : 좌표로 나눠서 저장
ex)
온도계
측정기(쇳덩어리) : 온도가 오를때마다 저항값이 바뀜 or 기전력
// 스트레인게이지 : 체중계, 상하수도 변형 측정
> ADC > 몇 도 ( analog)일때 몇 V (digital) 를 나타냄
> 프로그래밍연산 > 온도계에 표시
ADC 의 변화과정
:필터링 > 샘플링(표본화) > 양자화 > 부호화
1. 필터링 > 노이즈 ( 갑자기 튀어오르는) 필터
2. x 축 : 시간
3 y 축 : 측정치
4. 01010101
> 3bit,, 10bit,, 12bit ADC 로 갈수록 좀 더 촘촘함( 경우의수 up )
ex) 5v > 12bit ADC : 5v 를 4096개로 쪼갬 > 측정시간만큼의 x 축생성
: x축은 영상,음악 쪽에선 중요 : bps
>> 동일한 조건에 동일하게 > 규칙적으로 저항값이 변하면 > 센서로 사용 가능
12bit ADC : 0~3.3v > 4096개로 쪼갬 m_voltage = (float) m_adc_value * 3.3f / 4095.0f
Vref :기준 +,- 의 최대범위
(DATASHEET)
1.8v < REF < VDDA 3.6
with ADCCLK
VDDA, VSSA 요즘엔 서로 호환
: Vcc, Vdd : +
: Vee, Vss : -
3. > ADC must be at 14,28,56 HZ 클럭사용
ADC mode
IN1 ,2,3,4,5,,6,,, 여러채널
data alignment : 우측정렬, 좌측정렬 > MSB, LSB
scan conversion mode 채널 전환을 쭈루룩
continuous " : 한번 conversion 후 계속 할건지 말건지
ADC regular ~ 레지스터 1개
> 1번 한뒤에 2번을 하면 덮어 씌여짐
// 채널 many 가능
ADC injected ~ 레지스터 4개
> 4개까지 각각의 레지스터
// 대신 채널 many 불가
타이머or sw 로 트리거 생성
워치독 > 인터럽트 발생
high 몇일때, low 몇일때..
DMA : direct memory access > 고속처리
DMA mode :
circular 순환하며 계속
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
: 폴링 : 문을계속 두들기며 다 될까지 기다림
m_adc_value = HAL_ADC_GetValue(&hadc1);
m_voltage = (float)m_adc_value *3.3f / 4095.0f;
멀티미터기 <> 디버깅
1.657 <> 1.73340654
>> 0.076 정도의 오차
상용화를 위해선,, 보정 해줘야함
if(m_adc_value >= 1){
m_voltage = (float)m_adc_value *3.3f / 4095.0f;
m_voltage += 0.076;
}else{
m_voltage = 0.0;
}
DMA 방식
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)m_data,1);
while (1)
{
if(m_data[0] >= 1){
m_voltage = (float)m_data[0] *3.294f / 4095.0f;
}else{
m_voltage = 0.0;
}
'임베디드 > 고추건조기' 카테고리의 다른 글
드디어 완성.. (1) | 2024.12.31 |
---|---|
완성 -1- (0) | 2024.12.18 |
SSD1306 코드분석 (0) | 2024.12.17 |
I2C hello world :) (0) | 2024.12.17 |
I2C 구조 (0) | 2024.12.15 |