Пример работы MSP430F2553 c датчиком цвета TCS230

В предыдущей статье было приведено преобразователя цвет-частота TCS230  (рисунок 1). Для реализации законченного устройства была разработана печатная плата в основу которой лег микроконтроллер MSP430G2553, схема приведена на рисунке 2.

ris6

Рисунок 1 — Датчик TCS230

001_2 001

Рисунок 2 — Схема печатной платы устройства

3D модель печатной платы приведена на рисунке 3.

PCB

Рисунок 3 — 3D модель печатной платы

Эта печатная плата разрабатывалась для работы в системе управления секционированной вытяжкой и имеет следующие параметры:

— в основу заложен микроконтроллер MSP430G2553, 16 битная архитектура, тактовая частота до 16 МГц;

десять гальванически развязанных выходов для подключения пяти вентиляционных задвижек (один канал для открытия, другой для закрытия);

пять гальванически развязанных входов для подключения сигнала срабатывания задвижки (концевые выключатели);

четыре не развязанных гальванически канала, с возможностью использовать их на ввод так и вывод цифровых сигналов;

— два входа для параметрирования внешних устройств;

— одна пользовательская кнопка;

— один пользовательский светодиод;

— кнопка сброса reset;

— разъем для подключения интерфейса uart;

— разъем для подключения программатора;

Датчик подключается к разъему X8, распиновка разъема приведена в таблице 1:

Таблица 1 — Разъем X8

table

Порядок работы с датчиком:

  1. подается питание на датчик цвета;
  2. конфигурируется диапазон выходных частот ( S0, S1), на плате джамперы J1 и J2;
  3. выбирается измеряемый цвет, одно из четырех состояний RGB и без цветофильтра (S2, S3);
  4. подается сигнал разрешения преобразования и производится измерение частоты, выдаваемой датчиком;
  5. для измерения следующего значения цвета происходит возврат к пункту 3, повторение происходит n-е количество раз, необходимое для получения нужного количества точек для усреднения и обработки измерения;
  6. по результатам усредненных данных для трех значений цветов (R, G, B) производится распознавание (сравнение) цвета;
  7. Выдается управляющий сигнал на органы управления.

Алгоритм работы программы микроконтроллера приведен на рисунке 4.

 firstРисунок 4 — Блоксхема программы

 Рассмотрим реализацию программы для микроконтроллера MSP430G2553 в соответствии с блоксхемой.

Начнем с инициализации микроконтроллера, в первую очередь остановим WDT:

WDTCTL = WDTPW + WDTHOLD;// останавливаем WDT

Далее настроим контроллер работать на частоте 8 МГц ( BCS_init();):

void BCS_init(void)
{
 BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
 if (CALBC1_8MHZ != 0xFF) {
  __delay_cycles(100000);
  DCOCTL = 0x00;
  BCSCTL1 = CALBC1_8MHZ; // Set DCO to 8MHz
  DCOCTL = CALDCO_8MHZ;
 }
 BCSCTL1 |= XT2OFF + DIVA_0;
 BCSCTL3 = XT2S_2 + LFXT1S_0 + XCAP_0;
}

Подождем пока все настройки вступят в силу (System_init();):

void System_init(void)
{
 do
 {
 IFG1 &= ~OFIFG;
 __delay_cycles(400);
 }while (IFG1 & OFIFG);
 IFG1 &= ~(OFIFG + WDTIFG);
}

Настроим таймер TA0 (TimerA_init();) :

void TimerA_init(void)
{
 TACCR0 = CCR1NUM;
 TACTL = TASSEL_2 + MC_1 + ID_3 + TACLR;
 TACCTL0 = CCIE;
}

И разрешим прерывания __bis_SR_register(GIE);

Далее нужно инициализировать наши порты

 P1DIR |= (BIT0 + OE_COLOR + S2_COLOR + S3_COLOR);// output
 P1IE |=  OUT_COLOR;                            // interrupt enabled
 P1IES |= OUT_COLOR;                            //Hi/lo edge
 P1REN |= OUT_COLOR;                            //Enable Pull Up on
 P1IFG &= ~OUT_COLOR;                           //IFG cleared

Начинаем измерение:

starSearch();

Замкнутый цикл в main():

while(1)
{
 if (flag_true == '1')//Проверка наличия данных
 {
  flag_true = '0';//Обнуляем флаг
  CR = Simpled(C_R);//Усредняется массив с данными красного цветофильтра
  CB = Simpled(C_B);//Усредняется массив с данными синего цветофильтра
  CG = Simpled(C_G);//Усредняется массив с данными зеленого цветофильтра
  char col;
  col = ColorSearch(CR,CB,CG);//Определение цвета
  //выполнение управляющего воздействия
  starSearch();
 }
}

