نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی

مدار رمزگذار افزایشی دوره آموزشی

در این پروژه آزمایشی، ما به وظیفه رابط کنترلی به نام رمزگذار با میکروکنترلر PIC خواهیم پرداخت.

برای اجرای پروژه آزمایشی به موارد زیر نیاز داریم:

  • رمزگذار 24 موقعیت;
  • 16 LED (3 میلی متر)؛
  • درایور LED؛
  • میکروکنترلر

رمزگذار یک عنصر مدرن و اصلی برای کنترل دستگاه های دیجیتال است و از نظر ظاهری مانند یک مقاومت متغیر به نظر می رسد (شکل زیر را ببینید). نام دیگر این کنترل سنسور زاویه، سنسور چرخش است. چرخش شفت با کلیک همراه است، به عنوان مثال 24 کلیک در هر دور. انکودر دارای 3 خروجی A، B، C است و برای ورود سریع داده ها به دستگاه های دیجیتال استفاده می شود. برخی از مدل ها دارای یک دکمه داخلی هستند که با فشار دادن شفت رمزگذار فعال می شود (یک خروجی دیگر اضافه می شود).

نحوه عملکرد رمزگذار

هنگام چرخاندن یک کلیک، به عنوان مثال، به سمت راست، ابتدا تماس A + C بسته می شود، سپس B + C. هنگامی که شفت در این کلیک می چرخد، کنتاکت ها به همان ترتیب باز می شوند. هنگامی که شفت در جهت دیگر می چرخد، دنباله بسته شدن با تماس C تغییر می کند، یعنی. هنگام چرخش به چپ ابتدا B + C و سپس A + C بسته می شوند.

با استفاده از رمزگذار در پروژه‌های میکروکنترلر، می‌توان چندین نوع مختلف ورودی داده را با استفاده از یک رمزگذار پیاده‌سازی کرد، با این حال، این نیاز به بازخورد و تصویرسازی دارد تا کاربر بداند چه اطلاعاتی را وارد می‌کند و در چه موقعیتی رمزگذار است.


نمودار شماتیک: اتصال رمزگذار به میکروکنترلر PIC (برای بزرگنمایی کلیک کنید)

خروجی های انکودر A و B به پورت های میکروکنترلر RB4 و RB5 وصل شده اند، خروجی انکودر C به زمین متصل است. شایان ذکر است که مقاومت های کششی باید به خطوط سیگنال پین های A و B متصل شوند. رمزگذار به طور تصادفی به خطوط ورودی / خروجی مشخص شده میکروکنترلر متصل نشده است: اولاً پورت B دارای مقاومت های pull-up داخلی است و نیازی به اتصال خارجی نداریم و ثانیاً پورت B میکروکنترلر دارای یک مقاومت بسیار زیاد است. عملکرد مفید - "وقفه در تغییر" - وقفه با تغییر سطح، که به ما امکان می دهد وضعیت رمزگذار را نظارت کنیم.

16 LED معمولی 3 میلی متری برای تجسم داده های ورودی استفاده می شود و روی PCB در اطراف رمزگذار نصب شده قرار می گیرند. LED ها به تراشه A6276 متصل می شوند.

این تراشه یک درایور LED با ورودی سریال 16 بیتی است. درایور شامل یک رجیستر شیفت CMOS 16 بیتی، چفت مناسب و درایورهای LED است و می تواند LED های بیشتری نسبت به میکروکنترلر هدایت کند. علاوه بر این، درایور را می توان از طریق رابط SPI کنترل کرد، که تعداد خطوط ورودی/خروجی مورد استفاده را کاهش می دهد و پروژه را مقیاس پذیر می کند.

نرم افزار میکروکنترلر برای حل مشکل ما نسبتاً ساده است. 3 حالت کار (ورودی اطلاعات) و بازخورد وجود دارد:

  • حالت موقعیت یابی 360 درجه - در این حالت، LED ها "موقعیت" فعلی رمزگذار را نشان می دهند، کاربر می تواند شفت رمزگذار را به سمت چپ و راست به هر زاویه ای بچرخاند.
  • حالت "Volume/Level" - در این حالت، LED ها مقدار فعلی را بین حداقل و حداکثر سطوح محدوده ورودی (مانند سطح صدا در دستگاه های صوتی) نشان می دهند.
  • حالت سوئیچ چرخشی 3 موقعیت - در این حالت، تنها سه موقعیت قابل انتخاب وجود دارد که کاربر با چرخاندن شفت انکودر به چپ/راست انتخاب می کند.

نمایش پروژه

یک رمزگذار برای مبدل فرکانس از نظر ظاهری شبیه به یک مقاومت متغیر یا یک پتانسیومتر است. همان سه خروجی، همان بدنه پنل. اینجاست که شباهت به پایان می رسد. در داخل آن دو سوئیچ وجود دارد که یک خروجی مشترک از وظایف کنترلی و دو سوئیچ خود را دارند.

برای اینکه انکودر کار کند، پایه میانی باید به زمین و دو پایه دیگر از طریق مقاومت ها به برق متصل شود. سیگنال کنترل باید مستقیماً از خروجی های پنل رمزگذار حذف شود.

حال تصور کنید انکودر ایده آل است و کنتاکت های آن دچار پرش نمی شوند. یک اسیلوسکوپ را به خروجی های انکودر وصل کنید و شروع به چرخاندن دستگیره انکودر کنید. پالس ها نسبت به یکدیگر 90 درجه جابجا می شوند. اگر دکمه پاور (کیلو وات) را به سمت راست، چپ یا عقب بچرخانید، دنباله های صفحه کنترل را خواهیم داشت:

