LinkedIn YouTube Facebook
Szukaj

Wstecz
IoT

ZL27ARM: detekcja kolorów za pomocą czujnika TCS3200

Sygnał wyjściowy czujnika TCS3200D ma postać przebiegu prostokątnego o stałym wypełnieniu i zmiennej częstotliwości. Do pomiaru częstotliwości użyto TIMER2 mikrokontrolera, który sprawdzany jest sekwencyjnie w odpowiednim czasie wyznaczonym przez SYSTICK w celu odczytania liczby impulsów przypadających na  jednostkę czasu, a tym samym wyznaczenia wartości składowych światła. Konfiguracja liczników TIM2 oraz SYSTICK przebiega jak poniżej:

//konfiguracja licznika TIM2
TIM_TimeBaseStructure.TIM_Period = 9999;
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 taktujacego TIM2
TIM_TIxExternalClockConfig
(TIM2, TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising, 0x0);

//wlaczenie licznika
TIM_Cmd(TIM2, ENABLE);

//pobranie informacji o częstotliwosci
RCC_GetClocksFreq(&RCC_Clocks);

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

Po wykonaniu konfiguracji timerów oraz wyświetlacza LCD program w nieskończonej pętli przekształca dane dla odpowiedniego filtru koloru pobrane z licznika TIM2 w obsłudze przerwania SYSTICK na 4 jednocyfrowe cyfry w kodzie ASCII. Przykładowy kod dla zmiany liczby czterocyfrowej na 4 liczby jednocyfrowe w ASCII:

//aktualizacja informacji, filtr - Clear
tmp = FreqClear;
Clear3=(tmp % 10) + 0x30;//jednosci
tmp = tmp /10;
Clear2=(tmp % 10) + 0x30;//dziesiatki
tmp = tmp / 10;
Clear1=(tmp % 10) + 0x30;//setki
tmp = tmp / 10;
Clear0=(tmp % 10) + 0x30;//tysiace

Zmienna FreqClear, podobnie jak FreqRed, FreqGreen oraz FreqBlue, jest aktualizowana w obsłudze przerwania licznika SYSTICK. W przerwaniu tym jest programowo zmieniany filtr koloru czujnika i po ściśle określonym czasie wyznaczonym przez SYSTICK następuje odczytanie wartości TIM2 oraz jego wyzerowanie, następnie rozpoczęcie pomiaru dla innego filtru koloru. Przy każdym wykonaniu przerwania mierzona jest inna składowa, ostatni pomiar tyczy się składowej światła dla filtru green po czym od początku sprawdzane są dane z TCS3200D dla filtru niebieskiego, czerwonego, przeźroczystego oraz zielonego:

void SysTick_Handler(void)
{
	extern uint16_t licznik;
	extern uint16_t FreqRed;
	extern uint16_t FreqGreen;
	extern uint16_t FreqBlue;
	extern uint16_t FreqClear;

	switch(licznik)
	{
		case 7 :
			//odczyt wartosci licznika
			FreqGreen = TIM_GetCounter(TIM2);
			//przypisanie nowej wartosci do zmiennej
			licznik = 0;
		break;
		case 6 :
			//zmiana wybranego filtru swiatla ukladu TCS3200D
			TCS3200_DISABLE;
			TCS3200_Green;
			TCS3200_ENABLE;
			//przypisanie nowej wartosci do zmiennej
			licznik = 7;
		break;
		case 5 :
			//odczyt wartosci licznika
			FreqClear = TIM_GetCounter(TIM2);
			//przypisanie nowej wartosci do zmiennej
			licznik = 6;
		break;


		case 4 :
			//zmiana wybranego filtru swiatla ukladu TCS3200D
			TCS3200_DISABLE;
			TCS3200_Clear;
			TCS3200_ENABLE;
			//przypisanie nowej wartosci do zmiennej
			licznik = 5;
		break;
		case 3 :
			//odczyt wartosci licznika
			FreqRed = TIM_GetCounter(TIM2);
			//przypisanie nowej wartosci do zmiennej
			licznik = 4;
		break;
		case 2 :
			//zmiana wybranego filtru swiatla ukladu TCS3200D
			TCS3200_DISABLE;
			TCS3200_Red;
			TCS3200_ENABLE;
			//przypisanie nowej wartosci do zmiennej
			licznik = 3;
		break;
		case 1 :
			//odczyt wartosci licznika
			FreqBlue = TIM_GetCounter(TIM2);
			//przypisanie nowej wartosci do zmiennej
			licznik = 2;
		break;
		default :
			//zmiana wybranego filtru swiatla ukladu TCS3200D
			TCS3200_DISABLE;
			TCS3200_Blue;
			TCS3200_ENABLE;
			//przypisanie nowej wartosci do zmiennej
			licznik = 1;
		break;
	}

	TIM_SetCounter(TIM2,0);
}