Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR Qtouch wheel
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
SlavaDev503
Здравствуйте. Возникла у меня необходимость сделать сенсорное кольцо. Поискав в интернете, но недостаточно хорошо изучив даташит, приобрел AT42QT2160. Все это дело развел, сделал платку самого кольца - сенсора, но в процессе программирования выяснил, что максимум из нее можно сделать слайдер. В качестве слайдера он конечно, почти работал, но вблизи нуля сенсор себя вел неадекватно. В остальном же претензий не было.
Следующим шагом была идея использовать Atmega16 и с помощью Qtouch Library добиться требуемого результата.
Все сделал по даташиту. Но стабильной работы я не получил. Можно даже сказать что вообще работы я не получил. Конечно реакция на прикосновение есть, но она не стабильна и по мере работы контроллера чувствительность падала. Может кто нибудь сталкивался с такой проблемой? Код один в один что и в примерах, за исключением отсутствия кнопок и других каналов, повешенных на кольцо. Может быть есть смысл использовать аппаратное решение типа STMPE16M31, где предусмотрена аппаратная поддержка кольца. Если есть опыт в этом вопросе, поделитесь пожалуйста!
ILYAUL
QUOTE (SlavaDev503 @ Oct 24 2011, 23:50) *
Здравствуйте. Возникла у меня необходимость сделать сенсорное кольцо. Поискав в интернете, но недостаточно хорошо изучив даташит, приобрел AT42QT2160. Все это дело развел, сделал платку самого кольца - сенсора, но в процессе программирования выяснил, что максимум из нее можно сделать слайдер. В качестве слайдера он конечно, почти работал, но вблизи нуля сенсор себя вел неадекватно. В остальном же претензий не было.
Следующим шагом была идея использовать Atmega16 и с помощью Qtouch Library добиться требуемого результата.
Все сделал по даташиту. Но стабильной работы я не получил. Можно даже сказать что вообще работы я не получил. Конечно реакция на прикосновение есть, но она не стабильна и по мере работы контроллера чувствительность падала. Может кто нибудь сталкивался с такой проблемой? Код один в один что и в примерах, за исключением отсутствия кнопок и других каналов, повешенных на кольцо. Может быть есть смысл использовать аппаратное решение типа STMPE16M31, где предусмотрена аппаратная поддержка кольца. Если есть опыт в этом вопросе, поделитесь пожалуйста!

Так может приложите схему и код?
SlavaDev503
Вот фрагмент схемы
Нажмите для просмотра прикрепленного файла
и код
CODE
#include <avr/io.h>
#include <touch_api.h>
#include <avr/interrupt.h>

extern y_line_info_t y_line_info[NUM_Y_LINES];
extern x_line_info_t x_line_info[NUM_X_LINES];


x_line_info_t x_line_info[NUM_X_LINES]= {
FILL_OUT_X_LINE_INFO( 1,0u ),
FILL_OUT_X_LINE_INFO( 1,1u ),
FILL_OUT_X_LINE_INFO( 1,2u ),
FILL_OUT_X_LINE_INFO( 1,3u ),
FILL_OUT_X_LINE_INFO( 1,4u ),
FILL_OUT_X_LINE_INFO( 1,5u ),
FILL_OUT_X_LINE_INFO( 1,6u ),
FILL_OUT_X_LINE_INFO( 1,7u )
};

y_line_info_t y_line_info[NUM_Y_LINES]= {
FILL_OUT_Y_LINE_INFO(1u),
FILL_OUT_Y_LINE_INFO(0u)
};


uint16_t qt_measurement_period_msec = 25u;
/* flag set by timer ISR when it's time to measure touch */
static volatile uint8_t time_to_measure_touch = 0u;

/* current time, set by timer ISR */
static volatile uint16_t current_time_ms_touch = 0u;
static volatile unsigned int lastpos;
extern qt_touch_lib_measure_data_t qt_measure_data;

#define GET_SENSOR_STATE(SENSOR_NUMBER) qt_measure_data.qt_touch_status.sensor_states[SENSOR_NUMBER]
#define GET_SENSOR_POS(SENSOR_NUMBER) qt_measure_data.qt_touch_status.rotor_slider_values[SENSOR_NUMBER]
#define GET_SENSOR_SIGNAL(SENSOR_NUMBER) qt_measure_data.channel_signals[SENSOR_NUMBER]
#define GET_SENSOR_REFERENCE(SENSOR_NUMBER) qt_measure_data.channel_references[SENSOR_NUMBER]

void init()
{
/* disable pull-ups */
SFIOR |= (1 << PUD);
qt_reset_sensing();


qt_enable_rotor(CHANNEL_8, CHANNEL_15, NO_AKS_GROUP, 10u, 3, RES_8_BIT, 2u);

qt_init_sensing();

qt_config_data.qt_di = DEF_QT_DI;
qt_config_data.qt_neg_drift_rate = DEF_QT_NEG_DRIFT_RATE;
qt_config_data.qt_pos_drift_rate = DEF_QT_POS_DRIFT_RATE;
qt_config_data.qt_max_on_duration = DEF_QT_MAX_ON_DURATION;
qt_config_data.qt_drift_hold_time = DEF_QT_DRIFT_HOLD_TIME;
qt_config_data.qt_recal_threshold = DEF_QT_RECAL_THRESHOLD;
qt_config_data.qt_pos_recal_delay = DEF_QT_POS_RECAL_DELAY;

/* set timer compare value (how often timer ISR will fire) */
OCR1A = ( 1000 * qt_measurement_period_msec);
/* enable timer ISR */
TIMSK |= (1u << OCIE1A);
/* timer prescaler = system clock / 8 */
TCCR1B |= (1u << CS11);
/* timer mode = CTC (count up to compare value, then reset) */
TCCR1B |= (1u << WGM12);
}


volatile uint16_t status_flag;
volatile uint16_t status;

int main()
{
uint16_t burst_flag = 0u;
spi_init();
init();
sei();

/* loop forever */
for( ; ; )
{
if( time_to_measure_touch )
{
/* clear flag: it's time to measure touch */
time_to_measure_touch = 0u;
do
{
/* one time measure touch sensors */
status_flag = qt_measure_sensors( current_time_ms_touch );
burst_flag = status_flag & QTLIB_BURST_AGAIN;

if(status_flag & QTLIB_STATUS_CHANGE)
{
lastpos = GET_SENSOR_POS(0);
}
}while (burst_flag) ;
status = status_flag;
}

/* Time Non-critical host application code goes here */
}
return 0;
}

ISR(TIMER1_COMPA_vect)
{
/* set flag: it's time to measure touch */
time_to_measure_touch = 1u;
/* update the current time */
current_time_ms_touch += qt_measurement_period_msec;
}



ISR(SPISTC_vect)
{
if( SPDR == 0x01)
{
SPDR = (status & 0x0F) | ((status & 0x0F00) >> 8);
}
if( SPDR == 0x02)
{
SPDR = lastpos;
}
}


в опциях самого проекта делаю следующие дефайны:
-D_QMATRIX_=1
-DQT_NUM_CHANNELS=16
-DPORT_X_1=D
-DPORT_YB=A
-DPORT_YA=B
-DPORT_SMP=A
-DNUM_X_LINES=8
-DSMP_PIN=3
-DPORT_NUM_1=1
-DNUM_Y_LINES=2
-DNUM_X_PORTS=1
-DQT_MAX_NUM_ROTORS_SLIDERS=2
-DQT_DELAY_CYCLES=4
-D_ROTOR_SLIDER_
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.