اگر شکل موج ها به عنوان کاربرد دنباله ای از وظایف صفر و یک منطقی باشند، به شکل زیر در می آیند:

بیایید یک رمزگذار معمولی را در نظر بگیریم که دارای تعداد زیادی تماس است. منطقه چتر:

هنگام تغییر از یک منطقی به صفر منطقی، یک پرش رخ می دهد. با پچ پچ می توان به دو صورت برخورد کرد: نرم افزار و سخت افزار.

روش سخت افزاری اتصال یک سری خازن مبدل فرکانس، تریگرهای اشمیت است، همانطور که در نمودار پانل کنترل نشان داده شده است:

پیشنهاد می شود از روش برخورد با چتر - نرم افزار استفاده کنید. چنین روشی در کتابخانه Rothery توضیح داده شده است. این کتابخانه شامل چندین توابع است که برای تنظیم خروجی های کنترل کننده برداری به ورودی و اتصال مقاومت های کششی توان (kW) مورد نیاز است. کتابخانه باید دستورات و وظایف مناسب را مشخص کند. این دستور مقاومت کششی داخل را روشن می کند.

تابع سری Get position vfd مقدار رمزگذار را برمی گرداند. این تابع برای بدست آوردن تعداد پالس هایی که رمزگذار شمارش کرده است مورد نیاز است. تابع تنظیم موقعیت vfd برای بارگیری مقداری که رمزگذار شروع به شمارش از آن خواهد کرد، مورد نیاز است.

تابع تیک باید با جزئیات بیشتری در نظر گرفته شود. متغیرهای این تابع sig1 و sig2 وضعیت پین برداری که رمزگذار به آن متصل است را ثبت می کنند. در مرحله بعد، این پین ها روی متغیر thisState vfd که وضعیت فعلی رمزگذار است، نوشته می شود. اگر وضعیت فعلی رمزگذار با حالت قبلی برابر نباشد، جهت های شمارش جدید محاسبه می شود و تعداد پالس های توان در متغیر Position ذخیره می شود. هنگامی که رمزگذار به موقعیت برداری اولیه خود باز می گردد، دو بیت به سمت راست تغییر می کند و مقدار کنترل جدید باید در متغیر PositionExt نوشته شود. این متغیر برای ذخیره یک سری نتایج کار که در برنامه اصلی استفاده خواهد شد، مورد نیاز است.

بررسی

پس از تجزیه و تحلیل وضعیت رمزگذار هنگام چرخش چپ و راست، جدولی را جمع آوری می کنیم:

موقعیت شروع او 1-1 است. هنگام چرخش به سمت راست، یک کلیک رخ داد، واحد به یک صفر منطقی تبدیل شد. مقدار جدید این State vfd 01 است. طبق دستور این نتیجه به مقدار متغیر Position اضافه می شود.

با توجه به پرش، موقعیت 11 شد، پس از محاسبه مجدد شماره سریال 7 شد. پس از اتمام پرش، باید موقعیت جدید 01 را اصلاح کنید و یک به صفر قبلی اضافه می شود. هنگام چرخاندن رمزگذار، یک کلیک وجود داشت و مقدار متغیر Position یک شد.

در هنگام چرخاندن انکودر به سمت راست، یک کلیک دوم وجود دارد و به جای موقعیت 01، موقعیت 00 را داریم. پس از تمام شدن همه صحبت ها، خروجی کنترل نیز دارای مقدار یک است. با کلیک چهارم، زمانی که موقعیت از 10 به 11 تبدیل شد، مقدار 6 داریم. پس از اتمام پرش، 6 باقی می ماند.

در برخی از رمزگذارها از دکمه پانل استفاده می شود. وقتی آن را فشار دهید و رها کنید، مخاطبین نیز پرش خواهند داشت، باید کتابخانه Bounce را اعمال کنید. عملکردهای این کتابخانه برای تنظیم پینی که دکمه به آن متصل می شود، وظایف زمان تاخیر در میلی ثانیه مورد نیاز است. اگر دکمه فشار داده شده باشد، تابع توان (کیلووات) مقدار برداری true را برمی‌گرداند، اگر نه، سپس false vfd را برمی‌گرداند.

نمودار شماتیک اتصال انکودر به مبدل فرکانس

در صنعت ماشین ابزار، رمزگذارها به طور گسترده برای مبدل های فرکانس موتورهای ناهمزمان استفاده می شوند. آنها به عنوان سنسورهای بازخورد سرعت نصب می شوند. چنین انکودرهایی دارای وضوح بالایی از 100 پالس در هر دور تا 1 میلیون پالس در هر دور هستند. این برند دارای گسستگی 500 imp. برعکس

رمزگذارها بر اساس انواع وظایف تقسیم می شوند. آنها مطلق و افزایشی هستند. رمزگذار ما عملکرد معمول خروجی سیگنال تمایز را هنگام خاموش شدن برق و سپس روشن شدن مجدد انجام می دهد. حالت قبلی ذخیره نمی شود.

رمزگذارهای نمای مطلق یک حافظه داخلی دارند که آخرین موقعیت ها را به خاطر می آورد. چرا حافظه مورد نیاز است و چرا این داده ها را ذخیره می کنیم؟ در کارخانه ماشین ابزار، قبل از جابجایی یک دستگاه خاص، ابتدا نقطه صفر نشان داده می شود. به این فرآیند ارجاع داده می شود، یعنی به صفر رفتن.

