Better responsive touch, also use averaging for touch X/Y read

Define and use ADC channels name (for easy use on another boards)
pull/4/head
DiSlord 6 years ago
parent fbd0d90d27
commit 6501c3dd74

@ -829,6 +829,8 @@ void enter_dfu(void);
/*
* adc.c
*/
#define ADC_TOUCH_X ADC_CHSELR_CHSEL6
#define ADC_TOUCH_Y ADC_CHSELR_CHSEL7
void adc_init(void);
uint16_t adc_single_read(uint32_t chsel);

75
ui.c

@ -195,71 +195,74 @@ static int btn_wait_release(void)
}
}
// ADC read count for measure X and Y (better be 2^n)
#define TOUCH_MEASURE_COUNT 8
static int
touch_measure_y(void)
{
int v;
int v = 0, i = TOUCH_MEASURE_COUNT;
// open Y line
palSetPadMode(GPIOB, 1, PAL_MODE_INPUT_PULLDOWN );
palSetPadMode(GPIOA, 7, PAL_MODE_INPUT_PULLDOWN );
palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_INPUT_PULLDOWN);
// drive low to high on X line
palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL );
palClearPad(GPIOB, 0);
palSetPadMode(GPIOA, 6, PAL_MODE_OUTPUT_PUSHPULL );
palSetPad(GPIOA, 6);
palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_OUTPUT_PUSHPULL);
// drive low to high on X line (coordinates from left to right)
palClearPad(GPIOB, GPIOB_XN);
palSetPad(GPIOA, GPIOA_XP);
chThdSleepMilliseconds(2);
v = adc_single_read(ADC_CHSELR_CHSEL7);
//chThdSleepMilliseconds(2);
//v += adc_single_read(ADC1, ADC_CHSELR_CHSEL7);
return v;
do{
v+= adc_single_read(ADC_TOUCH_Y);
}while(--i);
return v/TOUCH_MEASURE_COUNT;
}
static int
touch_measure_x(void)
{
int v;
// open X line
palSetPadMode(GPIOB, 0, PAL_MODE_INPUT_PULLDOWN );
palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_PULLDOWN );
// drive low to high on Y line
palSetPadMode(GPIOB, 1, PAL_MODE_OUTPUT_PUSHPULL );
palSetPad(GPIOB, 1);
palSetPadMode(GPIOA, 7, PAL_MODE_OUTPUT_PUSHPULL );
palClearPad(GPIOA, 7);
int v = 0, i = TOUCH_MEASURE_COUNT;
// Set X line as input
palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_INPUT_PULLDOWN);
// Set Y line as output
palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_OUTPUT_PUSHPULL);
// drive high to low on Y line (coordinates from bottom to top)
palSetPad(GPIOB, GPIOB_YN);
palClearPad(GPIOA, GPIOA_YP);
chThdSleepMilliseconds(2);
v = adc_single_read(ADC_CHSELR_CHSEL6);
//chThdSleepMilliseconds(2);
//v += adc_single_read(ADC1, ADC_CHSELR_CHSEL6);
return v;
do{
v+= adc_single_read(ADC_TOUCH_X);
}while(--i);
return v/TOUCH_MEASURE_COUNT;
}
void
touch_prepare_sense(void)
{
// open Y line
palSetPadMode(GPIOB, 1, PAL_MODE_INPUT_PULLDOWN );
palSetPadMode(GPIOA, 7, PAL_MODE_INPUT_PULLDOWN );
// Set Y line as input
palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_INPUT_PULLDOWN);
// force high X line
palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL );
palSetPad(GPIOB, 0);
palSetPadMode(GPIOA, 6, PAL_MODE_OUTPUT_PUSHPULL );
palSetPad(GPIOA, 6);
palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_OUTPUT_PUSHPULL);
// drive high on X line (for touch sense on Y)
palSetPad(GPIOB, GPIOB_XN);
palSetPad(GPIOA, GPIOA_XP);
}
void
touch_start_watchdog(void)
{
touch_prepare_sense();
adc_start_analog_watchdogd(ADC_CHSELR_CHSEL7);
adc_start_analog_watchdogd(ADC_TOUCH_Y);
}
static int
touch_status(void)
{
touch_prepare_sense();
return adc_single_read(ADC_CHSELR_CHSEL7) > TOUCH_THRESHOLD;
return adc_single_read(ADC_TOUCH_Y) > TOUCH_THRESHOLD;
}
static int
@ -267,7 +270,7 @@ touch_check(void)
{
int stat = touch_status();
if (stat) {
chThdSleepMilliseconds(10);
// chThdSleepMilliseconds(10);
int x = touch_measure_x();
int y = touch_measure_y();
if (touch_status()) {

Loading…
Cancel
Save

Powered by TurnKey Linux.