PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : راه اندازی تاچ کنترلر ads7843 با میکرو stm32



kamikazi
04-11-2012, 10:16
سلام به همه دوستان این تاپیکو زدم تا همه دوستانی از جمله خودم که در این مورد مشکل دارن مطرح کنن
من با راه اندازی این تاچ کنترلر مشکلی نداشتم راه افتاد ولی مشکل اساسیم کالیبره کردن این کنترلره من هرجایی رو که لمس میکنم در 50% موارد یه عدد خیلی بزرگ رو برمیگردونه که اصلا ربتی به عدد برگشتی از تاچ کنترلر رو نداره
من این دوتا هدر رو میزارم تا همه دوستان در موردش نظر بدن
اولین موردی که میخوام بگم اینکه این تاچ کنترلر یه عدد 12 بیتی از لحظه تماس از مختصات x و y برمیگردونه با توجه به دیتاشیت تاچ روی ال سی دی 4.3 اینچ مقاومت ایجاد شده از لمس کردن تاچ از 100 اهم تا 900 اهم تغییر میکنه حالا بیایم با هم چنتا محاسبه کنیم ببینید من درست میگم ما اول تابع زیر رو فراخونی میکنیم

void TP_GetAdXY(int *x,int *y)

این تابع مختصات نقطه لمس شده رو با یه عدد 12 بیتی نمایش میده پس داریم :


// miyangine moghavemete tach panel az : 100 ohm .........900 ohm
// 100 ohm : yani makane sefr va 900 ohm yani akharin makane ghable lams tavasot angosht
// adade bargashti tavasote tach controller az 0 ta 4096 mibashad
// 4096/900 = 4.55 .......>>>> 100*4.55 = 455 = adad bargashti az makane sefr
// 900*4.55 = 4096= adad bargashti az akharin makane ghable lams tavasot angosht
// telorance ebtada va entehaye tach = 4096 - 455 = 3641
// jaygahe noghte pixel x = 3641 / tedade pixelhaye mehvar x = 3641 / 480 = 7.585
// jaygahe noghte pixel y = 3641 / tedade pixelhaye mehvar y = 3641 / 272 = 13.386
// adade bargashti az tabe X_Position_func va Y_Position_func = touch
// mokhtasate x = (touch - 455) / 7.585
// mokhtasate Y = (touch - 455) / 13.386
حالا با توجه به این نکات چرا عدد برگشتی درست نیست البته این توابع رو بیشتر از اون مثالی که تو فروم میکرو های lpc هستش دراوردم اگه کسی میدونه راهنمایی کنه ممنون میشم

kavir
04-11-2012, 11:19
سلام
فعلا وقت چک ندارم ولی این مثال stm32f103vet6 هست خودتون مقایسه کنید

saeyd
04-11-2012, 20:29
با سلام.
من هم این را راه انداختم ولی دلچسب نیست
سورس و عکس رامیزام مشاهده کنید چهار نقطه را دقیقا در لبه فشار دادم ولی کجا خورده و خود نوشته هم دارای نویز است .

saeyd
04-11-2012, 23:54
با سلام
دوستان مختصات خوانده شده تاچ من
[150 , 1970] [150 , 230]
[1925, 1970] [1925 , 80]

به زبون ساده یعنی مربع ال سی دی را ذوذنقه میخونه ؟
مال شما هم همینوره ؟

m_online3710
05-11-2012, 01:13
سلام
من راه انداختمش
دقتش جتي به پيكسل رسيده
تقريبا هر 1.5 پيكسل رو تشخيص ميده
دو مسئله مهم وجود داره
يك كاليبره كردن
دو خواندن 10 بار مقدار نقطه مورد نظر و گرفتن ميانگين
البته من با اتمل راه اندازي كردم كه نبايد تفاوتي داشته باشه چون كاليبرش كه يكيه ميمونه خود اي سي كه راش انداختيد
اينا رو گفتم كه بدونيد دقت اي سي قابله قبوله
نا گفته نماند هدر كاليبره كرده تاچ مقدار وروديش حتما بايد 10 بيتي باشهتا نتايج درستي نشون بده يعني بايد اطلاعات دريافتي از آي سي adc7843 رو دوبيت به راست شيفت بديد