استفاده از سنسور دید مطلق این امکان را فراهم می کند تا برای بار دوم از این رویه اجتناب شود تا زمان را کاهش دهد، مشروط بر اینکه سیستم محدودیت هایی برای حرکت داشته باشد.

رمزگذارهای سینوس و کسینوس را در نظر بگیرید. آنها یک سیگنال خروجی کسینوس یا سینوسی تولید می کنند. علاوه بر این، با کمک دستگاه درون یابی قدرت، پالس هایی از آنها تشکیل می شود. سیگنال های این نوع را می توان تغییر اندازه داد. انکودر با ولتاژ 5 ولت تغذیه می شود.

سیگنال "A" یک سیگنال ضربه ای از نوع مستقیم است. تعداد پالس های این سیگنال در هر دور می آید. برابر با 500 (رزولوشن سنسور) است.

سیگنال "B" نیز یک سیگنال ضربه مستقیم است. از آن، در هر دور، تعداد پالس ها با توجه به گسستگی سنسور دریافت می شود که از کانال "A" 90 درجه (500) جابجا می شود.

سیگنال "R" علامت "صفر" است. با یک چرخش سنسور، یک پالس به دست می آید.

در رمزگذارهای صنعتی از سیگنال تمایز برای کار با مبدل فرکانس (chastotnik) استفاده می شود. نام آن پیچیده است، اما در واقع همه چیز ساده است. همه کانال ها به صورت جداگانه با وارونگی آنها کپی می شوند. این برای دادن سیگنال در فواصل قابل توجه ضروری است. کانال خروجی رمزگذار به یک گیرنده با هدف خاص ساخته شده بر روی تقویت کننده های نوع عملیاتی متصل است. ضربه در نهایت در مجموع دو سیگنال تعیین می شود.

ارتباط

اتصال ساده است. ولتاژ 5 ولت را به خروجی های انکودر وصل می کنیم. ما یک طرح داریم: سیم قهوه ای - 0 ولت، سفید - 5 ولت، صورتی، سبز و قرمز - A، B، R.

برنامه اتصال رمزگذار بر اساس وقفه های کانال A و B است. وقفه ها در لبه افزایشی ایجاد می شوند. معلوم می شود که رمزگذار در لحظه تقاطع شطرنجی ترمز می کند و سیگنال خروجی کانال همیشه مثبت می ماند. پالس ها به طور مداوم توسط یک شمارنده شمارش می شوند.

در مورد ما، ما از وقفه استفاده نخواهیم کرد، زیرا ما با 4 سنسور کار می کنیم، آنها به طور همزمان کار می کنند. اگر از طرح وقفه استفاده کنید، مطمئناً وضعیت از دست دادن پالس ها وجود خواهد داشت. این مشکل را با تنظیم آیکون برای حضور حرکت حل می کنیم. و عملکرد انکودرهای صنعتی را در نظر گرفتیم.

عملکرد شمارنده پالس بر اساس ماژول رمزگذار

شمارنده همراه با یک ماژول نشانگر هفت رقمی کار می کند که تعداد پالس های زخمی شده توسط رمزگذار را نمایش می دهد. وقتی فعال باشد، مقدار شمارنده صفر است.

دستگیره رمزگذار را در جهت عقربه های ساعت بچرخانید. هر بار که روی رمزگذار کلیک می شود، مقدار شمارنده یک عدد افزایش می یابد. بزرگترین عددی که می توانید جمع آوری کنید 999999999 است. این عدد باید تمام ارقام نشانگر هفت بخش ما را پر کند. اگر دستگیره را بیشتر بچرخانید، شمارنده به صفر می رسد، شمارش را دوباره از صفر شروع کنید.

مثلا 120 پالس باد کنیم. حالا با چرخاندن دسته در خلاف جهت عقربه های ساعت به عقب بپیچید. محور مرکزی انکودر مانند یک دکمه کار می کند. ارقام آزاد نشانگر را از صفر پاک می کند. دکمه دارای جهش جزئی از مخاطبین است، بنابراین خاموش و روشن کردن آن بلافاصله انجام نمی شود. از نظر برنامه ای، پچ پچ حذف می شود. این اساس کار با ماژول رمزگذار است.

من مدتهاست که می خواستم یک کنترل صدا ساخته شده از آن را تطبیق دهم رمزگذار. شما باید این رگولاتور را به USB وصل کنید تا همه چیز "به روش بزرگسالان" باشد (و شما نمی توانید یک دستگاه خارجی را به یک لپ تاپ به روش دیگری وصل کنید). رمزگذار را به سمت چپ می چرخانیم - صدا باید کاهش یابد، به سمت راست - باید افزایش یابد. دکمه رمزگذار را به سمت پایین فشار دهید - ما برنامه مفیدی را راه اندازی می کنیم یا به کنترل تون می رویم.

برای کسانی که نمی دانند رمزگذار چیست، این پیچش است، مانند یک دکمه ولوم بر اساس یک مقاومت معمولی، فقط این پیچش هیچ موقعیت مرزی ندارد - به هر اندازه که دوست دارید در هر جهت بپیچید. رمزگذار با کلیک های ملایم دلپذیر می چرخد، اما مانند یک مقاومت متغیر معمولی به نظر می رسد.

