background image

 

Architektura komputerów 

i systemy operacyjne 

 
 

Instrukcja do laboratorium nr 4 

 
 
 
Temat: 
Obsługa przetworników ADC w mikrokontrolerach  
rodziny STM32 

 
 

Opracował: Andrzej Poniecki 

Data: 09.11.2010 r. 

 
 
 
 
 
 
 
 
Spis treści 
 

1.  Wprowadzenie…................................................................................................. 2 

1.1. C

EL ĆWICZENIA

................................................................................................................. 2 

1.2. W

YMAGANIA 

................................................................................................................... 2 

1.3. P

RZYKŁADOWE PYTANIA KONTROLNE

..................................................................................... 2 

2.  Przykładowy program………………………………………………………………..... 2 

2.1. P

ODSTAWOWE CECHY PROJEKTU………………..

............................................................................. 5 

3.  Zadania do wykonania……………………………………………………………........ 5 

3.1. Z

ADANIE 1 (1 PUNKT)

........................................................................................................ 5 

3.2. Z

ADANIE 2 (2 PUNKTY)

....................................................................................................... 5 

3.3. Z

ADANIE 3 (2 PUNKTY)

....................................................................................................... 5 

3.4. Z

ADANIE 4 (2 PUNKTY)

....................................................................................................... 6 

 

background image

 

1. Wprowadzenie 

 

1.1. 

Cel ćwiczenia 

 
Celem ćwiczenia jest zapoznanie i nauczenie studentów korzystania z przetworników 

ADC i utrwalania umiejętności  programowania nabytych na poprzedzających ćwiczeniach 
laboratoryjnych. 

 

 

1.2.  

Wymagania

 

 

 

Podstawowa znajomość architektury mikrokontrolera STM32F103VBT6. 

 

Znajomość budowy i działania modułu przetworników ADC1 i 2. 

 

Podstawowa znajomość budowy i działania timerów mikrokontrolera 
STM32F103VBT6. 

 

Znajomość organizacji przerwań mikrokontrolerów Cortex-M3. 

 

Znajomość płyty laboratoryjnej ZL27ARM. 

  Podstawowa znajomość języka C. 

 
 

1.3.   

Przykładowe pytania kontrolne

 

 

  Narysuj schemat blokowy przetwornika ADC w mikrokontrolerach rodziny STM32. 

   Wymień tryby pracy ze względu na źródło wyzwolenia 

 

Opisz różnice wykorzystania grup kanałów  

  Określ minimalny czas przetwarzania i czynniki zależności 

 

Podaj liczbę kanałów pomiarowych, maksymalną częstotliwość sygnału zegara 
taktującego przetworniki oraz systemowego  

 

Do czego służy analogowy watchdog? 

 

Wymień źródła przerwań od przetworników 

 

Do czego służy proces kalibracji przetworników 

 

W jakim celu mogą być wykorzystywane przetworniki ADC mikrokontrolera STM32? 

 
 
 

2.  Przyk

ładowy program 

 

Nazwa pliku projektu -  Lab4_ACTimer. 

 
#include "stm32f10x.h" 
#include "lcd4bit.h" 
#include <stdio.h> 
 
void RCC_Conf(void); 
void NVIC_Conf(void); 
void GPIO_Conf(void); 
void TIMER1(void); 
void ADC1_Conf(void); 

background image

 

 
ADC_InitTypeDef ADC_InitStructure; 
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; 
TIM_OCInitTypeDef  TIM_OCInitStructure; 
 
uint16_t ADC1Val = 0; 
char wynik[7]; 
unsigned char a=0; 
 
int main(void) 

 

   

RCC_Conf();    

   

NVIC_Conf(); 

 

GPIO_Conf(); 

 

TIMER1(); 

 

ADC1_Conf(); 

 
   

LCD_Init(); 

  

LCD_Clear(); 

 
 

TIM1->CR1|= 0x00000001;   

 

//aktywacja timera TIM1 

 
   

while(1) 

   

 

 

ADC1Val = ADC_GetConversionValue(ADC1) * 0.807;    

 

 

sprintf(wynik, "%d,%03d V", ADC1Val / 1000, ADC1Val % 1000); 

 

 

LCD_Clear(); 

 

 

LCD_GoTo(0,0); 

 

 

LCD_SendText("NAPIECIE NA P1:"); 

 

 

LCD_GoTo(1,3); 

 

 

LCD_SendText((uint8_t*)wynik); 

 

 

delay_ms(500); 

   

 


 
void GPIO_Conf(void) 

 

GPIOA->CRL=0x44444444;  

// ustaw. wej. cyfrowe na PCA(3..0) 

 

GPIOB->CRH=0x33333333; 

// ustaw. sterow. diodami LED na PCB(15..8) 

 

GPIOC->CRL=0x44404444;  

// pomiar analog. na wej. PC4 


 
void RCC_Conf(void) 

 

 

//ustawia zewnetrzny oscylator na 8MHz 


   

RCC_DeInit(); 

 

  

 

 

// reset ustawien RCC 

 

RCC->CR=RCC_CR_HSEON; 

   

 

// wlaczenie HSE 

 

while((RCC_CR_HSERDY)==0);    

 

// czekaj az zewn. osc. sie ustabil. 

 
 

RCC->CFGR  = 0x00154400; 

 

 

// ustalenie prescalerów 

 

background image

 

     

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); 

     