saeyd
05-11-2012, 01:31
مهندس مقادیر خوانده شده شما مستطیل کامل تشکیل میده ؟
مال من اولش نزدیک به 150 پیکسل اختلاف داره

m_online3710
05-11-2012, 16:49
كاملا مستطيله
من باهاش كيبورد تاچ درست كردم
كه خيلي عالي هم جواب ميده و تقريبا خطاش خيلي پايينه
تازه من يادمه يه بار بدون كاليبره هم استفاده كردم خيلي خوب جواب ميداد اون موقع فقط براي اينكه اعداد خونده شده از تاچ با ال سي دي هماهنگ بشه اونا رو تقسيم به يه عددي نزديك 1.5 ميكردم كه با كاليبره كردن اونم نميخواد
من يه ال سي دي ديگه دارم كه اصلا اي سي تاچ نداره اونو با adc مي خونم و كاليبرش ميكنم ببينم اگه جواب بده معلومه مشكل از برنامه ADS7843 شما هست
اين ال سي دي كه ميگم مشكلي شبيه مشكل شما رو داره
يك محور رو دقيقا درست ميداد اما محور ديگش معلوم نبود بر چه اساسي كار ميكنه
چند روز وقت بديد تست ميكنم و جواب ميدم

البته نزديك لبه ها دقت برنامه من به 6 و 7 پيكسل ميرسه
اما حتما كاليبره كنيد
اصلا تا حالا كاليبره كرديد؟(اينو در رابطه با پست يك گفتم چون با كاليبره كردن ديگه نيازي به محاسبات نداره. خودش محاسبات لازم رو انجام ميده)

kamikazi
06-11-2012, 10:58
مهندس فرایند کالیبره کردن برای چیه در واقع یعنی ما باید 3 نقطه رو لمس کنیم که میکرو ما بر اساس این 3 نقطه تصمیم بگیره و به قول معروف کالیبره بشه
در ضمن مهندس من قسمت دریافت اطلاعات رو از ای سی تاچ متوجه نمیشم ما دوبار میایم ادرس 0X00 از تاچ میخونیم بعدش میریز تو یه متغیر و اون رو شیفت میدیم وبرای بایت بعدی هم همینطور اصول این شیفت دادنا چیه یعنی اولین 8 بیتی که میگیریم MSB یا LSB میشه توضیح بدین این تابع من برای خوندن از مختصات X هستش نمیدونم درسه یا نه و تقریبا تو هر 5 بار فقط یه بار مختصات رو تقریبا درست نشون میده


unsigned int X_Position_func(void)
{
u16 temp = 0;
unsigned int x_pos_tmp;

// CS ra low mikonim,
ADS7843_CS_Enable;

// ersale farmane 0xD0 ya Byte-control jahate daryafte etelaate marbot be mokhtasate X
SPI2_WriteReceive_BYTE(0xD0);

// daryafte dade az porte miso va zakhire an dar motaghayer "x_pos"
temp= SPI2_WriteReceive_BYTE(0x00);
x_pos_tmp =temp<<8;
temp= SPI2_WriteReceive_BYTE(0x00);
x_pos_tmp |=temp;
x_pos_tmp >>=3;
x_pos_tmp &=0XFFF;

// CS ra gheire faal mikonim,
ADS7843_CS_Disable;

return x_pos_tmp;
}



اگه کسی از دوستان میتونه کمک کنه ممنون میشم راهنمایی کنه که واقعا از عملکرد توابعی که بکار میبریم اگاه باشیم

