LinkedIn YouTube Facebook
Szukaj

Wstecz
IoT

STM32 i czujnik koloru TCS3200

Poniżej przedstawiono fragment programu głównego stworzonej aplikacji.

int main(void)
{
	//konfiguracja
	Configuration_RCC();
	Configuration_Interrupts();
	Configuration_GPIO();

	//ustawienie nEO
	TCS3200_DISABLE;
	//wybranie filtru - Clear
	TCS3200_Clear;
	//ustawienie skali częstotliwości
	TCS3200_Freq_20p;
	//włączenie diod LED
	TCS3200_LED_ON;

	//konfiguracja licznika
	TIM_TimeBaseStructure.TIM_Period = 999;
	TIM_TimeBaseStructure.TIM_Prescaler = 0;
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

	//konfiguracja sygnału
	TIM_TIxExternalClockConfig(TIM2, TIM_TIxExternalCLK1Source_TI1, TIM_ICPolarity_Rising, 0x0);

	//wlaczenie licznika
	TIM_Cmd(TIM2, ENABLE);

	//pobranie informacji o częstotliwości
	RCC_GetClocksFreq(&RCC_Clocks);

	//konfiguracja SysTick
	SysTick_Config(RCC_Clocks.SYSCLK_Frequency/100);

	//inicjalizacja wyświetlacza modułu KAmodLCD1
	PCD8544_INIT();
	PCD8544_LCDClear();

	//aktualizacja informacji wyświetlanych na wyświetlaczu
	PCD8544_LCDWriteText("KAmodColor",12,0);
	PCD8544_LCDWriteText("Clear 00,0 kHz",0,1);		//14
	PCD8544_LCDWriteText("Red 00,0 kHz",6,2);		//12
	PCD8544_LCDWriteText("Green 00,0 kHz",0,3);		//14
	PCD8544_LCDWriteText("Blue 00,0 kHz",3,4);		//13
	PCD8544_LCDWrite();

	//nieskończona pętla
	while (1)
	{
		//aktualizacja informacji, filtr - Clear
		tmp = FreqClear;
		PCD8544_LCDWriteSign((tmp % 10) + 0x30,60-6*1,1);
		tmp = tmp / 10;
		PCD8544_LCDWriteSign((tmp % 10) + 0x30,60-6*3,1);
		tmp = tmp / 10;
		PCD8544_LCDWriteSign((tmp % 10) + 0x30,60-6*4,1);

		...

		//aktualizacja danych wyświetlanych na LCD
		PCD8544_LCDWrite();
	}
}

Na początku programu przeprowadzana jest konfiguracja zegarów, przerwań oraz linii GPIO. W kolejnym kroku przeprowadzane jest ustawienie poszczególnych linii, realizowane jest to przy wykorzystaniu definicji bardziej złożonych operacji, definicje operacji znajdują się w pliku defines.h projektu. Dla przykładu definicja polecenia TCS3200_DISABLE przedstawia się następująco:

GPIO_TCS3200->BSRR = GPIO_BSRR_BS(TCS3200_PIN_nOE)

Funkcja GPIO_BSRR_BS także jest definicją, która w połączeniu z parametrem generuje nazwę bitu rejestru BSRR. Tak duża liczba definicji zwiększa czytelność kodu oraz powoduje, że w prowadzenie zmian (np. odnośnie połączenia linii) sprowadza się do zmiany paru wartości w jednym miejscu całego projektu. W zależności od warunków można zmienić ustawienia zakresu częstotliwości oraz ustawić we własnym zakresie czy diody LED mają być zapalone, czy zgaszone.

W następnym kroku przeprowadzana jest inicjalizacja licznika, przeprowadzana jest ona w klasyczny sposób. Jak wiadomo w programie będzie realizowany pomiar częstotliwości poprzez zliczanie impulsów. W przypadku mikrokontrolerów z rodziny STM32 mamy możliwość skonfigurowania licznika tak aby sygnał podawany był z zewnątrz. Właśnie za to odpowiada polecenie:

TIM_TIxExternalClockConfig(TIM2, TIM_TIxExternalCLK1Source_TI1, TIM_ICPolarity_Rising, 0x0);

Powyższe polecenie powoduje, że sygnałem zegarowym licznika TIM2 staje się sygnał podawany na linię kanału pierwszego licznika TIM2 (w tym przypadku jest to pin PA0), natomiast zliczanie odbywa się na zboczu narastającym. Następnie włączany jest licznik TIM2.

W kolejnym kroku mamy pobranie częstotliwości poszczególnych linii zegarowych i zapisanie ich to struktury RCC_Clocks. W wyniku tego działania w następnym kroku konfigurowane jest przerwanie SysTick w taki sposób aby występowało 100 w ciągu sekundy, uzyskano to poprzez podzielenie częstotliwości sygnału, jakim taktowany jest licznik SysTcik, przez 100. Podczas obsługi przerwania realizowany jest odczyt licznika, występowanie przerwania z taką częstotliwością sprawia, iż odczytany wynik jest wielokrotnością 102Hz.