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); }