m_online3710
06-11-2012, 22:14
ببين فرايند كاليبره بخاطر اينه كه محورهاي تاچ همون محورهاي مورد نظر ما در رياضيات نيستند
عموما با يه زاويه اي اختلاف دارند
فكر كنم تو مجله 9 يا 10 از همين مجلات pmm توضيح داده شده بود
راجب توابع من از هدر آماده استفاده كردم و اطلاع كاملي ندارم
دوستان خردمند بايد بيان وسط

sigma-mx
06-11-2012, 23:21
مهندس در اینجا تابع SPI2_WriteReceive_BYTE یک تابع استاندارد cmsis نیست و این تابع بصورت 8 بیتی اطلاعات رو جابجا میکنه. اول با دستور خوندن موقعیت X رو میفرسته ، بعد 8 کلاک برای خوندن 8 بیت بالایی میفرسته ( با ارسال 0x00 ) و سپس این بایت خونده شده رو تو یه متغیر 16 بیتی ذخیره میکنه و 8 تا بسمت چپ شیفتش میده تا درواقع بره رو 8 بیت بالایی متغیر 16 بیتی . بعد دوباره با ارسال 0x00 ، بایت پایینی رو میخونه و اینبار فقط کافیه که این 8 بیت روی 8 بیت پایین متغیر OR بشه ( نیاز به شیفت نداره ) . حالا ما 16 بیت رو در دو نوبت خوندیم . ( چون مقدار مورد نظر 12 بیتی هست مجبوریم تو متغیر 16 بیتی ذخیره کنیم ).
حالا چون مقدار معتبر ما باید 12 بیت باشه و رزولوشن آیسی هم همین قدره پس برای اطمینان باید عدد 16 بیتی رو با 12 تا 1 یا 0xFFF هگز AND کنیم تا مطمئن بشیم که عدد از این مقدار بالاتر نمیره . بعد برای همون مساله ای که دوستان گفتن ( کاهش حساسیت ADC ) باید به مقدار لازم رقم از سمت راست عدد حذف کرد که این کار معادل شیفت براست هست . ( با هر شیفت براست یک رقم باینری از سمت راست حذف میشه ) در واقع با هر بار شیفت براست عدد تقسیم بر 2 میشه . معمولا 2 بار شیفت میدن که مبدل رو از 12 بیت تبدیل به 10 بیت میکنه ( این روش نرم افزاری کاهش حساسیت هست ) . البته باید تو این مساله به ابعاد تصویر هم دقت بشه . اگه ابعاد تصویر خیلی بزرگ باشه ممکنه به دقت بیشتر نیاز باشه ولی اگر اندازه کم باشه برای ثبات تاچ میشه حتی تا 8 بیت هم رسوندش ....



در ضمن کالیبره کردن هم با این خاطره که در واقع مبدل ما عدد 0 تا 1023 رو مثلا متناظر با پیکسل 0 تا 1023 نشون نمیده ! اگه شما تاچ کالیبره نشده رو تست کنید میبینید که مثلا پیکسل اول از 147 شروع شده تا پیکسل آخر مثلا 708 !
هم برای محور X و هم برای Y . خب پس میگم براحتی میشه با یه آفست دادن یا تقریق بصورت دستی کالیبره کرد ولی بازم به این سادگی نیست !! گاهی مشکل بزرگتره و اون هم اینه که علاوه بر تنظیم نبودن مختصات در مقیاس خطی ، ما مشکل scale هم داریم !! یعنی مثلا باید مقادیر 1.4 برابر بشن تا رو هم بیفتن !
به همین خاطر - تنظیم scale و آفست - میان و از ماتریس استفاده میکنند . که مثلا با 3 نقطه تبدیلات مقیاس انجام بشه و از این به بعد اینها تو مقادیر خونده شده لحاظ بشه .

امیدوارم تونسته باشم منظورم رو برسونم ...
یا حق

