Warning
This page is located in archive.

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í

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);
    }
}

courses/b2m37mam/labs/12.txt · Last modified: 2023/12/12 21:55 by nentvond