FLASH_SetLatency(FLASH_Latency_2);    

// zwloka dla pamieci Flash 

 
 

RCC->CR |= 0x01000000;     

 

 

// wlaczenie PLL  

 

while((RCC_CR_PLLRDY)==0);    

 

// czekaj az PLL sie ustabil. 

 
 

RCC->CFGR |= 0x00000002;    

 

 

// wł. PLL na SYSCLK 

while(RCC_GetSYSCLKSource() != 0x08);  

// czekaj az PLL bedzie sygnalem 
//zegarowym systemu 

 
 

//wlaczenie sygn. zegara na peryferia 
RCC->APB2ENR=RCC_APB2ENR_IOPAEN|RCC_APB2ENR_IOPBEN 
|RCC_APB2ENR_IOPCEN|RCC_APB2ENR_TIM1EN|RCC_APB2ENR_ADC1EN; 

 

RCC->APB1ENR=RCC_APB1ENR_SPI2EN; 

 

// wlaczenie SPI dla LCD 


 
void NVIC_Conf(void) 

   

NVIC_InitTypeDef NVIC_InitStructure; 
#ifdef  VECT_TAB_RAM   

   

// Jezeli tablica wektorow w RAM, to ustaw jej adres na 0x20000000 

   

 

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);  

#else  // VECT_TAB_FLASH 

   

// W przeciwnym wypadku ustaw na 0x08000000 

   

 

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);    

#endif 

 
   

// Wlacz przerwanie od TIM1 

   

NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; 

   

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 

   

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 

   

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

   

NVIC_Init(&NVIC_InitStructure); 

 

 

 

 

 

 

 

 

 

 

  

 
void TIMER1(void) 

 

TIM1->PSC = 5599;   

 

 

 

//fclk = 56MHz/5600 = 10kHz 

 

TIM1->ARR = 9999;  

 

 

 

//podzielnik -> 10kHz 

 

TIM1->CR1|= 0x00000010;   

 

 

//dekrementcja licznika 

 

TIM1->DIER|= 0x00000002; 

 

 

//aktyw. przerwania od CC1 


 
void ADC1_Conf(void) 

 

ADC1->CR2|= 0x00100000;  

 

//wyzw. zewn. od TIM1 kanalu CC1, 

 

 

 

 

 

 

 

//wyrown. do prawej 

 

ADC1->SQR3|= 0x0000000E; 

 

//kanal 14  

 

ADC1->CR2|= 0x00000001;  

 

//aktywacja ADC1 

 

background image

 

 

ADC1->CR2|= 0x00000008;  

 

//reset kalibracji 

 

while((ADC_CR2_RSTCAL)==1);    

//czekaj na zakoncz. resetu kalibracji 

 
 

ADC1->CR2|= 0x00000004;  

 

//kalibracja 

 

while((ADC_CR2_CAL)==1); 

  

//czekaj na zakoncz. kalibracji 


 
2.1. 

Podstawowe cechy projektu 

 

Wykorzystywany  w  ćwiczeniu  jest  przetwornik  ADC1.  Mierzona  jest  wartość 

napięcia  na  potencjometrze  analogowym  dołączonym  do  pinu  PC4  mikrokontrolera. 
Ustawiona  jest  częstotliwość  sygnału  zegara  systemowego  na  56MHz.  Z  tego  sygnału,  po 
podzieleniu  częstotliwości  przez  4,  uzyskiwany  jest  sygnał  taktujący  przetworniki  ADC. 
Wyzwalanie  przetwornika  dokonywane  jest  od  timera  TIM1  z  okresem  1s.  Wartość 
zmierzonego napięcia przedstawiana jest na wyświetlaczu LCD. 

 

 

3.  Zadania do wykonania 
 

3.1. 

Zadanie 1  (1 punkt) 

 
W dostępnym projekcie ustawić częstość wyzwalania zgodnie z algorytmem: 

wyzw

  = 1[s] + 300 x  (nr stanowiska) 

i wysterować wybraną diodę LED sygnalizującą momenty dokonanych konwersji.  
 
 

3.2. 

Zadanie 2  (2 punkty) 
 

Wykorzystać analogowy watchdog do kontroli poziomu mierzonego napięcia. 

Ustalić wartości progów: 

dolny:    

Lprog

  = 0[V] + 0.15 x  (nr stanowiska) 

 

górny    

Hprog

  = 1.5[V] + 0.15 x  (nr stanowiska) 

 

Przekroczenie progów sygnalizować zaświeceniem wybranej diody LED.  

 
 

3.3. 

Zadanie 3  (2 punkty) 
 

Wykorzystując  grupę  kanałów  wstrzykiwanych  (injected  group)  dokonywać 

pomiarów  napięć  z  potencjometru  P1  i  czujnika  temperatury.  Wartości  zmierzonych  napięć 
przedstawiać na wyświetlaczu LCD. 

 

 
 
 
 

background image

 

3.4. 

Zadanie 4  (2 punkty) 
 
Wykorzystując  dostępny  projekt  (wyzwalanie  od  timera  1)  wprowadzić  procedurę 

wyzwalania  na  żądanie  (jednym  z  przycisków)  uaktywniając  programowe  (pending  bit
zgłoszenie aktywnego przerwania. 

Alternatywnym  zadaniem  jest  wykorzystanie  wspólne  przetworników  ADC1  i  2  do 

pomiaru napięć od źródeł jak w zadaniu 3.