Alex_Golubev 0 10 марта, 2023 Опубликовано 10 марта, 2023 (изменено) · Жалоба Может чего-то не догнал. Попытался применить выше формулы. Проверил по методички которая выше по ссылки от TI. Но не получается откалибровать. Написал тестовый код. Спойлер #include <stdio.h> #include <stdint.h> typedef struct { int16_t x; int16_t y; } _tPoint; _tPoint tPointTs[5]; _tPoint tPointTt[5]; _tPoint tPoint; _tPoint tPointADC; typedef struct { float alfa_x; float beta_x; float delta_x; float alfa_y; float beta_y; float delta_y; } _tFactors; _tFactors tFactors; void FactorsCalc(_tPoint *s, _tPoint *t, _tFactors *factors) { int8_t j; int32_t a=0, b=0, c=0, d=0, e=0, X1=0, X2=0, X3=0, Y1=0, Y2=0, Y3=0; int32_t D, Dx1, Dx2, Dx3, Dy1, Dy2, Dy3; float n = 5.0; for(j=0; j<5; j++) { a+=t[j].x*t[j].x; b+=t[j].y*t[j].y; c+=t[j].x*t[j].y; d+=t[j].x; e+=t[j].y; X1+=t[j].x*s[j].x; X2+=t[j].y*s[j].x; X3+=s[j].x; Y1+=t[j].x*s[j].y; Y2+=t[j].y*s[j].y; Y3+=s[j].y; } D=n*(a*b-c*c)+2*c*d*e-a*e*e-b*d*d; Dx1=n*(X1*b-X2*c)+e*(X2*d-X1*e)+X3*(c*e-b*d); Dx2=n*(X2*a-X1*c)+d*(X1*e-X2*d)+X3*(c*d-a*e); Dx3=X3*(a*b-c*c)+X1*(c*e-b*d)+X2*(c*d-a*e); Dy1=n*(Y1*b-Y2*c)+e*(Y2*d-Y1*e)+Y3*(c*e-b*d); Dy2=n*(Y2*a-Y1*c)+d*(Y1*e-Y2*d)+Y3*(c*d-a*e); Dy3=Y3*(a*b-c*c)+Y1*(c*e-b*d)+Y2*(c*d-a*e); factors->alfa_x=(float)((float)Dx1/(float)D); factors->beta_x=(float)((float)Dx2/(float)D); factors->delta_x=(float)((float)Dx3/(float)D); factors->alfa_y=(float)((float)Dy1/(float)D); factors->beta_y=(float)((float)Dy2/(float)D); factors->delta_y=(float)((float)Dy3/(float)D); } void Correction(_tPoint *corrected, _tPoint *adc, _tFactors *factors) { corrected->x=(int32_t)(factors->alfa_x*adc->x + factors->beta_x*adc->y + factors->delta_x); corrected->y=(int32_t)(factors->alfa_y*adc->x + factors->beta_y*adc->y + factors->delta_y); } int main() { tPointTs[0].y = 0, tPointTs[0].x = 0 ; tPointTs[1].y = 0, tPointTs[1].x = 800; tPointTs[2].y = 600, tPointTs[2].x = 800; tPointTs[3].y = 600, tPointTs[3].x = 0 ; tPointTs[4].y = 300, tPointTs[4].x = 400; tPointTt[0].y = 3633, tPointTt[0].x = 3640; tPointTt[1].y = 3630, tPointTt[1].x = 313; tPointTt[2].y = 367, tPointTt[2].x = 290; tPointTt[3].y = 375, tPointTt[3].x = 3615; tPointTt[4].y = 1629, tPointTt[4].x = 1663; FactorsCalc(&tPointTs[0], &tPointTt[0], &tFactors); tPointADC.y = 3633, tPointADC.x = 3640; Correction(&tPoint, &tPointADC, &tFactors); printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x); tPointADC.y = 3630, tPointADC.x = 313; Correction(&tPoint, &tPointADC, &tFactors); printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x); tPointADC.y = 367, tPointADC.x = 290; Correction(&tPoint, &tPointADC, &tFactors); printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x); tPointADC.y = 375, tPointADC.x = 3615; Correction(&tPoint, &tPointADC, &tFactors); printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x); return 0; } Но результат вот такой: ADCY = 3633 ; ADCX = 3640 ; Y= 7272 ; X= 7071 ADCY = 3630 ; ADCX = 313 ; Y= 3942 ; X= 3926 ADCY = 367 ; ADCX = 290 ; Y= 656 ; X= 641 ADCY = 375 ; ADCX = 3615 ; Y= 3989 ; X= 3789 Изменено 10 марта, 2023 пользователем Alex_Golubev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 10 марта, 2023 Опубликовано 10 марта, 2023 · Жалоба В 10.03.2023 в 19:30, Alex_Golubev сказал: Но результат вот такой: А что не так? приводим к нулю 3633-375=3285 нормируем 3285/5=651,6 - почти 600, ноль правда внизу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_Golubev 0 10 марта, 2023 Опубликовано 10 марта, 2023 (изменено) · Жалоба 3 минуты назад, HardEgor сказал: А что не так? Я ожидаю при ADCY = 3633 ; ADCX = 3640 получения координат x = 0, y = 0 или около того. А получаю ADCY = 3633 ; ADCX = 3640 ; Y= 7272 ; X= 7071 Изменено 10 марта, 2023 пользователем Alex_Golubev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 10 марта, 2023 Опубликовано 10 марта, 2023 · Жалоба В 10.03.2023 в 20:19, Alex_Golubev сказал: Я ожидаю при ADCY = 3633 ; ADCX = 3640 получения координат x = 0, y = 0 или около того. Не понятно что было и что надо получит? Экран 600х800, откуда 3633 и 3640? А какие исходные сырые значения были? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_Golubev 0 10 марта, 2023 Опубликовано 10 марта, 2023 (изменено) · Жалоба 6 минут назад, HardEgor сказал: Не понятно что было и что надо получит? Исходно резистивный сенсор. Данные 3633 и 3640 это попугаи АЦП, которые выдаются при касании по разным углам указал на рисунки. Нужно откалибровать тачскрин, чтобы получить данные в виде координат Y, X. За нуль взят левый верхней угол экрана. Все точки указаны сначала Y потом X. Изменено 10 марта, 2023 пользователем Alex_Golubev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 10 марта, 2023 Опубликовано 10 марта, 2023 · Жалоба В 10.03.2023 в 20:29, Alex_Golubev сказал: Исходно резистивный сенсор. Данные 3633 и 3640 это попугаи АЦП, которые выдаются при касании по разным углам указал на рисунки. Нужно откалибровать тачскрин, чтобы получить данные в виде координат X,Y. За нуль взят левый верхней угол экрана. так вот калибровка по Y: приводим к нулю 3633-375=3285 нормируем 3285/5=651,6 - почти 600 Выворачиваем формулу (3633-375)/5=600 3633=600*5+375 проверяем 600*5+375 = 3375 Чтобы ноль вверху был, надо вычесть из 600 полученные координаты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 10 марта, 2023 Опубликовано 10 марта, 2023 · Жалоба X = 800 - (ADCX - 301.5) / 4.1575 Y = 600 - (ADCY - 371) / 5.434 Данные центра на картинке, очевидно, неверны. С этими сходится: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_Golubev 0 11 марта, 2023 Опубликовано 11 марта, 2023 · Жалоба Вроде нашел ошибки и что-то получилось: Спойлер #include <stdio.h> #include <stdint.h> typedef struct { int16_t x; int16_t y; } _tPoint; _tPoint tPointTs[5]; _tPoint tPointTt[5]; _tPoint tPoint; _tPoint tPointADC; typedef struct { float alfa_x; float beta_x; float delta_x; float alfa_y; float beta_y; float delta_y; } _tFactors; _tFactors tFactors; void FactorsCalc(_tPoint *s, _tPoint *t, _tFactors *factors) { int8_t j; float a=0, b=0, c=0, d=0, e=0, X1=0, X2=0, X3=0, Y1=0, Y2=0, Y3=0; float D, Dx1, Dx2, Dx3, Dy1, Dy2, Dy3; float n = 5.0; for(j=0; j<5; j++) { a+=t[j].x*t[j].x; b+=t[j].y*t[j].y; c+=t[j].x*t[j].y; d+=t[j].x; e+=t[j].y; X1+=t[j].x*s[j].x; X2+=t[j].y*s[j].x; X3+=s[j].x; Y1+=t[j].x*s[j].y; Y2+=t[j].y*s[j].y; Y3+=s[j].y; } D=n*(a*b-c*c)+2*c*d*e-a*e*e-b*d*d; Dx1=n*(X1*b-X2*c)+e*(X2*d-X1*e)+X3*(c*e-b*d); Dx2=n*(X2*a-X1*c)+d*(X1*e-X2*d)+X3*(c*d-a*e); Dx3=X3*(a*b-c*c)+X1*(c*e-b*d)+X2*(c*d-a*e); Dy1=n*(Y1*b-Y2*c)+e*(Y2*d-Y1*e)+Y3*(c*e-b*d); Dy2=n*(Y2*a-Y1*c)+d*(Y1*e-Y2*d)+Y3*(c*d-a*e); Dy3=Y3*(a*b-c*c)+Y1*(c*e-b*d)+Y2*(c*d-a*e); factors->alfa_x=(float)((float)Dx1/(float)D); factors->beta_x=(float)((float)Dx2/(float)D); factors->delta_x=(float)((float)Dx3/(float)D); factors->alfa_y=(float)((float)Dy1/(float)D); factors->beta_y=(float)((float)Dy2/(float)D); factors->delta_y=(float)((float)Dy3/(float)D); } void Correction(_tPoint *corrected, _tPoint *adc, _tFactors *factors) { corrected->x=(int32_t)(factors->alfa_x*adc->x + factors->beta_x*adc->y + factors->delta_x); corrected->y=(int32_t)(factors->alfa_y*adc->x + factors->beta_y*adc->y + factors->delta_y); } uint8_t TsToChar(int16_t y, int16_t x) { int16_t Y = y/60; int16_t X = x/32; printf("Y = %5d ; X = %5d ; %5d\r\n", Y, X, Y*25 + X + 1); } int main() { /* Ðàñòàâèë òî÷êè êàê â äàòàøèòå îò TI Öåíòðàëüíóþ òî÷êó ðàñ÷èòàë ïîêà ïðèìåðíî */ tPointTs[0].y = 300 , tPointTs[0].x = 400; tPointTs[1].y = 0 , tPointTs[1].x = 0 ; tPointTs[2].y = 0 , tPointTs[2].x = 800; tPointTs[3].y = 600 , tPointTs[3].x = 800; tPointTs[4].y = 600 , tPointTs[4].x = 0 ; tPointTt[0].y = 2004, tPointTt[0].x = 1976; tPointTt[1].y = 3633, tPointTt[1].x = 3640; tPointTt[2].y = 3630, tPointTt[2].x = 313; tPointTt[3].y = 367, tPointTt[3].x = 290; tPointTt[4].y = 375, tPointTt[4].x = 3615; /* // òåñòîâûå òî÷êè ïðîâåðî÷íûå tPointTs[0].x = 128 , tPointTs[0].y = 384 ; tPointTs[1].x = 64 , tPointTs[1].y = 192 ; tPointTs[2].x = 192 , tPointTs[2].y = 192 ; tPointTs[3].x = 192 , tPointTs[3].y = 576 ; tPointTs[4].x = 64 , tPointTs[4].y = 576 ; tPointTt[0].x = 1698 , tPointTt[0].y = 2258; tPointTt[1].x = 767 , tPointTt[1].y = 1149; tPointTt[2].x = 2807 , tPointTt[2].y = 1327; tPointTt[3].x = 2629 , tPointTt[3].y = 3367; tPointTt[4].x = 588 , tPointTt[4].y = 3189;*/ FactorsCalc(&tPointTs[0], &tPointTt[0], &tFactors); printf("alfaX = % 5.5f ; betaX = % 5.5f ; deltaX= % 5.5f \r\n", tFactors.alfa_x, tFactors.beta_x, tFactors.delta_x); printf("alfaY = % 5.5f ; betaY = % 5.5f ; deltaY= % 5.5f \r\n", tFactors.alfa_y, tFactors.beta_y, tFactors.delta_y); printf("\r\n"); tPointADC.y = 3633, tPointADC.x = 3640; Correction(&tPoint, &tPointADC, &tFactors); printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x); tPointADC.y = 3630, tPointADC.x = 313; Correction(&tPoint, &tPointADC, &tFactors); printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x); tPointADC.y = 367, tPointADC.x = 290; Correction(&tPoint, &tPointADC, &tFactors); printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x); tPointADC.y = 375, tPointADC.x = 3615; Correction(&tPoint, &tPointADC, &tFactors); printf("ADCY = %5d ; ADCX = %5d ; Y= %5d ; X= %5d \r\n", tPointADC.y, tPointADC.x, tPoint.y, tPoint.x); for(int y = 0; y < 600; y += 60){ for(int x = 0; x < 800; x += 32) { TsToChar(y, x); } } return 0; } alfaX = -0.24053 ; betaX = 0.00177 ; deltaX= 869.52948 alfaY = 0.00030 ; betaY = -0.18402 ; deltaY= 667.77826 ADCY = 3633 ; ADCX = 3640 ; Y= 0 ; X= 0 ADCY = 3630 ; ADCX = 313 ; Y= 0 ; X= 800 ADCY = 367 ; ADCX = 290 ; Y= 600 ; X= 800 ADCY = 375 ; ADCX = 3615 ; Y= 599 ; X= 0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться