====== 9. 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
===== 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 cvičení - Skalický}}
===== 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