====== 12. AD převodník ====== ===== Cíle cvičení ===== - 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í ===== {{ :courses:b2m37mam:labs:stm32f401re.pdf | Datasheet STM32F401 }} {{ :courses:b2m37mam:stm32f401_refmanual.pdf | Referenční manuál STM32F401 }} {{ :courses:b2m37mam:nucleo_64_pins.pdf | Datasheet Nucleo F401RE}} [[courses:b2m37mam:tutorials:dev_kits:nucleof401| Podklady pro Nucleo STM32F401]] {{ :courses:b2m37mam:labs:mam_2023-cviceni_12.pdf |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