본문 바로가기

카테고리 없음

[STM32H757-RP] STM32H7 16bit ADC 테스트

 

STM32H7 시리즈 MCU는 16비트 해상도의 ADC를 3개 내장하고 있다. 16비트 해상도 이면 3.3 V / 65536 = 50 µV 까지 측정할 수 있다. 물론 ENOB(Effective number of bits)로 따지면 13.8bit 까지 가능하다고 한다.

 

기존 12비트 ADC에 비해 향상된 정확도와 낮은 노이즈를 제공 한다고 한다. STM32H7는 2배에서 1024배까지 조절 가능한 하드웨어 오버샘플링 엔진을 내장하고 있어 데이터 평균화를 통해 SNR을 향상시킬 수 있으며, 소프트웨어 구현에 비해 CPU 부하를 줄이고 소비 전력을 낮출 수 있다. 하드웨어 오버샘플링을 통해 NOB기준 15.3bit 까지 가능하다.

 

 

STM32H7는 싱글-엔드 및 차동 신호를 모두 변환할 수 있다. 차동 모드는 공통 모드 노이즈 제거 및 동적 범위 증가의 이점을 제공하여 SNR을 6 dB, 해상도를 1 비트 향상시킬 수 있다.

이외에도 STM32H7에서 ADC관련 다양한 성능 향상있지만 우선 16bit ADC로 성능 테스트를 해보자.

목표는 1mV 해상도로 전압 흔들림 없이 측정해서 출력하면 사용처가 많을것 같다.

 

STM32H757-RP 보드의 확장 테스트 보드에는 16bit ADC를 테스트 할수 있는 터미널 블럭이 있고 다양한 ADC 채널을 테스트 해 볼수 있다. 

 

 

STM32CubeIDE 를 이용해 ADC를 선택하면 16bit ADC로 해상도 및 ADC관련 다양한 설정을 할 수 있다.

 

 

 

 

STM32H7에서 16bit ADC로 업그레이드 되었지만 코드는 기존 코드와 동일하게 작성할 수 있다. 가장 간단한 폴링 방식으로 ADC값을 읽어 보자

unsigned int GetAdcValue(void)
{
	unsigned int adc;

	HAL_ADC_Start(&ADC_HANDLE);
    HAL_ADC_PollForConversion(&ADC_HANDLE, 100);

   	adc =  HAL_ADC_GetValue(&ADC_HANDLE);

    return adc;
}

 

 

 

int main(void)
{

  /* USER CODE BEGIN 1 */
	unsigned int adc_value = 0;
  /* USER CODE END 1 */
/* USER CODE BEGIN Boot_Mode_Sequence_0 */
  int32_t timeout;
/* USER CODE END Boot_Mode_Sequence_0 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

/* USER CODE BEGIN Boot_Mode_Sequence_1 */
  /* Wait until CPU2 boots and enters in stop mode or timeout*/
  timeout = 0xFFFF;
  while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) != RESET) && (timeout-- > 0));
  if ( timeout < 0 )
  {
  Error_Handler();
  }
/* USER CODE END Boot_Mode_Sequence_1 */
  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();
/* USER CODE BEGIN Boot_Mode_Sequence_2 */
/* When system initialization is finished, Cortex-M7 will release Cortex-M4 by means of
HSEM notification */
/*HW semaphore Clock enable*/
__HAL_RCC_HSEM_CLK_ENABLE();
/*Take HSEM */
HAL_HSEM_FastTake(HSEM_ID_0);
/*Release HSEM in order to notify the CPU2(CM4)*/
HAL_HSEM_Release(HSEM_ID_0,0);
/* wait until CPU2 wakes up from stop mode */
timeout = 0xFFFF;
while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) == RESET) && (timeout-- > 0));
if ( timeout < 0 )
{
Error_Handler();
}
/* USER CODE END Boot_Mode_Sequence_2 */

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC3_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  	adc_value = GetAdcValue();
    printf("ADC = %d, %fV\n",  adc_value, ((3.3*adc_value)/(65535)));


	  Led2Toggle();
	  HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

 

 

기본적으로 STM32H7에서 16bit ADC가 출력 되는것은 확인 된다.

ADC = 19554, 0.984637V
ADC = 19565, 0.985191V
ADC = 19640, 0.988968V

 

이제 좀더 다양한 옵션들을 이용하여 정밀도를 높혀서 측정해 보자.

 

ADC결과값의 흔들림이 많다.

16비트라 그런가? 

이부분은 좀더 들여다 봐야 할것 같다. 오버샘플링과 필터링을 통해서 좀더 안정될 수 있도록 해보자

 

반응형