1
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
2
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);
3
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
4
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
5
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:
t
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:
U
Lprog
= 0[V] + 0.15 x (nr stanowiska)
górny
U
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.
6
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.