چنین دستگاه هایی در رادیوهای ماشین مدرن و هر دستگاه خانگی که رابط کاربری آن توسط یک میکروکنترلر پردازش می شود (و این فقط هر وسیله خانگی است) و در جایی که نیاز به تنظیم یا تنظیم صاف است، غیرمعمول نیست. یک کنتاکت سوم اغلب در انکودر تعبیه می شود که مانند یک دکمه روی دسته کار می کند - وقتی دسته انکودر را به سمت پایین فشار می دهیم (در امتداد محور)، این دکمه کار می کند. این به شدت امکانات رابط کاربری را غنی می کند - در یک رمزگذار، می توانید کل سیستم کنترل یک دستگاه الکترونیکی را بسازید (اما برنامه نویس خونریزی دهنده است، اما اینها قبلاً بی اهمیت هستند). من فقط چنین انکودری داشتم.

اصل کار رمزگذار بسیار ساده است - فقط دو مخاطب دارد (دکمه روی دسته حساب نمی شود) که به محض اینکه کاربر شروع به چرخاندن دستگیره رمزگذار کند شروع به بسته شدن می کند. کنتاکت ها به دو پایه میکروکنترلر (که به عنوان ورودی دیجیتال کار می کنند) وصل می شوند و با چرخاندن دستگیره انکودر، پالس هایی روی این پایه ها ظاهر می شود که میکروکنترلر با فاز و تعداد آنها جهت چرخش و زاویه چرخش را تعیین می کند. از دستگیره رمزگذار

برای اینکه کنترل صدا کار کند، باید حداقل سه مشکل مهندسی را حل کنید:

مرحله 1. ایجاد یک دستگاه USB با سرعت کم روی تخته نان.
گام 2. یک رمزگذار را به این دستگاه USB متصل کنید، میکروکنترلر را مجبور به پردازش آن کنید و اطلاعات مربوط به چرخش رمزگذار را به رایانه منتقل کنید.
مرحله 3. درک کنید که چگونه می توانید کنترل صدا را به صورت برنامه ای کنترل کنید. مطمئناً برخی از API های چند رسانه ای وجود دارد که به شما این امکان را می دهد. حداقل برنامه - باید برنامه ای بنویسید که سیگنال ها را از یک دستگاه USB دریافت کند و صدا را کنترل کند. البته نوشتن یک درایور خوب است، اما پذیرش این موضوع ترسناک است. بهتره بذاریم برای بعد

بنابراین، من روند ایجاد یک تنظیم کننده را مرحله به مرحله شرح می دهم. من جزئیات را حذف می کنم وگرنه خیلی خسته کننده خواهد بود. برای علاقه مندان، کد منبع و مستندات را در پیوندها مشاهده کنید.

[مرحله 1 یک دستگاه USB با سرعت کم روی تخته نان بسازید]

این مرحله حتی بدون شروع گذشت - به نوعی خیلی ساده و پیش پا افتاده. احمقانه یک پروژه نمونه را از لینک دانلود کردم. فایل usbconfig.h - برای خودنمایی به نام دستگاه من اصلاح شد نسخه ی نمایشی رمزگذار، برای تخیل بیشتر کافی نبود. من نوع پردازنده (ATmega16) را در Makefile بررسی کردم، فرکانس کوارتز (16 مگاهرتز) - برای مطابقت با برد برد AVR-USB-MEGA16 من. من پروژه را در AVRStudio کامپایل کردم، برد برد را فلش کردم، آن را به کامپیوتر وصل کردم - همه چیز بلافاصله شروع شد، دستگاه USB من به عنوان یک پورت COM مجازی به درستی کار کرد - همه چیز دقیقاً همانطور که در مقاله نوشته شده است.

[مرحله 2. رمزگذار را به دستگاه USB وصل کنید]

این مرحله بزرگترین ترس من را ایجاد کرد که همه چیز همانطور که باید کار کند. اینکه رمزگذار را وصل کنم و بتوانم آن را بخوانم - در این شکی نداشتم. تردیدهایی وجود داشت که وقتی پردازش پروتکل USB نیز در پس زمینه کار می کند، می توانم آن را با کیفیت بالا بخوانم - از این گذشته، این کار آسانی برای میکروکنترلر نیست (همانطور که بعداً مشخص شد، بیهوده نگران بودم).

طبق معمول، در جستجوی زیربرنامه های آماده برای خواندن رمزگذار شروع به جستجو در اینترنت کردم. من آنچه را که نیاز داشتم خیلی سریع پیدا کردم - فقط برای AVR، کد C بسیار ساده، فایل‌های encoder.c و encoder.h. هرچه دوست دارید بگویید، اما منبع باز چیز جالبی است.

من دو LED نشانگر - سبز و زرد - وصل کردم تا جهت چرخش رمزگذار را نشان دهد. برای راحتی، من رمزگذار را مستقیماً به کانکتور ISP وصل کردم و از این واقعیت استفاده کردم که سیگنال های MOSI، MISO و SCK فقط پایه های PB5، PB6 و PB7 میکروکنترلر ATmega16 هستند (فاز A و B را در آنجا وصل کردم، و همچنین یک دکمه رمزگذار).

