مقدمه
در این مقاله سعیشدهاست که درمورد لوکس متر دیجیتال TSL256X توضیحاتی داده شود و همچنین یک پروژه صنعتی شامل کتابخانههای مختلف قراردادهشدهاست، برای راحتیکار میتوان از ماژولهای موجود در بازار استفادهکرد.
معرفی
چیپهای TSL2560 و TSL2561 مبدلهای میزان شدتنور به یک سیگنال دیجیتال هستند که در TSL2561 میتوان ازطریق رابط I2C و در چیپ TSL2560 ازطریق رابط SMBus به محتویات و رجیسترهای داخلی چیپ دسترسیداشت.
در شکلزیر میتوانید معماری داخلی چیپ را مشاهدهکنید.
همانطورکه در شکل مشخص است قسمت آنالوگ از دو کانال تشکیلشدهاست که کانال یک، خود از دو فتودیود تشکیلشدهاست و کانال دوم فقط از یک فتودیود تشکیلشدهاست. همچنین چیپ از دو کانال ADC برای تبدیل شدت نور تابانده شده به دو کانال سنسور به مقادیر دیجیتالی با رزولوشن ۱۶بیت بهره میبرد. البته خروجی این مبدل باید توسط یکسری فرمول که در ادامه توضیحداده میشود، به محدوده پاسخ چشم انسان بردهشود.
از کاربردهای این سنسور میتوان به پنل نمایشگرهای LCD و OLED … و دوربینهای دیجیتال، گوشیهای هوشمند و همچنین روشنایی معابر و محیطهای صنعتی اشارهکرد.
همانطورکه گفتیم چیپ دارای دو کانال ADC هست که سیگنال ورودی از دو کانال فتودیودی را تبدیل میکند که البته این عمل در هر دو کانال باهم یکسان است. بعداز اتمام سیکل تبدیل، این مبدلها دیتای خروجی را بلافاصله برروی رجیسترهای مربوطبه ADC بهصورت جداگانه نوشته میشود(هر کانال برروی یک رجیستر) و بعداز انجام اینکار، عملیات تبدیل دوباره آغاز میگردد و این چرخه ادامهدارد.
ارتباط با این چیپ کار راحتی است و میتوان فقط با دو سیم بهصورت رابطهای استاندارد I2C و SMBus ارتباط را برقرار کرد. همچنین بهدلیل دیجیتالیبودن ارتباط سیستم، میتواند از مصونیت بالایی در مقابل نویز برخوردار باشد.
همچین این چیپ بدلیل داشتن وقفه، ما را از چککردن دائم سنسور معاف میکند و از تلفشدن زمان پردازنده جلوگیری میکند که همین امر میتواند بر کارایی سیستم اثر داشتهباشد. همچنین واحد وفقه قابلیت جالب دیگری دارد که میتوان از آن برای تغییرات محسوس در شدت نور استفادهکرد که میزان این تغییرات قابلتعریف است.
در شکلزیر میتوانید مدلهای مختلف و اینترفیسهای مختلف این سنسور را مشاهدهکنید.
برای اطلاعات بیشتر از پایهها و دیگر مولفهها، میتوانید به دیتاشیت قطعه مراجعهکنید. فقط توجهکنید اگر از ماژول استفاده نمیکنید ولتاژ تغذیه چیپ ۲.۵تا ۳.۶ولت است. ولی اگر از ماژولهای موجود استفاده میکنید تقریبا همه با ۵ولت کار میکنند البته باید توجهشود که برخیاز مدلها با ۳.۳ولت کار میکنند. در شکلزیر میتوانید این مولفهها را مشاهدهکنید.
باتوجهبه جدولبالا میتوان این نکته را دریافت که اینترفیس ارتباطی سنسور با ولتاژی بین ۲.۱تا ۳.۶ولت کار میکند و با ۵ولت سازگار نیست.
باتوجهبه شکلبالا میتوان دریافت که واحد اندازهگیری شدت نور از دو فتودیود ۶۴۰و ۹۴۰نانومتری تشکیلشدهاست. زمان ادغام(اندازه گیری Tint) وابسته به فرکانس اسیلاتور و همچنین مقدار integration در رجیسترها است. که در ادامه توضیحداده میشوند. اگر فرکانس اسیلاتور ۷۳۵کیلوهرتز باشد زمان ادغام برابر با Tint = (number of clock cycles)/fosc خواهد بود. همچنین باتوجهبه مقدار رجیستر مربوطبه تایمینگ میتوان مدت زمان ادغام را کمو زیاد کرد.
توجهشود که هرچه زمان بیشتری به مبدل بدهیم دقت نیز بالاتر خواهد بود.
Field value 00: Tint = (11 × 918)/fosc = 13.7 ms Field value 01: Tint = (81 × 918)/fosc = 101 ms Field value 10: Tint = (322 × 918)/fosc = 402 ms اگر به فرمول Tint = (number of clock cycles)/fosc
توجهشود بهراحتی میتوان متوجهشد که با تغییر مقدار Field value که جزئیاز رجیسترهای چیپ است، عملا تعداد سیکلهایی که یک تبدیل نیاز دارد کمو زیاد میشود که این مستقیما برروی دقت تبدیل اثرگذار است. همچنین مقداری که مقیاس ADC به خود میگیرد، وابستهبه مقدار تایمی است که به مبدل داده میشود یا به زبان سادهتر به تعداد سیکلی که از کلاک به مبدل تخصیص داده میشود.
که به روشزیر محاسبه میشود:
Full scale ADC count value = ((number of clock cycles)/2 − 2) Field value 00: Full scale ADC count value = ((11 × 918)/2 − 2) = 5047 Field value 01: Full scale ADC count value = ((81 × 918)/2 − 2) = 37177 Field value 10: Full scale ADC count value = 65535
و چون مقادیر در رجیسترهای ۱۶بیتی ذخیره میشوند بیشترین مقداری که مبدل میتواند ذخیرهکند مقدار ۶۵۵۳۵ است. چون برای رسیدن به بیشترین مقدار یعنی ۶۵۵۳۵ نیاز به ۱۳۱۰۷۴ سیکل از کلاک است پس باید زمان اندازهگیری Tint بزرگتر از ۱۷۸میلیثانیه باشد، یعنی باید در رجیستر تایمینگ مقدار ۱۰ که بیشترین زمان اندازهگیری است، مقدار ۴۰۲ میلیثانیه است را تنظیمکنیم.
در شکلهای زیر پایهها و انواع پیکیجهای این چیپ را میتوانید مشاهدهکنید.
حال نوبت به برقراری ارتباط با چیپ رسیده است.
اینترفیس ارتباطی TSL256X ازطریق دو سیم میسر است و میتوان طبق استانداردهای SMBus که مخفف System Management Bus و همچنین رابط I2C یا TWI با چیپ ارتباط برقرار کرد و به رجیسترها و تنظیمات داخلی آن دسترسیداشت. برای آدرسدهی آیسی میتوان از پین ADDR SEL استفادهکرد.
در جدول شکلزیر میتوان حالات پین و مقادیر آدرس را برای هر دو اینترفیس مشاهدهکرد.
در این مقاله و سورسکد، از اینترفیس I2C یا همان TWI استفادهشدهاست. برای اطلاعات بیشتر درمورد SMBus به http://www.smbus.org/specs و برای TWI به http://www.semiconductors.philips.com مراجعه کنید.
درمورد اینترفیس این چیپ در بالا توضیح دادهایم اما پروتکل کاری آن به چه شکل است؟
TSL256X از پروتکل سادهای استفاده میکند و که به شکلزیر است.
بین بایتهایی که میان پردازنده اصلی و سنسور انتقال داده میشود، اگر بایتی که ازطرف پردازنده آمد، پرارزشترین بیت آن یک میباشد. و به اینمعنی است که بایت دریافتی حاوی دستورات یا COMMAND است و در همین بایت چهاربیت آخر(کم ارزش) حاوی آدرس رجیسترهایی است که پردازنده قصد دسترسی به آن را دارد.
پکت دیتا در TWI و SMBus بهصورتزیر میباشد.
در SMBus برای انتقال دیتا میتوان طبق روند زیر عمل کرد.
Send Byte Protocol Receive Byte Protocol Write Byte Protocol Write Word Protocol Read Word Protocol Block Write Protocol Block Read Protocol
اما در TWI فقط دادهها را بصورت پروتکلهای خواندن و نوشتن عادی، بهصورت فریمهای ۸بیتی بههمراه ۱بیت تصدیق، انتقال داد.
رجیسترها
TSL256x دارای ۱۶رجیستر (۳عدد از آن رزرو) است که توسط آنها میتوان به مانیتورینگ و کنترل چیپ پرداخت. همچنین علاوهبراین ۱۶رجیستر یک رجیستر دیگر به COMMAND دارد. که در شکلزیر این رجیسترها بهنمایش درآمده است.
رجیستر COMMAND همیشه اولین فریمی است که ارسال میشود و طبق این فریم، چیپ تشخیص میدهد که دستور چیست. در شکلزیر این رجیستر ۸بیتی را مشاهدهمیکنید که:
- بیتهای ۰تا ۳ مربوط به آدرس رجیسترهای چیپ است(همانطورکه آدرسها را در جدولبالا میبینید).
- بیت چهارم مربوط به اینترفیس SMBus است که تعیین میکند دادهها را بهصورت یک بلوک ارسال یا دریافت کند. اگر این بیت
- یک شود، این عمل انجام میشود.
- بیت ۵ مربوطبه SMBus است و فقط اینبار تعیین میکند که چیپ بهصورت WORD داده ها را انتقال دهد یا از پروتکل Write/Read Word استفادهکند.
- بیت ۶ بهمنظور پاککردن وقفههاست که با یکشدن این بیت پاک میشوند.
- بیت ۷ تقریبا همیشه یک است چون نشاندهنده رجیستر COMMAND است.
فقط به ایننکته توجهشود که برخلاف TWI در SMBus میتوان کل اطلاعات را درقالب یک عمل خواند.
بهعنوانمثال
میتوان مقادیر ذخیرهشده در دو کانال ADC که خود دارای ۴رجیستر است را بهصورت یک بلوک۳۲ خواند، اما در TWI باید این رجیسترها را تکبه تک خواند و هربار یک آدرس را بفرستیم تا اینکه ۴کانال تمامشوند.
رجیستر کنترلی(Control Register 0h)
فقط ۲بیت اول این رجیستر قابلدسترسی است که وضعیت پاور را مشخص میکند اگر مقدار 03h نوشتهشود چیپ روشن و اگر 00h نوشتهشود خاموش میشود.
رجیستر (Timing Register 1h)
این رجیستر برای مقداردهی به گین و همچنین مقدار تایم اندازهگیری که در بالا توضیحدادهشد بکار میرود.
بیتهای ۰ و ۱ مربوطبه تعیین زمان اندازهگیر است که طبق جدولزیر میتوان آن را تنظیمنمود.
با نوشتن مقدار۱ در بیت ۳ چرخه تبدیل آغاز میشود. و همچنین با نوشتن ۱ در بیت۴ مقدار گین ۱۶ درنظرگرفته میشود و با نوشتن۰ مقدار گین ۱ حساب میشود. در شکلزیر این رجیستر را مشاهده میکنید.
رجیستر (Interrupt Threshold Register 2h − 5h)
این رجیستر برای تنظیم مقدار نقاط موردنظر جهت تولید وفقه است که بهصورت دو عدد ۱۶بیتی برای کمترین و بیشترین مقدار قابلتنظیم است. اگر مقدار خواندهشده از کانال ۰ مبدل کمتر یا بیشتر از مقدار موردنظر باشد روی پین INT یک وقفه فرستاده میشود.
رجیستر کنترل وفقه(Interrupt Control Register 6h)
از این رجیستر برای تنظیم سیکلهای تولید وقفه و همچنین تعیین نوع وفقه تولیدی استفاده میشود.
بیتهای ۰ تا ۳ریت(نرخ) تولید وفقه را تعیین میکنند، بهطورمثال بعداز هر سیکل، ADC وقفه تولید شود یا بعداز دو دوره از زمان اندازهگیری انجامشود(در بالا توضیحدادهشد که بهطورمثال برای ۱۰۱میلیثانیه بعداز ۲۰۲میلیثانیه وفقه تولید میشود).
در جدول شکلزیر این مقادیر مشاهده میشود.
در شکلزیر عملکرد بیتهای ۴و ۵ نشانداده شدهاست که تعیین میکند چهنوع وفقهای تولید شود یا کلا غیرفعال باشد.
رجیستر شناسه(ID Register Ah)
همانطورکه از اسم آن پیداست مربوطبه شناسه چیپ میباشد که از دو قسمت تشکیلشدهاست. که ۴بیت اول آن مربوطبه شناسه سختافزاری و ۴بیت دوم آن مربوطبه شناسه نوع چیپ است که مقدار ۰۰۰۰ مربوطبه چیپ TSL2560 و مقدار ۰۰۰۱ مربوطبه چیپ TSL2561 میباشد.
رجیستر کانالهای مبدل (ADC Channel Data Registers Ch − Fh)
این ۴ رجیستر که دوعدد از آن برای کانال ۰ و دوعدد برای کانال ۱ است، مقادیر خواندهشده از ADC را نگهداری میکند.
حال نوبت به توضیح نمونهکد میرسد که اگر به هدر Tsl2561.h توجهشود تمام آدرسها و مقادیر توضیحدادهشده در این مقاله و دیتاشیت را در خود جایدادهاست.
خب برای روشنکردن سنسور کافیست اتصالات آن را برقرار کنید و تابع کوچک زیر را فرا بخوانید. که مقدار x اگر ۱ باشد روشن و اگر ۰ باشد خاموش میشود.
#define TSL_POWER( x ) ((x) ? ( TSL2561_WriteByte( TSL2561_ADDR, TSL2561_COMMAND_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWERON ) ) : \ ( TSL2561_WriteByte( TSL2561_ADDR, TSL2561_COMMAND_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWEROFF ) ) );
در این هدر ساختارهایی را که میبینید مربوطبه تنظیم گین و تایم اندازهگیری است.
typedef enum { TSL2561_INTEGRATIONTIME_13MS = 0x00, // 13.7m TSL2561_INTEGRATIONTIME_101MS = 0x01, // 101ms TSL2561_INTEGRATIONTIME_402MS = 0x02 // 402ms }
بهسادگی مشخص است که برای مدت زمان اندازهگیری استفاده میشود.
typedef enum { TSL2561_GAIN_1X = 0x00, // No gain TSL2561_GAIN_16X = 0x10, // 16x gai } tsl2561Gain
از ساختار شمارشی هم برای تنظیم گین استفاده میشود حال یک struct به شکلزیر وجود دارد.
typedef struct TSL2561 { tsl2561Gain_t gain; tsl2561IntegrationTime_t integ_time; }TSL2561;
خود این ساختار از دونوع داده شمارشی تشکیلشدهاست که میتوان از این ساختار برای تنظیم کلی استفادهکرد بهطورمثال میتوان در بدنه اصلی برنامه یک نوع از ساختار را تعریفکنید و مقادیر مورد نظر را تنظیم کنید.
TSL2561 Light = { TSL2561_GAIN_1X , TSL2561_INTEGRATIONTIME_13MS }; تابع های مورد استفاده void TSL2561_WriteByte ( uint8_t, uint8_t, uint8_t ); uint8_t TSL2561_ReadByte ( uint8_t, uint8_t, uint8_t ); uint16_t TSL2561_ReadWord ( uint8_t, uint8_t ); void TSL2561_Init ( TSL2561 *sens ); void TSL2561_SetGain ( TSL2561 *sens, tsl2561Gain_t gain ); void TSL2561_SetIntegrationTime ( TSL2561 *sens, tsl2561IntegrationTime_t time ); uint16_t TSL2561_CALCULATE_LUX ( TSL2561 *sensor, unsigned int ch0, unsigned int ch1 ); محتویات تابع مربوط نوشتن یک بایت به صورت زیر است void TSL2561_WriteByte ( uint8_t address, uint8_t reg, uint8_t val ) { TWIStartCondition(); TWI_write( address ); TWI_write( reg ); TWI_write( val ); TWIStopCondition(); }
یکی از ورودیهای این تابع آدرس آیسی است که بهصورتزیر تعریفشدهاست.
#define TSL2561_ADDR ( 0x52 )
و ورودی دیگر آن، آدرس رجیستر موردنظر است که آدرسها در بالا توضیحداده شد و بهصورت یک تایپ شمارشی بهصورتزیر تعریفشدهاست.
enum { TSL2561_REGISTER_CONTROL = 0x00, TSL2561_REGISTER_TIMING = 0x01, TSL2561_REGISTER_THRESHHOLDL_LOW = 0x02, TSL2561_REGISTER_THRESHHOLDL_HIGH = 0x03, TSL2561_REGISTER_THRESHHOLDH_LOW = 0x04, TSL2561_REGISTER_THRESHHOLDH_HIGH = 0x05, TSL2561_REGISTER_INTERRUPT = 0x06, TSL2561_REGISTER_CRC = 0x08, TSL2561_REGISTER_ID = 0x0A, TSL2561_REGISTER_CHAN0_LOW = 0x0C, TSL2561_REGISTER_CHAN0_HIGH = 0x0D, TSL2561_REGISTER_CHAN1_LOW = 0x0E, TSL2561_REGISTER_CHAN1_HIGH = 0x0F };
ورودی بعدی این تابع مقداری است که قرار است روی رجیستر موردنظر نوشتهشود.
محتویات تابع خواندن هم به شکلزیر است.
uint8_t TSL2561_ReadByte ( uint8_t address, uint8_t reg, uint8_t ack ) { uint8_t dat; TWIStartCondition(); TWI_write( address ); TWI_write( reg ); TWIStartCondition(); TWI_write( address + 1 ); dat = TWI_read( ack ); TWIStopCondition(); return dat; }
وروی آدرس که مانند قبل است.
ورودی رجیستر، رجیستری است که قرار است از آن بخوانیم. اما مقدار ورودی ack یا تصدیق، چون این هدر از رابط TWI استفاده میکند. هنگام خواندن از چیپ نیاز است که دیتاهای گرفتهشده از چیپ را تصدیق کنیم و اگر به پایان دادهها رسیدیم به چیپ اشارهکنیم که دادهها بهطورکامل دریافتشدهاست. بههمینمنظور از این بیت استفاده کردهایم.
برای روشنشدن به کد زیر توجهکنید.
dataWord = (((( uint8_t )TWI_read( ACK )) << 8 ) | TWI_read( NACK ));
در کد بالا زمانی که اولین بایت را دریافت میکنیم و چون بایتهای دیگری ماندهاست، تصدیق میکنیم ولی دیتای بعدی چون آخرین بایت است آنرا تصدیق نمیکنیم و ایسی متوجه پایان عملیات انتقال دیتا میشود. همچنین مقدار خواندهشده از چیپ در این تابع بهصورت ۸بیت برگردانده میشود.
تابع مربوطبه تنظیم گین به شکلزیر است.
void TSL2561_SetGain (*sens, tsl2561Gain_t gain ) { TSL2561_WriteByte( TSL2561_ADDR, TSL2561_COMMAND_BIT | TSL2561_REGISTER_TIMING, sens->integ_time | gain ); }
ورودیهای کد بهصورت یک اشارهگره به ساختار TSL2561 که توضیحدادهشد اشاره میکند و ورودی بعدی مربوطبه مقدار گین موردنظر است که درنهایت مقدار گین را تعیین میکند.
برای استفادهاز تابع TSL2561_CALCULATE_LUX ابتدا باید مقادیر خام کانال ADCها خوانده شود و سپس این مقادیر برای محاسبه به تابع TSL2561_CALCULATE_LUX ارسال شود. برای این کار ابتدا این دو کانال را بهصورتزیر میخوانیم.
DatL = TSL2561_ReadByte( TSL2561_ADDR, TSL2561_COMMAND_BIT | TSL2561_REGISTER_CHAN0_LOW, NACK ); DatH = TSL2561_ReadByte( TSL2561_ADDR, TSL2561_COMMAND_BIT | TSL2561_REGISTER_CHAN0_HIGH, NACK ); ch0 = DatH ; ch0 <<= 8; ch0 |= DatL; DatL = TSL2561_ReadByte( TSL2561_ADDR, TSL2561_COMMAND_BIT | TSL2561_REGISTER_CHAN1_LOW, NACK ); DatH = TSL2561_ReadByte( TSL2561_ADDR, TSL2561_COMMAND_BIT | TSL2561_REGISTER_CHAN1_HIGH, NACK ); ch1 = DatH; ch1 <<= 8; ch1 |= DatL;
حال که مقادیرخام را بدست آوردیم مقدار لوکس را طبق کد زیر بدست مینویسیم.
Lux += TSL2561_CALCULATE_LUX( &Light, ch0, ch1 );
ورودیهای تابع شامل ساختار مربوطبه تنظیمات چیپ میباشد. که در آن مقدار گین و تایم را تنظیمکردهایم. و دو ورودی دیگر مقادیر، جهت خواندن دیتا از مبدلها است.
دانلود سورس پروژه AVR-ARM به همراه دیتاشیت فنی ماژول پسورد فایل : دانلود سورس کد لوکس متر دیجیتال