임베디드/고추건조기

ADC

twoweeks-within 2024. 12. 24. 17:40

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