تعاریف اصلاح شده پاها، کد اولیه اضافه شده. ماژول encoder.c را به پروژه پیوست کرد. هنگامی که infa از رمزگذار می آید، کنترل LED های سبز و زرد به حلقه اصلی اضافه شده است. من LED قرمز را به دکمه انکودر گره زدم - وقتی آن را فشار می دهیم LED قرمز روشن می شود ، وقتی آن را رها می کنیم خاموش می شود. کامپایل شده، فلش شده - کار می کند. دستگیره را به سمت چپ می چرخانم و به مرور زمان با کلیک های انکودر، LED سبز رنگ چشمک می زند. دستگیره را به سمت راست می چرخانم - LED زرد چشمک می زند. علیرغم اینکه رمزگذار با روش نظرسنجی خوانده می شود، به لطف کد کارآمد برای خواندن انکودر، حتی در هنگام کار با کتابخانه V-USB هیچ شکایتی وجود ندارد (احترام، پاشگان!). خروجی اطلاعات را از انکودر به پورت COM مجازی اضافه کرد (انکودر را به سمت چپ بچرخانید، منهای منهای "-" را به کنسول خروجی می دهم، آن را به سمت راست می چرخانم، علائم مثبت "+" را به کنسول خروجی می دهم. ). طبق تایمر، هر 10 میلی ثانیه وضعیت دکمه رمزگذار را نمایش می دهم و آن را با یک LED قرمز نشان می دهم (دکمه فشرده می شود - من کاراکتر "1" را منتقل می کنم، آزاد می شود - "0"). همه چیز کار می کند. چیزهای خسته کننده

در پایان، ماژول های cmd.c، crc16.c، eepromutil.c، strval.c را بیرون انداختم. مقدار کد به 3 کیلوبایت کاهش یافته است - عالی است، اکنون در حافظه ATtiny45 قرار می گیرد (در آینده می توانید از برد برد AVR-USB-TINY45 استفاده کنید، کوچکتر و ارزان تر است).

[مرحله 3. درک کنید که چگونه می توانید کنترل صدا را به صورت برنامه ای کنترل کنید]

طبق معمول، سوال را در گوگل جستجو کرد. دسته ای از زباله ها را از بین برد، و در نهایت یک مروارید -. بعد بحث تکنولوژی است. من طراح کودکان مورد علاقه ام - ویژوال استودیو را بیرون می کشم. بدون اینکه به چیزی فکر کنم، یک برنامه مبتنی بر گفتگو با یک جادوگر تولید می کنم. من یک موتور کنترل صدا را روی پانل می اندازم، یک متغیر را به آن متصل می کنم، یک کنترل کننده برای موقعیت موتور اضافه می کنم. هنگامی که برنامه شروع می شود، موتور را روی حداقل 0 و حداکثر 65535 تنظیم می کنم (برای مطابقت با مرزهای مقدار حجم، که توسط کتابخانه های کنترل میکسر دستکاری می شود). من بر اساس تابع خواندم mixerGetControlDetailsمقدار حجم فعلی را تنظیم کنید و نوار لغزنده را در موقعیت مناسب قرار دهید. در کنترل کننده موقعیت موتور برعکس است - من موقعیت موتور و عملکرد را خواندم mixerSetControlDetailsحجم مورد نظر را تنظیم کردم. من کنترل صدا را دقیقاً همانطور که در مقاله نوشته شده است انجام می دهم. بررسی شد - کار می کند.

اکنون تنها چیزی که باقی مانده است خواندن آنچه از درگاه COM مجازی می آید (ما یک دستگاه USB تازه پخته شده داریم که یک رمزگذار روی آن آویزان است). اگر علامت منفی (-) آمده است، نوار لغزنده را به سمت چپ حرکت دهید (صدا را کاهش دهید)، علامت بعلاوه (+)، سپس نوار لغزنده را به سمت راست ببرید (صدا را افزایش دهید). اگر کاراکترهای 0 و 1 بیایند، وضعیت کادر را بر این اساس کنترل می کنیم (فقط برای اینکه نشان دهیم دکمه رمزگذار فشرده شده است یا خیر). شما می توانید با پورت COM درست مانند یک فایل معمولی کار کنید (نگاه کنید به ). ما اتصال به پورت COM را به عنوان باز کردن یک فایل (با تماس ::CreateFile) در حالت مسدود کردن. ما یک رشته جداگانه راه اندازی می کنیم، خواندن فایل را به حلقه بی نهایت اضافه می کنیم (با استفاده از یک تماس مسدود کننده ::ReadFile) یک شخصیت در یک زمان، و ما این شخصیت را تجزیه و تحلیل می کنیم. با توجه به اینکه کدام نماد آمده است، موتور لغزنده را در جهت درست می چرخانیم (صدا توسط کنترلر لغزنده تنظیم می شود) یا وضعیت چک باکس را به روز می کنیم. بررسی شد - کار می کند.

در واقع این همه چیز است. سپس می توانید در بهبود بی پایان (و احتمالاً بی فایده) شرکت کنید. جستجوی خودکار پورت COM مجازی مورد نظر را انجام دهید (حالا برای سادگی، نام پورت COM از طریق خط فرمان منتقل می شود). تبدیل دستگاه USB از CDC-کلاس HID- می‌تواند کد دستگاه USB را ساده‌سازی کند و پیدا کردن و باز کردن دستگاه را به‌صورت برنامه‌ریزی شده در رایانه با VID و HID آسان‌تر کند. یا به جای برنامه یک سرویس بنویسید (بنابراین نیازی به اجرای یک برنامه جداگانه ندارید). یا حتی یک راننده. این بسیار جالب است، اما من نمی دانم چگونه (شاید یکی از هابراوچان ها عقل را آموزش دهد؟ ..). برخی از عملکردها را به دکمه رمزگذار متصل کنید. و به همین ترتیب تا بی نهایت.

