개요 

 
 
STM32 의 내장 ADC 활용하는 방법. 



본 설명에서의 구체적인 상황. 


타겟칩 : STM32L4x6  
페리페랄 :  ADC  
타겟보드 : D1P123R1
개발 IDE : KEIL MDK-ARM 혹은 SW4STM32 모두 가능. STM32CubeMX 기반하여 ADC 설정처리하고 IDE 에서 코딩한다. 
참고 : STM32 는 모두 사용법이 비슷하니 위 세부 개발환경에 집착할 필요없음. 

 ADC 활용 방법 기본. 


STM32CubeMX 에서 ADC 기능 설정 처리완료하고, 이를 프로젝트 코드에 적용시키고 이를 IDE(SW4STM32 , KEIL MDK-ARM 등 ) 에서 필요한 ADC 제어함수 작성하여 활용한다. 


 


 


 

STM32CubeMX 에서 ADC 설정.

 

1. ADC 용으로 사용할 STM32 핀 지정. 


STM32 의 ADC 는 많은 핀들을 할당가능하긴 하나 동일핀을 다른 용도로도 설정가능하기 때문에 본격 회로 설계 전에 ADC 로 사용될 핀 설정이 가능한지 먼저 확인한 후 결정해야 한다. 

본 예에서는 외부에서 STM32 에서 AD변환해야할 아날로그 신호가 3개가 있으며 연결된 MCU 핀은 아래 와 같은 상황을 예로 든다. 

STM32 PC3 : 아날로그 전압 입력 1. 
STM32 PC4 : 아날로그 전압 입력 2. 
STM32 PC5 : 아날로그 전압 입력 3.  

2. ADC 입력단의 Differential, Single 지정. 

- 본예에서는 Single Ended 로 지정했다. 

3. ADC 에서 사용하는 클럭 설정. 


4. ADC 의 비트 해상도 설정. 

- 본예에서는 12비트로 설정하고 있다. 

상기 1, 2, 3, 4까지 모두 STM32CubeMX 에서 설정이 이뤄진다. 아래동영상에 전체 과정 모두 보이고 있다.
즉, 먼저 ADC입력으로 사용될 핀 지정부터 먼저 하고 ADC1 의 설정부에서 해당 핀의 입력 설정을 Single Ended 를 선택하고 있다.




위 동영상 59초 시점을 보면 4개의 핀 PC3, PC4, PC5 에 대응된 핀 네임이 각각 ADC1_IN4, ADC1_IN13, ADC1_IN14 로 대응되었다. 
코드에서 ADC 채널 선택하는 경우에는 이 핀네임으로 접근하게 된다. 

 


 


 

AD 변환 코드 작성. 

 

코드예. 
- AD변환 시험용으로 main 의 while 문내에 AD변환 구현예는 아래와 같다. 


 

uint32_t value_adc = 0;  // AD변환값 받아둘 변수

main()
{
... 중략.
  while (1)
  {
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
 HAL_ADC_Start(&hadc1); // AD 변환 시작한다. 
 HAL_ADC_PollForConversion(&hadc1,100); // AD변환 완료될때까지 대기한다.
    value_adc = HAL_ADC_GetValue(&hadc1);  // AD 변환 결과값을 받는다.

 HAL_Delay(1); // 1msec 대기.
  
  }
  /* USER CODE END 3 */
}


AD 변환 작동 확인. 

- AD 변환이 정상적으로 되고 있는지 확인하는 수단으로 입력한 아날로그 파형이 정상적으로 변환되고 있는지 확인하면된다. 

본예에서는 외부에 아날로그 신호 발생기로 파형을 인가하고 KEIL MDK-ARM 의 디버그 모드에서 Logic Analyzer 로 AD 변환 결과값(상기 코드 상의 value_adc) 을 플로팅하여 입력한 신호 그대로 정상적으로 변환중인지 확인하다. 


아래 동영상에서 디버거 ST LINK V2  연결된 상태에서, KEIL uVision 디버그 모드에서 변수 value_adc 의 값을 로직애널라이저로 관찰하는 과정을 보인다. 





 
 


 






본 글 포함 상위 정리 장소. 

 

1. https://igotit.tistory.com/244 의 STM32






