|
|
  |
AVR Qtouch wheel, сенсорное кольцо |
|
|
|
Oct 24 2011, 19:50
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 7-10-10
Из: Санкт-Петербург
Пользователь №: 59 990

|
Здравствуйте. Возникла у меня необходимость сделать сенсорное кольцо. Поискав в интернете, но недостаточно хорошо изучив даташит, приобрел AT42QT2160. Все это дело развел, сделал платку самого кольца - сенсора, но в процессе программирования выяснил, что максимум из нее можно сделать слайдер. В качестве слайдера он конечно, почти работал, но вблизи нуля сенсор себя вел неадекватно. В остальном же претензий не было. Следующим шагом была идея использовать Atmega16 и с помощью Qtouch Library добиться требуемого результата. Все сделал по даташиту. Но стабильной работы я не получил. Можно даже сказать что вообще работы я не получил. Конечно реакция на прикосновение есть, но она не стабильна и по мере работы контроллера чувствительность падала. Может кто нибудь сталкивался с такой проблемой? Код один в один что и в примерах, за исключением отсутствия кнопок и других каналов, повешенных на кольцо. Может быть есть смысл использовать аппаратное решение типа STMPE16M31, где предусмотрена аппаратная поддержка кольца. Если есть опыт в этом вопросе, поделитесь пожалуйста!
|
|
|
|
|
Oct 25 2011, 10:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
QUOTE (SlavaDev503 @ Oct 24 2011, 23:50)  Здравствуйте. Возникла у меня необходимость сделать сенсорное кольцо. Поискав в интернете, но недостаточно хорошо изучив даташит, приобрел AT42QT2160. Все это дело развел, сделал платку самого кольца - сенсора, но в процессе программирования выяснил, что максимум из нее можно сделать слайдер. В качестве слайдера он конечно, почти работал, но вблизи нуля сенсор себя вел неадекватно. В остальном же претензий не было. Следующим шагом была идея использовать Atmega16 и с помощью Qtouch Library добиться требуемого результата. Все сделал по даташиту. Но стабильной работы я не получил. Можно даже сказать что вообще работы я не получил. Конечно реакция на прикосновение есть, но она не стабильна и по мере работы контроллера чувствительность падала. Может кто нибудь сталкивался с такой проблемой? Код один в один что и в примерах, за исключением отсутствия кнопок и других каналов, повешенных на кольцо. Может быть есть смысл использовать аппаратное решение типа STMPE16M31, где предусмотрена аппаратная поддержка кольца. Если есть опыт в этом вопросе, поделитесь пожалуйста! Так может приложите схему и код?
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Oct 25 2011, 15:53
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 7-10-10
Из: Санкт-Петербург
Пользователь №: 59 990

|
Вот фрагмент схемы
и код 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_
Сообщение отредактировал SlavaDev503 - Oct 25 2011, 15:58
Эскизы прикрепленных изображений
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|