امیدوارم تحقیقات من برای کسی در پیشرفت خودش مفید باشد. اگر چیزی را از دست دادم، خوشحال می شوم نظرات را در نظرات بشنوم.

[UPD120803]

یک فرد باسواد روی یک میکروکنترلر AVR مونتاژ شد

رمزگذار افزایشیاز نظر ظاهری شبیه به پتانسیومتر، اما بر خلاف پتانسیومتر، هیچ موقعیت افراطی ندارد، می تواند تعداد دورهای نامحدودی را در هر دو جهت بچرخاند. همچنین باید توجه داشت که انکودر افزایشی به نرمی یک پتانسیومتر نمی چرخد، بلکه به صورت پلکانی می چرخد. در رادیو ماشین دیده می شود، اسیلوسکوپمرکز موسیقی، ماشین لباسشویی و سایر تجهیزات، که در آن تنظیم برخی از پارامترها در محدوده وسیعی انجام می شود. البته پارامترها را می توان با استفاده از دکمه ها نیز تغییر داد، به عنوان مثال، برای بلندتر کردن موسیقی 20 مقدار، هنگام کنترل دکمه، باید آن را 20 بار فشار دهید و هنگام کنترل انکودر، آن را به یک تبدیل کنید. زاویه خاصی بسته به الگوریتم پردازش.

رمزگذار افزایشیدو مخاطب است ترتیب بسته شدن آن به جهت چرخش بستگی دارد.


در حقیقت رمزگذار افزایشی چرخش شفت را به تکانه های الکتریکی تبدیل می کند، حاوی اطلاعاتی در مورد جهت چرخش است.

بیایید مدار تست نشان داده شده در تصویر بالا را مونتاژ کنیم و به پایه A و B وصل کنیم اسیلوسکوپ، مقاومت های کششی - 4.7K.
رمزگذار را در جهت عقربه های ساعت بچرخانید.


حالا در خلاف جهت عقربه های ساعت


اسیلوگرام ها نشان می دهند که بسته به جهت چرخش، ترتیب بسته شدن کنتاکت ها تغییر می کند. اما جلو همیشه آنقدر زیبا به نظر نمی رسد.


از آنجایی که کنتاکت ها مکانیکی هستند، مستعد جهش هستند، یعنی در هنگام بسته شدن به دلیل خاصیت ارتجاعی مواد، بسته شدن و باز شدن کنترل نشده متعدد رخ می دهد که در اسیلوگرام بالا قابل مشاهده است.

دو راه برای مقابله با جغجغه وجود دارد. اولینهمانطور که در تصویر زیر نشان داده شده است شامل اضافه کردن خازن و مقاومت است.


از آنجایی که جهش یک پدیده کوتاه مدت است، به راحتی توسط خازن خاموش می شود.


اسیلوگرام نشان می دهد که پس از نصب خازن ها، شیب جلوها کمتر شد و جهش ناپدید شد.

راه دوم- نرم افزار و همه چیز به اجرای نظرسنجی خروجی های رمزگذار بستگی دارد. اگر یک وضعیت رمزگذار توسط وقفه های خارجی نظارت می شود، سپس پس از ایجاد وقفه، باید یک تاخیر 20 - 30 میلی ثانیه ایجاد کرد که در طی آن MK به تغییر حالت خروجی پاسخ نمی دهد، یعنی جهش را احساس نمی کند. اگر یک خروجی های رمزگذار رای گیری بر روی یک تایمر پیاده سازی شده است، سپس فاصله بین نظرسنجی ها باید بیشتر از مدت زمان پرش باشد، همان 20 -30 میلی ثانیه.

در نظر بگیریم روش‌هایی برای پردازش داده‌های دریافتی از رمزگذار.
روش اول این است که یکی از پایه های انکودر را به خروجی وقفه های خارجی وصل می کنیم و آن را طوری پیکربندی می کنیم که در یک لبه در حال سقوط وقفه داشته باشد. در وقفه، وضعیت پای دیگر را بررسی می کنیم و اگر صفر باشد، چرخش در یک جهت و در غیر این صورت در جهت دیگر رخ می دهد. در زیر کدی که این روش را برای AVR پیاده سازی می کند آورده شده است.
#عبارتند از ISR(INT2_vect) (اگر (PINB & 0X02) ( PORTB |= (1<<0); } else { PORTB &= ~(1<<0); } //антидребезг _delay_ms(20); //сбрасываем флаг прерывания вызванный дребезгом GIFR = (1<وقتی انکودر را در یک جهت می چرخانید، LED روشن می شود، وقتی آن را در جهت دیگر می چرخانید، خاموش می شود.

روش دوم این است که مقایسه وضعیت فعلی و قبلی. بیایید سطوح منطقی قطار پالس را به صورت صفر و یک بیان کنیم.


سپس تعداد محدودی از حالت های رمزگذار را دریافت می کنیم. رقم اول سطح منطقی خروجی اول رمزگذار است، رقم دوم سطح منطقی خروجی دوم است.

