Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Capsense
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
megabuks
Здравствуйте.
Помогите разобраться с Capsense
Задача - сделать сенсорную кнопку.
контроллер MSP430G2252. Выводы имеют функцию pin oscilator
Взяв библиотеку от TI и прошив пример в контроллер положительный результат получил.
Теперь хотелось-бы понять, алгоритм того, как это работает.sm.gif
Покопался в библиотеке TI.
CODE


#ifdef RO_PINOSC_TA0
/***************************************************************************//**
* @brief RO method capactiance measurement using PinOsc IO, and TimerA0
*
* Schematic Description:
*
* \n element-----+->Px.y
*
* \n The measurement window is accumulation_cycles/ACLK. The ACLK is
* used to generate a capture event via the internal connection CCIOB.
* The counts within the TA0R that have accumulated during the
* measurement window represents the capacitance of the element.
*
* @param group Pointer to the structure describing the Sensor to be measured
* @param counts Pointer to where the measurements are to be written
* @return none
******************************************************************************/
void TI_CTS_RO_PINOSC_TA0_HAL(const struct Sensor *group,uint16_t *counts)
{
uint8_t i;
uint16_t j;
//** Context Save
// TIMERA0: TA0CTL, TA0CCTL0
// Ports: PxSEL, PxSEL2
uint16_t contextSaveTA0CTL,contextSaveTA0CCTL0,contextSaveTA0CCR0;
uint8_t contextSaveSel,contextSaveSel2;

contextSaveTA0CTL = TA0CTL;
contextSaveTA0CCTL0 = TA0CCTL0;
contextSaveTA0CCR0 = TA0CCR0;

//** Setup Measurement timer***************************************************
// Choices are TA0,TA1,TB0,TB1,TD0,TD1 these choices are pushed up into the
// capacitive touch layer.

// Configure and Start Timer
TA0CTL = TASSEL_3+MC_2; // TACLK, cont mode
for (i =0; i< (group->numElements); i++)
{
// Context Save
contextSaveSel = *((group->arrayPtr)->inputPxselRegister);
contextSaveSel2 = *((group->arrayPtr[i])->inputPxsel2Register);
// Configure Ports for relaxation oscillator
j = (group->accumulationCycles);
*((group->arrayPtr[i])->inputPxselRegister) &= ~((group->arrayPtr[i])->inputBits);
*((group->arrayPtr[i])->inputPxsel2Register) |= ((group->arrayPtr[i])->inputBits);
TA0CCTL0 = CM_3+CCIS_1+CAP; // Pos&Neg,ACLK (CCI0B),Cap
while(!(TA0CCTL0 & CCIFG)); // wait for capture event
TA0CTL |= TACLR; // Clear Timer_A TAR
while(j--)
{
TA0CCTL0 = CM_3+CCIS_1+CAP; // Pos&Neg,ACLK (CCI0B),Cap
while(!(TA0CCTL0 & CCIFG)); // wait for capture event
}
counts[i] = TA0CCR0; // Save result
TA0CTL = TASSEL_3+MC_2;
// Context Restore
*((group->arrayPtr[i])->inputPxselRegister) = contextSaveSel;
*((group->arrayPtr[i])->inputPxsel2Register) = contextSaveSel2;
}
// End Sequence
// Context Restore
TA0CTL = contextSaveTA0CTL;
TA0CCTL0 = contextSaveTA0CCTL0;
TA0CCR0 = contextSaveTA0CCR0;
}
#endif


Последовательность действий я понимаю такая:
1. Настраиваем ноги как pin oscilator
2. запускаем таймер на счет импульсов от выбраного пина, TACTL: TASSEL=3(INCLK), MC=2 (continuos mode)
3. Через taccr0 формируем период измерения [i]Тут первый вопрос откуда взять или как рассчитать требуемое значение

4. По окончании периода измерения считываем значение TAR и сравниваем его с неким эталонным. отсюда вопрос 2 - а где взять это значение и как установить "ворота" для срабатывания сенсора

Как исключить ложные срабатывания и температурный уход?

М.б. еще чего пропустил. поправьте пожалуйста...

controller_m30
Вот, моя же цитата с другого сайта, тогда писал по "горячим следам" sm.gif
Цитата
На каждой ножке ввода-вывода, установлен так называемый Pin-oscillator - генератор из двух логических элементов. Подключить его можно в настроечном регистре порта Psel (в AVR такого нет, но назначение его простое - выбор периферии, которая пользуется ножкой ввода-вывода). Одновременно, для встроенного таймера-счетчика, нужно задать источник тактирования от периферии и измерить количество импульсов за какой нибудь фиксированный отрезок времени.
Например: если сенсорных кнопок не касаться, счетчик отсчитает, скажем 4000 импульсов. А при прикосновении к кнопке - количество импульсов будет равно 2000 - т.е. в два раза меньше.

Пробовал с разными длительностями замеров, соотношение для нажатой и не нажатой кнопки всегда отличается в два раза. Так что нажатие-отпускание легко отличается.
Так-же, при приближении руки к клавиатуре на 1 сантиметр показания счетчика изменяется на 10%. Так-что можно определить и приближение к клавиатуре.

Нюанс - одновременно к счетчику можно подключить только один Pin-oscillator, остальные должны быть отключены. Но меня это вполне устраивает.

Конструкция сенсорной кнопки простая: с одной стороны платы - GND слой, общий для всех кнопок. А с другой стороны - сами кнопки, подключенные к ножкам контроллера. Никаких дополнительных деталей ставить не нужно.
Сенсорных входов, для MSP430g2452 доступно 16 - т.е. все линии ввода-вывода.
Замеры эти делались для самодельной копии платки сенсорного ввода от TI "Capacitive Touch BoosterPack for LaunchPad" (согласно чертежа и схемы - один в один).
При чём соотношение нажатой/не нажатой кнопки 1:2, было, по моему, и при касании пальцем оголённой сенсорной кнопки, и при касании через целлофан, скотч, пластмассу (0.5-1 мм толщиной).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.