본문 바로가기

[ST_MICRO]/STM32G0

#STM32G SSM - Arduino에서 11 채널 ADC 테스트

Arduino 에서 다채널 ADC 테스트를 하려고 했는데... 생각대로 잘 동작 하지 않는다. 

채널이 뒤죽박죽이고 값이 나오지 않는 채널도 있고...

 

Arduino에서 ADC를 어떻게 설정 하는지 한번 들여다 보자

 

우선 STM32G030의 핀맵설정에서 ADC 설정가는한 핀을 확인해 보면 UART, JTAG 빼면 11채널을 설정 가능하다.

 

 
Arduino에서 ADC 핀맵을 하기 위한 코드는 pins_arduino.c 에 있다. 
PinName analogInputToPinName(uint32_t pin)
{
  PinName pn = digitalPinToPinName(analogInputToDigitalPin(pin));
  if (pn == NC) {
    switch (pin) {
#if defined(ADC_CHANNEL_TEMPSENSOR) || defined(ADC_CHANNEL_TEMPSENSOR_ADC1)
      case ATEMP:
        pn = PADC_TEMP;
        break;
#endif
#if defined(ADC5) && defined(ADC_CHANNEL_TEMPSENSOR_ADC5)
      case ATEMP_ADC5:
        pn = PADC_TEMP_ADC5;
        break;
#endif
#ifdef AVREF
      case AVREF:
        pn = PADC_VREF;
        break;
#endif
#ifdef AVBAT
      case AVBAT:
        pn = PADC_VBAT;
        break;
#endif
      default:
        break;
    }
  }
  return pn;
}

 

digitalPin 에서 핀명을 받아오는데 variant.cpp 파일을 보면 핀맵 할당 된것을 확인 할 수 있는데... 내가 사용하는 STM32G0 20핀 과 좀 다르게 설정 되어 있다.
const PinName digitalPin[] = {
  PA_0,
  PA_1,
  PA_2,
  PA_8,
  PA_9,
  PA_10,
  PA_11,
  PA_12,
  PA_13,
  PA_14,
  PA_15,
  PB_0,
  PB_1,
  PB_5,
  PB_6,
  PB_7,
  PB_8,
  PB_9,
  PC_14,
  PF_2
};

 

 

[STM32G0 SSM EVM] 보드에 맞도록 핀맵을 다시 설정 해 보자.

// Pin number
const PinName digitalPin[] = {
	PA_0,	//0 SCLK
	PA_1,	//1 I2S_CK 2  
	PA_2,	//2 I2S_SD 3
	PA_3,	//3  MISO
	PA_4,	//4  MOSI
	PA_5,	//5   
	PA_6,	//6 I2S_MCK
	PA_7,	//7
	PB_0,	//8   
	PA_11,	//9 SCL
	PA_12,	//10 SDA
	PB_3,	//11  TXD  1
	PB_7,	//12 RXD  0
	PB_8,
	PB_9,	
	PC_14,	//14 SS
	PC_15,	//15 LED
	PC_14,
	PF_2,
};

 

 

그리고 ADC 핀맵도 설정해 주어야 한다.

WEAK const PinMap PinMap_ADC[] = {
  {PA_0,  ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0
  {PA_1,  ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1
  {PA_2,  ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2
  {PA_11, ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15
  {PA_12, ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC1_IN16
  {PA_3, ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3
  {PA_4, ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4  
  {PA_5, ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5
  {PA_6, ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6
  {PA_7, ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7  
  {PB_0,  ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8
  {PB_1,  ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9
  {PB_7,  ADC1,  STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11
  {NC,    NP,    0}
};

 

 

 

이렇게 설정하고 Arduino IDE에서 11채널 ADC값을 출력 하도록 코드를 작성해 보았다.

void setup()
{
  Serial.begin(115200);
  Serial.println("STM32G ADC Test");
  
  analogReadResolution(12);
  pinMode(PIN_OUT, OUTPUT);
}


int sensorValue;
int i;

void loop() {


  for(i=0;i<11;i++)
  {
    sensorValue = analogRead(A0+i);

    Serial.print(sensorValue);
    Serial.print(",");
  }

  Serial.print("\r\n");
  
  delay(10);
}

 

 

이제 의도 한대로 STM32G0의 11 채널 ADC값을 출력 하는것을 확인 할 수 있다.

 

반응형