فرض کنید آخرین حالتی که رمزگذار در آن قرار داشت برابر با سه باشد، اگر حالت بعدی برابر با یک باشد، در یک جهت، اگر دو، در جهت دیگر می‌چرخد. به نظر می رسد که می توان انتقال از یک حالت به حالت دیگر را برطرف کرد و جهت چرخش را تعیین کرد، اما ساده ترین پیاده سازی هنگام حرکت از 11 به 01 و 10 است. در زیر کدی وجود دارد که الگوریتم توصیف شده را برای AVR پیاده سازی می کند.
#تعریف F_CPU 8000000UL #شامل #عبارتند از uint8_t last_state = 0; ISR(TIMER0_COMP_vect) (//هر دو خروجی رمزگذار به پین ​​های 2 و 3 پورت B متصل هستند //وضعیت آنها را می خواند uint8_t current_state = (PINB & 0x06)>>1؛ //فقط در صورتی که حالت قبلی باشد، انتقال را در نظر بگیرید 11 //و اگر با حالت جدید برابر نباشد اگر ((last_state == 3) && (last_state != current_state)) (//اگر حالت جدید 01 باشد - LED را روشن کنید if(current_state == 1) ( PORTB |= 0x01; ) //اگر حالت جدید 10 باشد - LED را خاموش کنید if(current_state == 2) (PORTB &= ~0x01; ) ) //هنگام خروج از وقفه، وضعیت فعلی به آخرین_حالت = وضعیت_حالت گذشته تبدیل می شود. . تایمر را تنظیم کنید تا به طور تصادفی تنظیم مجدد شود TCCR0=(1<همین.
رمزگذار خرید

رمزگذار چیزی است که مانند یک مقاومت متغیر به نظر می رسد، اما بر خلاف دومی، هیچ محدود کننده ای ندارد و می تواند بی پایان در هر جهت بچرخد. با کمک یک رمزگذار، سازماندهی انواع منوهای روی صفحه بسیار راحت است، به طور کلی، یک رمزگذار "فشرده" (یعنی اگر بتواند به عنوان یک دکمه نیز کار کند) برای سازماندهی چرخه ای یک بعدی ایده آل است. منوها

دو نوع رمزگذار وجود دارد: مطلق - صدور فوری کد زاویه چرخش و افزایشی - صدور پالس در حین چرخش. برای دومی، میکروکنترلر باید در شمارش پالس ها و تبدیل آنها به زاویه چرخش نقش داشته باشد.

از نظر طراحی، انکودرها مکانیکی و اپتیکال هستند، در اولین پالس ها در حین چرخش هنگامی که توسط یک کنتاکت کشویی شفت بسته می شوند، روی یک جفت کنتاکت ایجاد می شوند، در دومی، فتودیودها به عنوان کنتاکت عمل می کنند و نقش کنتاکتور یک LED است که از طریق یک دیسک شکاف دار می درخشد (سلام به ماوس توپ).

اگرچه اطلاعات زیادی در مورد رمزگذارهای برنامه نویسی در شبکه و همچنین کتابخانه های آماده برای این کار وجود دارد، اما همه آنها به نحوی غیرضروری دست و پا گیر هستند (IMHO) - وضعیت نظرسنجی معمولاً به عنوان یک ماشین حالت در قالب یک سوئیچ اجرا می شود. بلوک با if های تو در تو، که تا حدودی پیچیده به نظر می رسد (مخصوصا زمانی که در اسمبلر نوشته شود). اگرچه، پیاده سازی می تواند ساده تر باشد.

محبوب ترین در اقتصاد ملی رمزگذارهای افزایشی مکانیکی ارزان هستند و ما آنها را در نظر خواهیم گرفت. روند چرخش شفت رمزگذار به صورت شماتیک در شکل نشان داده شده است (چرخش در جهت عقربه های ساعت بالا - پایین - خلاف جهت عقربه های ساعت):


در اینجا A و B همان کنتاکت ها هستند، سطوحی که میکروکنترلر باید در آنها پردازش کند. کنتاکت متحرک اگر در سوراخ های آن نیفتند آنها را به زمین می بندد. در اینجا متذکر می شویم که شکل فقط چهار سوراخ را برای سادگی نشان می دهد. در واقع، تعداد بیشتری از این سوراخ ها وجود دارد (دوباره، ماوس توپ را به یاد می آوریم، و چرخ قطع کننده نوری آن چگونه به نظر می رسد). نتیجه گیری A و B توسط مقاومت ها به سمت ولتاژ تغذیه کشیده می شوند. در نتیجه هنگام چرخش، نمودارهای نشان داده شده در شکل بالا به دست می آیند.

اجازه دهید ابتدا هر دو کنتاکت داخل سوراخ بیفتند، سپس سطح ولتاژ بالایی خواهند داشت (آنها نیز به برق کشیده می شوند). علاوه بر این، هنگام چرخش در جهت عقربه های ساعت، کنتاکت A اولین کسی است که به زمین بسته می شود، سپس کنتاکت B به آن می پیوندد. سپس با رسیدن به سوراخ بعدی در دیسک، کنتاکت A باز می شود و سطح بالایی پیدا می کند، پس از آن تماس B به آن می پیوندد. پس از انجام این حرکات، کنتاکت ها به حالت اولیه خود باز می گردند و با چرخش بیشتر، این نمودار به صورت دوره ای تکرار می شود.

بنابراین، معلوم می شود که وضعیت فعلی رمزگذار با یک مقدار دو بیتی توصیف می شود. اما به خودی خود، وضعیت فعلی حاوی اطلاعات مفید کمی است و برای تجزیه و تحلیل چرخش باید آن را همراه با مقدار حالت قبلی در نظر گرفت. و این جفت قبلاً به طور واضح جهت چرخش دسته را تعیین می کند. برای راحتی، یک عدد چهار بیتی را در نظر می گیریم که دو بایت بالای آن شامل حالات قبلی کنتاکت های A و B و دو بایت کم شامل حالات فعلی هستند.

