Table of Contents

12. AD převodník

Cíle cvičení

  1. Nastavit analogově-digitální převodník v MCU, který bude po sériové lince posílat naměřené napětí do PC

Co je třeba si připravit

Podklady pro cvičení

Datasheet STM32F401

Referenční manuál STM32F401

Datasheet Nucleo F401RE

Podklady pro Nucleo STM32F401

Podklady pro 12. cvičení-Skalický

Projekty

Kódy pro cvičení

Konfigurace GPIO

void initGPIO_ADC()
{
    RCC->AHB1ENR |= 0x01;
 
    /* configure PA0 as ADC_IN0 */
    GPIOA->MODER   |=  0x03;     /* analog mode */
    GPIOA->OSPEEDR |=  0x03;     /* high speed */
}

Inicializace ADC

void initADC1()
{
    // initialize the ADC
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;		// enable ADC1 peripheral clock
    ADC->CCR = 0;                 // disable temperature sensor, ADC prescaler = HSI/2
 
    // 1st conversion in regular sequence will be from CH0
    // reset state - all conversions from CH0 (PA_0)
    ADC1->SQR3 &= ~ADC_SQR3_SQ1_Msk;
 
    ADC1->CR2 |= ADC_CR2_ADON;	// enable the ADC
}

Inicializace USART2

void init_USART2(void){
	RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
	GPIOA->MODER |= (GPIO_MODE_AF_PP << GPIO_MODER_MODE2_Pos) | (GPIO_MODE_AF_PP << GPIO_MODER_MODE3_Pos);
	GPIOA->AFR[0] |= (GPIO_AF7_USART2 << GPIO_AFRL_AFSEL2_Pos) | (GPIO_AF7_USART2 << GPIO_AFRL_AFSEL3_Pos);
 
	RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
	USART2->BRR = 8 << 4 | 11;		// baud = 115200 @ 16 MHz
	USART2->CR1 |= USART_CR1_TE;		// Transmitter enable
 
	USART2->CR1 |= USART_CR1_UE ;		// USART enable
}
 
void USART2_send_char(char c){
	while(!(USART2->SR & USART_SR_TXE));
	USART2->DR = c;
}

Hlavní program

int main() {
    HAL_Init();
    initGPIO_ADC();
    initADC1();
 
    while(1) {
      ADC1->CR2 |= ADC_CR2_SWSTART;		// software ADC start
      while (!(ADC1->SR & ADC_SR_EOC));         // wait until conversion end
      int value = ADC1->DR;
 
      char buffer[20];
      sprintf(buffer, "%d\n", value);
      for(int i = 0; i<strlen(buffer); i++){
    	  USART2_send_char(buffer[i]);
      }
 
      HAL_Delay(1000);
    }
}