kamikazi
26-11-2012, 15:54
با سلام به همه دوستان راه اندازی تاچ کنترلر هم انجام شد این پروژه رو میزارم تا همه دوستان ازش استفاده کنن کاملترین پروژه در عین سادگی هستش که بک لایتم با pwm راه اندازی کرده که در عین خودش بی نظیره من اصلا ندیدم راجبه pwm تو این فروم ها صحبت بشه انشاالله که مارو هم تو این شبا دعا کنید
پرشین گیگ - دانلود - touch&fat_sdio.rar (You can see links before reply)

jonbakhsh
18-03-2014, 16:54
آقا من یک برد 7 اینچ سایت خریدم lcd به راحتی درایو کردم ولی چند وقته این تاچه پوستمو کنده . به روش مقاومتی درایو کردم ولی با این 7843 ads مشکل دارم . شاید هم مال برد باشه آخه 2 تا پین هدر 2*17 داره که پایه TE اون قطع بود و به پین هدی دیگه وصل نبود خودم وصلش کردم
کسی هست با این توابه کار کرده باشه بگه هر کدوم چیکار میکنه شاید یه ریزه کاری داره که من بلد نیستم



void Touch_Init(void);
void Pen_Int_Set(u8 en);
void Touch_Configuration(void);
void ADS_Write_Byte(u8 num);
u16 ADS_Read_AD(u8 CMD);
u16 ADS_Read_XY(u8 xy);
u8 Read_TP_Once(void);
u8 Read_ADS2(u16 *x,u16 *y);
u8 Read_ADS(u16 *x,u16 *y);
void Drow_Touch_Point(u16 x,u16 y);
u8 Get_Adjdata(void);
//void Refreshes_Screen(void);
void Convert_Pos(void);
void Draw_Big_Point(u16 x,u16 y);
void Touch_Adjust(void);

mzarkoob
18-03-2014, 18:26
سلام
من از این توابع 7 اینچ استفاده کردم موردی نداشت . البته با یه ال سی دی دیگه که 7 اینچ بود. برای فروشگاه را تست نکردم
اول میاد 4 تا نقطه گوشه را میگیره بعد با یه تابع دیگه هر نقطه ای بزنی بهت مختصاتشو میده و می تونی از اون استفاده کنی

jonbakhsh
18-03-2014, 20:05
یعنی حتما باید از
Touch_Configuration استفاده کنی ؟؟؟
امکانش هست نمونه برنامتونو برام بفرستید . من به برد ads7843 شک کردم
یا اگه امکانش هست توابع درایو تاچ برام بفرستید چون cd که برام فرستاده شده ظاهرا بد رایت شده شانس منم
پوشه sampel نه کپی میشه و نه باز میشه

asicman
17-03-2015, 17:15
سلام به دوستان عزیزم. آیا کسی تا به حال با این مشکل برخورد کرده که مقدار y خونده شده از تاچ توسط آیسی xpt2046 چه به سمت راست و چه به سمت پایین حرکت میکنیم تغییر میکنه (افزایش داره) . در ضمن به دلیل سهل انگاری پایه های تاچ و پایه های آیسی جابحا هستند. (xp و xn باید جابجا شوند و yp وyn هم با هم باید جابجا شوند.) .آیا این جابجایی میتونه خوندن رو دچار اشکال کنه؟؟؟

asicman
18-03-2015, 18:21
با سلام. با بررسی دقیق تر متوجه شدم که جابجایی هیچ تاثیری نداره و فقط تغییرات جابجا میشه دلیلش هم خیلی واضحه چون عملا ولتاژ بین دو پایه ای که در یک صفحه هستن و مثل یک خازن عمل میکنند رو میخونیم.
خب در صفحه y تغییرات در هردوسمت وجود داره و به نظر میرسه تاچ در این صفحه مشکل داره علی رغم اینکه در صفحه x کاملا درسته؟؟؟
به نظرتون باید بیخیال این تاچ بشم. تاچ 5 اینچی که تازه از کویرالکترونیک خریدم و خراب هستش. البته همراه با ال سی دی هستش. بدون اینکه استفاده کنم (واقعا زور داره)
به نظرتون چیکار باید کرد؟؟؟