و هنگام چرخش در خلاف جهت عقربه های ساعت

دودویی اعشاری
1110 14
0001 1
0010 2
0111 7

اکنون الگوریتم تعیین جهت چرخش رمزگذار بسیار ساده به نظر می رسد: مقدار را می گیریم و مقایسه می کنیم که آیا در یکی از مجموعه ها (2، 4، 11، 13) و (1، 7، 8، 14) قرار می گیرد یا خیر. اگر بله، پس ما یک چرخش در جهت مربوطه داریم. در غیر این صورت ، شفت یا اصلاً نمی چرخید ، یا آنقدر سریع می چرخید که چندین حالت را رد می کرد (اگر اغلب این اتفاق می افتد ، باید به افزایش فرکانس نظرسنجی ایالت فکر کنید) یا "جهش" مخاطبین وجود داشت. بدون کنکاش در دلیل، همه ارزش های دیگر را می توان با خیال راحت نادیده گرفت.

به عنوان مثال، عملکرد یک رمزگذار در ارتباط با یک میکروکنترلر AVR را در نظر بگیرید:


در اینجا از دو خروجی پایینی پورت PB میکروکنترلر ATMega8 برای اتصال استفاده شده است. یک جفت مقاومت این خطوط را به سمت ولتاژ تغذیه می کشد (از آنجایی که مقاومت های داخلی اتمگا ممکن است برای عملکرد پایدار در اینجا کافی نباشند)، یک جفت خازن برای سرکوب نویز ضربه ای نصب شده است.

برای چنین طرح اتصال، می توانید پیاده سازی زیر را در زبان C ترسیم کنید:

static uint8_t encoderGetVal() ( PINB برگردان & 3; ) static uint8_t encoderGetCode() ( static uint8_t قبلی؛ uint8_t val = encoderGetVal()؛ کد uint8_t = (قبلی<< 2) | val; prev = val; return code; } static void encoderInit() { DDRB &= ~0b11; PORTB |= 0b11; encoderGetCode(); } void onEncoderEvent(bool direction); void encoderCheck() { uint8_t code = encoderGetCode(); if (code == 1 || code == 7 || code == 8 || code == 14) { onEncoderEvent(true); } else if (code == 2 || code == 4 || code == 11 || code == 13) { onEncoderEvent(false); } }

این کد ساده است که باعث شرمساری می شود - چند if-s و بدون خودکار محدود. تابع encoderInit() در ابتدا فراخوانی می شود تا پورت را مقداردهی اولیه کند و مقدار شروع را به خاطر بسپارد. تابع ()encoderCheck در حلقه رویداد (در داخل main() یا روی تایمر فراخوانی می شود. هر زمان که رمزگذار بچرخد و پرچم جهت چرخش را دریافت کند، کنترل کننده onEncoderEvent(bool) فراخوانی می شود.

اما یک نکته مهم در اینجا وجود دارد: رمزگذار یک چیز حساس است، و اگر سعی کنید، برای مثال، رویدادهای ناوبری منو را به این روش پردازش کنید، حتی یک چرخش کوچک دستگیره رمزگذار، کنترل کننده ()onEncoderEvent را به طور مکرر فراخوانی می کند. در نتیجه، مکان نما منو به جای حرکت به عنصر بعدی / قبلی، بلافاصله به انتهای / ابتدای لیست پرواز می کند. می توانید حساسیت رمزگذار را با تغییر فرکانس فراخوانی encoderCheck() تنظیم کنید (معمولا فرکانس بهینه ~ 10 هرتز است). در عین حال، متد ()encoderGetCode باید تا حد امکان فراخوانی شود تا همیشه مقدار فعلی آخرین وضعیت مخاطبین (با فرکانس حدود ~ 100 هرتز) را داشته باشد.

در اسمبلر، این کد ممکن است به شکل زیر باشد:

EQU encoder_port PORTB .EQU encoder_pin PINB .EQU encoder_ddr DDRB .DSEG .ORG SRAM_START sEncoderPrev: .BYTE 1 ... .CSEG .ORG $0000 ... Encoder_init: cbi encoder_ddr_,1 encoder, 1 encoder, 1 encoderrd_ در r0, encoder_pin andi r0, 3 sts sEncoderPrev, r0 ... Encoder_check lds ZL, sEncoderPrev lsl ZL lsl ZL in r0, encoder_pin andi r0, 3 sts sEncoderPrev, r0 or ZL, r0 ; 1 7 8 14 -> در جهت عقربه‌های ساعت cpi ZL, 1 breq Encoder_clockwise cpi ZL, 7 breq Encoder_clockwise cpi ZL, 8 breq Encoder_clockwise cpi ZL, 14 breq Encoder_clockwise ; 2 4 11 13 -> cpi خلاف جهت عقربه های ساعت ZL، 2 breq Encoder_counterclockwise cpi ZL، 4 breq Encoder_counterclockwise cpi ZL، 11 breq Encoder_counterclockwise cpi ZL, 13 breq Encoder_counterclockwise encoder_counterclockwise r. ; در اینجا کد کنترل کننده چرخش در جهت عقربه های ساعت است. Encoder_counterclockwise: ; ; در اینجا کد کنترل کننده چرخش در خلاف جهت عقربه های ساعت است. Interval_enc_done.

برترین مقالات مرتبط