첫등록 : 2018년 12월 10일.

최종수정 : 


본 글 단축주소 : https://igotit.tistory.com/1964






Posted by 리치굿맨

댓글을 달아 주세요

  1. byungha kim

    질문이 있습니다만
    채널을 4 , 13, 14 를 쓰셨는데
    세개의 채널이 각각 표현되나요 이 코드에서는??

    2020.10.29 09:20 [ ADDR : EDIT/ DEL : REPLY ]
    • 네 KEIL 의 로직 애널라이저 기능이 최대 4개 채널까지는 표현가능한데.. 채널수 1개 일때는 무난하게 표현되었던 것이 채널수 많고 샘플링 속도가 빠른 경우엔 비정상적으로 표현될거예요..

      2020.10.29 16:07 신고 [ ADDR : EDIT/ DEL ]
  2. stm초보

    글 잘 보았습니다. 궁금한게 있는데요.
    ADC핀을 3개 사용하셨는데요. 작성된 코드는 핀3 개를 각각 개별로 볼 수 있는 방법이 있나요?
    감사합니다.

    2020.12.30 09:12 [ ADDR : EDIT/ DEL : REPLY ]
    • ADC 는 실제 1개의 아날로그 입력을 받고 GPIO 와의 연결부에는 MUX가 있는 상태입니다. (상세 : https://igotit.tistory.com/1961 의 Channel 입력단 상세 부분 )

      MUX 설정하여 채널을 선택하는 개념이므로, 코드에서 원하는 채널 1개 선택된 상태에서 AD변환한 이후 그 다음 다른 채널 선택하고 AD변환 .. 이런 식으로 원하는 채널을 여러 개 변환할 수 있습니다.

      2020.12.30 10:40 신고 [ ADDR : EDIT/ DEL ]
  3. stm초보

    아 구조가 그랬었군요! 알려주셔서 정말 감사합니다.

    2020.12.31 13:56 [ ADDR : EDIT/ DEL : REPLY ]
  4. stmew

    안녕하세요 글 잘 보았습니다. 궁금한것이 있어 댓글 달아요.
    저는 전류센서값을 adc변환하려고 합니다. S1, S2 출력선을 가지고 양단 전압으로 전류량을 알수있는데요.
    이 출력값을 adc로 받을때, 센서의 두개의 출력선을 ADCx의 채널1,채널2에 각각 연결해주고 값을 보게 되는것인가요??

    2021.01.15 08:56 [ ADDR : EDIT/ DEL : REPLY ]
    • adc 변환시 채널 1개의 의미는 전압 신호 1개를 의미합니다. 전류센서의 출력전압은 1개의 신호이므로 채널 1개만 할당하면 됩니다.


      예1 .
      S1, S2 가 차동 전압 출력이라면 adc 앞단에 있는 mux 에서도 차동으로 설정하면 됩니다.

      S1 이 차동출력전압 (+) 이고 S2 가 (-) 라면
      https://igotit.tistory.com/1961
      의 채널 입력단 상세 그림에서 ADC123_INP1 을 S1 , ADC123_INN1 을 S2 에 연결하고 Channel Selection 에서 ADC 의 VINP 에 ADC123_INP1 , VINN 에 ADC123_INN1 이 연결되게 합니다.

      예2 .
      S1, S2 가 싱글엔디드 여서 S1 이 + 이고, S2 가 GND 라면 adc 앞단에 있는 mux 에서도 싱글엔디드로 설정합니다.

      https://igotit.tistory.com/1961
      의 채널 입력단 상세 그림에서 ADC123_INP1 을 S1 에만 연결하면 됩니다. Channel Selection 에서 ADC 의 VINP 에 ADC123_INP1 , VINN 에 VREF-가 연결되게 합니다. STM 주변회로 구성은 통상 VREF- 핀을 GND 와 연결해뒀을 겁니다.

      2021.01.15 22:12 신고 [ ADDR : EDIT/ DEL ]
    • differential/single-ended 결선에 대해 많이 헷갈렸는데 덕분에 궁금증이 해소된것 같습니다. 감사합니다ㅜㅜ

      2021.01.18 09:53 [ ADDR : EDIT/ DEL ]