Процедура начала измерения startSearch():

void starSearch(void)
{
    flag_true = '0';//обнуляем флаг наличия данных
    flag_color = 'R';//флаг выбора цветофильтра
    TACTL = TASSEL_2 + MC_1 + ID_3 + TACLR;           //настройка таймера, запуск
    P1OUT &=~ OE_COLOR;//включение датчика цвета
}

Вектор прерывания таймера:

#pragma vector=TIMER0_A0_VECTOR
__interrupt void CCR0_ISR (void)
{
    TACTL = MC_0;           // ACLK, contmode, STOP
    P1OUT |= OE_COLOR;//выключение датчика
    switch (flag_color) определение цветофильтра
            {
                case 'G'://зеленый
                    C_G[jj] = count_reg;//запись точки в массив
                    count_reg = 0;
                    if (jj>(NUM_C_S-1))
                    {
                        jj = 0;
                        flag_color = 'S';
                        setcolorfilter('R');
                        count_reg = 0;
                        flag_true = '1';
                    }
                    else
                    jj++;
                    break;
                case 'B'://синий
                    C_B[jj] = count_reg;
                    count_reg = 0;
                    if (jj>(NUM_C_S-1))
                    {
                        jj = 0;
                        flag_color = 'G';
                        setcolorfilter('G');
                        count_reg = 0;
                    }
                    else
                    jj++;
                    break;
                case 'R'://красный
                    C_R[jj] = count_reg;
                    count_reg = 0;
                    if (jj>(NUM_C_S-1))
                    {
                        jj = 0;
                        flag_color = 'B';
                        setcolorfilter('B');
                        count_reg = 0;
                    }
                    else
                        jj++;
                    break;
                case 'S':
                    flag_color = 'S';
                break;
                default:
                    break;
            }
    if (flag_color != 'S')
    {
        P1OUT &=~ OE_COLOR;
        TACTL = TASSEL_2 + MC_1 + ID_3 + TACLR;           // запуск таймера
    }
}

Установка цветофильтра:

void setcolorfilter(const char type)
{
//    CCTL1 = CCIE;
    //TACTL |= TAIE;
    switch (type) {
    case 'R':
        P1OUT &=~(S2_COLOR + S3_COLOR);
        //фильтр на красный и вывод частоты
        break;
    case 'G':
        //P1OUT &=~(S2_COLOR + S3_COLOR);
        P1OUT |= (S2_COLOR + S3_COLOR);
        //фильтр на зеленый и вывод частоты
        break;
    case 'B':
        //фильтр на синий и вывод частоты
        P1OUT &=~ S2_COLOR;
        P1OUT |=  S3_COLOR;
        break;
    }
}

Процедура усреднения:

unsigned int Simpled(unsigned int *MASS)
{
    unsigned color = 0;
    int j;
    for (j = 1; j<NUM_C_S;j++)
    {
        color += MASS[j];
    }
    return (color/(NUM_C_S-1));
}

Прерывание порта 1 (вход измерения частоты)

#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)
{
    switch (P1IFG & OUT_COLOR) {
        case OUT_COLOR:
            count_reg++;//инкремент регистра
            break;
        default:
            break;
    }
    P1IFG &=~ OUT_COLOR;//очистка флага прерывания
}

Способ измерения частоты:

Таймер настраивается на определенный временной период, по истечении которого программа переходит в прерывание. Количество импульсов с датчика цвета меряется за этот временной промежуток, зная количество импульсов и время измерения можно получить результат измеренной частоты. Измеряющий вход настроен на прерывание. Для более точного результата — n-е количество измерений усредняется.

З.Ы. В статье приведены выдержки из программы используемой в коммерческом проекте, по этой причине полное описание управляющей программы, а так же полный исходный код и печатная плата к статье не прикреплены. Буду рад ответить на любые Ваши вопросы по программе и готовому устройству.

You may also like...

2 Responses

  1. Nick:

    Добрый день! Интересная статья…..Сам работаю на проекте с использованием этого TCS230…На базе ардуино и лаунчппада..Сверяли вы полученные данные с цветовой моделью,соответствуют ли значения реальным цветам?

    • Kalik:

      Добрый! Нет задача дальше чем определение нескольких цветов не зашла и сравнивать с истиной не требовалось тогда, + в следующих установках стали применять датчики другого типа для упрощения алгоритма программы. Единственная проблема с которой столкнулись (и причина смены типа датчика) со временем цвета плывут, так сказать выгорают хотя для глаза неизменно + разные типы красок и разные поверхности вносят свои изменения.
      Посмотрите эту документалку: http://dokonlin.ru/video/bbc-horizon-vidim-li-my-odno-i-tozhe-pra.html
      Может будет полезна

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>