کاشی و کاشی

ما رمزگذار و میکروکنترلر را واسط می کنیم. ما با دیاگرام مدار رمزگذار رمزگذار و میکروکنترلر ارتباط برقرار می کنیم

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

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

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

اصل عملکرد رمزگذار

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

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

نمودار شماتیک

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

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

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

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

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

نمایش پروژه

دانلودها

آرشیو ZIP با یک پروژه در محیط MPLAB و کد منبع در Hitech C و همچنین نمودار مدار و توپولوژی تخته مدار چاپیهستند .

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

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

اول از همه، انواع مختلفی از رمزگذارها وجود دارد که در این مقاله مورد بحث قرار گرفت، افزایشی مکانیکی است. Pec12-4220f-s0024 به عنوان آزمودنی مورد استفاده قرار گرفت. از نظر ظاهری، مانند یک مقاومت متغیر به نظر می رسد، اما، بر خلاف یک مقاومت، محدود کننده ندارد، یعنی. می تواند بی پایان در هر جهت بچرخد.

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

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

در یک رمزگذار جدا شده، 1/3 از منطقه به تماس 1، 1/3 به تماس 2 تعلق دارد، منطقه جامد مشترک است. هنگامی که کنتاکت های لغزنده به مناطق جدا شده (سیاه) برخورد می کنند، صدای کلیک شنیده می شود. در این لحظه، زمانی که هر دو دکمه باز هستند، رمزگذار در حالت پایدار است. واحدهای ورود به سیستم روی پایه های پورت (وضعیت 11) وجود خواهد داشت.

به محض اینکه شروع به چرخش در هر جهتی می کنیم، یکی از کنتاکت ها به زمین بسته می شود. Log 0 در این پا ظاهر می شود، log 1 همچنان در پای دوم ظاهر می شود (وضعیت 01). اگر به چرخش ادامه دهیم، log0 (حالت 00) روی پایه دوم ظاهر می شود. سپس، تماس روی پایه اول ناپدید می شود (وضعیت 10)، و در نهایت رمزگذار به حالت پایدار باز می گردد (11). آن ها 4 تغییر حالت در هر کلیک وجود دارد. نمودار زمان بندی به صورت زیر است:

هنگام چرخش به داخل طرف مقابل، ایده ثابت می ماند، فقط پایه دوم اول بسته می شود.

اگر این حالت ها را در سیستم باینری بنویسیم و آنها را به اعشار تبدیل کنیم، ترتیب زیر را می گیریم (برای چرخش در یک جهت):
11=3
01=1
00=0
10=2

هنگام چرخش در جهت مخالف:
11=3
10=2
00=0
01=1

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

نتیجه تنها در صورتی برابر با یک خواهد بود که هر دو عدد برابر با 1 باشند، یعنی. نتیجه عملیات 1&1 برابر با 1 خواهد بود. بنابراین 1&0=0، 0&0=0، 0&1=0.

منطقی و به ما کمک می کند تا تنها پاهای مورد علاقه خود را از کل بندر جدا کنیم. آن ها عملیات x=0b00000011 & PINB; به ما این امکان را می دهد تا وضعیت دو پایه اول را بدون توجه به آنچه در پایه های باقی مانده است، در متغیر "x" بخوانیم. عدد 0b00000011 را می توان به 0x3 هگزادسیمال تبدیل کرد.

اکنون ما تمام دانش لازم برای نوشتن سیستم عامل را داریم. وظیفه: افزایش/کاهش متغیر Vol با استفاده از رمزگذار، نمایش نتیجه بر روی صفحه نمایش LCD.

#عبارتند از int NewState، OldState، Vol، upState، downState. #asm .equ __lcd_port= 0x12 ; PORTD #endasm #شامل #عبارتند از وقفه [TIM1_COMPA] void timer1_compa_isr(void) (NewState= PINB & 0b00000011 ; if (NewState!= OldState) (سوئیچ (OldState) ( مورد 2 : ( if (NewState == 3 ;ate down=0+State) شکستن ; حالت 0 : (اگر (NewState == 2 ) upState++; if (NewState == 1 ) downState++; شکستن ) مورد 3 : (اگر (NewState == 1) upState++; if (NewState == 2) downState=NewState) // مقداردهی اولیه پورت های ورودی/خروجی// مقدار دهی اولیه پورت B // Func7=در Func6=در Func5=در Func4=در Func3=در Func2=در Func1=در Func0=در // State7=T State6=T State5=T State4=T State3=T State2=T State1=P State0=P PORTB= 0x03 ; DDRB= 0x00 ; // مقداردهی اولیه تایمر/ شمارنده 1// منبع ساعت: ساعت سیستم // مقدار ساعت: 1000000 کیلوهرتز // حالت: CTC top=OCR1A // خروجی OC1A: Discon. // خروجی OC1B: Discon. // Noise Canceller: خاموش // ضبط ورودی در Falling Edge // تایمر 1 وقفه سرریز: خاموش // وقفه ضبط ورودی: خاموش // مقایسه یک وقفه مسابقه: روشن // مقایسه B Match Interrupt: خاموش TCCR1A= 0x00 ; TCCR1B= 0x0A; TCNT1H= 0x00 ; TCNT1L= 0x00 ; ICR1H= 0x00 ; ICR1L= 0x00 ; OCR1AH= 0x03 ; OCR1AL= 0xE8 ; OCR1BH= 0x00 ; OCR1BL= 0x00 ; // تایمر(ها)/ شمارشگر(ها) وقفه(های) مقداردهی اولیه TIMSK= 0x10 ; // وقفه های فعال سراسری #asm("sei") lcd_init(8 ) ; while (1 ) ( if (upState >= 4 ) ( Vol++; upState = 0 ; ) if (downState >= 4 ) ( Vol--; downState = 0 ; ) sprintf (lcd_buf, "vol=%d" , Vol) lcd_gotoxy(0, 0) ; )

#عبارتند از int NewState,OldState,Vol,upState,downState; #asm .equ __lcd_port=0x12 ;PORTD #endasm #include #عبارتند از وقفه void timer1_compa_isr(void) (NewState=PINB & 0b00000011; if(NewState!=OldState) ( switch(OldState) (مورد 2: ( if(NewState == 3) upState++; if(NewState!=OldState = ) مورد 0: ( if(NewState == 2) upState++؛ if(NewState == 1) downState++؛ break; ) case 1: ( if(NewState == 0) upState++؛ if(NewState == 3) downState++؛ break; مورد 3: ( if(NewState == 1) upState++; if(NewState == 2) downState++; ) OldState=NewState; TCNT1L=0x00; مقداردهی اولیه پورت های ورودی/خروجی // مقدار دهی اولیه پورت B // Func7=In Func6=In Func5=در Func4=در Func3=در Func2=در Func1=در Func0=در // State7=T State6=T State5=T State4 =T State3=T State2=T State1=P State0=P PORTB=0x03. خروجی: Discon // OC1B خروجی: Discon // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // مقایسه. B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x0A; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x03; OCR1AL=0xE8; OCR1BH=0x00; OCR1BL=0x00; // تایمر(ها)/ شمارنده(ها) وقفه(های) مقداردهی اولیه TIMSK=0x10; // وقفه های فعال سراسری #asm("sei") lcd_init(8); while (1) ( if (upState >= 4) ( Vol++; upState = 0; ) if (downState >= 4) (Vol--; downState = 0; ) sprintf(lcd_buf,"vol=%d",Vol) lcd_gotoxy(0,0); )

برای توضیح: تایمر 1 طوری پیکربندی شده است که 1000 بار در ثانیه شلیک کند، با خط NewState=PINB & 0b00000011; وضعیت پین های 0 و 1 پورت B را می خوانیم. if(NewState!=OldState) اگر حالت تغییر نکرده باشد، هیچ چرخشی وجود ندارد.
اگر حالت تغییر کرده باشد، ساختار سوئیچ تعیین می کند که چرخش در کدام جهت انجام شده است، بسته به این، مقدار متغیر downState (چپ) یا upState (راست) افزایش می یابد.

از یک کلیک تا کلیک بعدی 4 تغییر حالت وجود دارد، بنابراین هر 4 پالس یک بار متغیر Vol را تغییر می دهیم. ما آن را روی نمایشگر نمایش می دهیم. سیستم عامل موجود است

رمزگذار افزایشیبه نظر می رسد پتانسیومتر، اما بر خلاف پتانسیومتر، موقعیت های افراطی ندارد و می تواند تعداد دورهای نامحدودی را در هر دو جهت بچرخاند. همچنین باید توجه داشت که انکودر افزایشی به نرمی یک پتانسیومتر نمی چرخد، بلکه به صورت پلکانی می چرخد. در رادیو ماشین دیده می شود، اسیلوسکوپمرکز موسیقی، ماشین لباسشوییو تجهیزات دیگر که در آنها تنظیم برخی از پارامترها در محدوده های بزرگ انجام می شود. البته پارامترها را می توان با استفاده از دکمه ها نیز تغییر داد، به عنوان مثال، برای بلندتر کردن 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. = current_state; int main(void) (//دو ورودی برای اتصال رمزگذار DDRB &= ~ 0x06; //ورودی ها را به برق PORTB متصل کنید |= 0x06; //خروجی برای اتصال LED DDRB |= 0x01; // تایمر را روی حالت بازنشانی تنظیم کنید TCCR0=(1<همین.
من انکودر خریدم

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

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

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

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

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

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

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

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

تابع 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 پالس می باشد. برعکس

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

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

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

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

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

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

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

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

ارتباط

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

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

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

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

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

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

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

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

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

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

سیگنال خروجی مربعات رمزگذار افزایشی

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

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

فیلتر کردن جهش تماس یک رمزگذار مکانیکی

رمزگذارهای مکانیکی دارای سوئیچ‌های داخلی هستند که سیگنال خروجی مربعی را در طول چرخش تولید می‌کنند.

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

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

فیلتر کردن نویز با سخت افزار اضافی ساده تر است و نویز را در منبع آن متوقف می کند. شما به یک فیلتر RC مرتبه اول نیاز دارید. در تصویر زیر می توانید ببینید که سیگنال پس از استفاده از فیلتر RC چگونه به نظر می رسد.

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

کاربرد ساده

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

مدار مبتنی بر برد آردوینو Uno است. صفحه نمایش LCD نوکیا 5110 برای رابط گرافیکی استفاده می شود.

ما یک منوی نرم افزار ساده ایجاد خواهیم کرد که در آن عملکرد یک رمزگذار چرخشی را نشان خواهیم داد.

پردازش سیگنال های رمزگذار با استفاده از وقفه ها

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

Atmega328 دو نوع وقفه دارد که برای این منظور می توان از آنها استفاده کرد. وقفه خارجی و وقفه تغییر حالت خروجی. پین‌های INT0 و INT1 به یک وقفه خارجی اختصاص داده می‌شوند و PCINT0 - PCIN15 زمانی که پین ​​تغییر حالت می‌دهد به یک وقفه اختصاص می‌یابد. یک وقفه خارجی می تواند تشخیص دهد که سیگنال ورودی در حال سقوط یا افزایش است و می تواند تحت یکی از شرایط زیر فعال شود: افزایش، سقوط یا سوئیچینگ. منابع سخت افزاری بسیار بیشتری برای وقفه تغییر پین در دسترس است، اما نمی تواند لبه های بالا و پایین را تشخیص دهد و زمانی که تغییر حالت منطقی (تغییر) روی یک پین اتفاق می افتد، فراخوانی می شود.

برای استفاده از وقفه تغییر پین، همانطور که در نمودار مدار نشان داده شده است، خروجی های دور انکودر A و B را به A1 و A2 و خروجی دکمه را به پایه A0 آردوینو وصل کنید. پایه‌های A0، A1 و A2 را روی حالت ورودی قرار دهید و مقاومت‌های کششی داخلی آن‌ها را روشن کنید. وقفه تغییر پین را در ثبات PCICR فعال کنید و وقفه های پین های A0، A1 و A2 را در ثبات PCMS1 فعال کنید. اگر تغییری در حالت منطقی در یکی از این ورودی ها تشخیص داده شود، ISR(PCINT1_vect) (وقفه حالت پین) فراخوانی می شود.

از آنجایی که وقفه تغییر پین برای هر تغییر منطقی فراخوانی می شود، باید هر دو سیگنال (هر دو A و B) را نظارت کنیم و چرخش را زمانی که دنباله مورد انتظار دریافت شد، تشخیص دهیم. همانطور که از نمودار سیگنال مشاهده می شود، حرکت در جهت عقربه های ساعت A = …0011… و B = …1001… را ایجاد می کند. وقتی هر دو سیگنال را روی بایت‌های seqA و seqB می‌نویسیم، آخرین خوانده‌شده را به سمت راست منتقل می‌کنیم، می‌توانیم این مقادیر را مقایسه کنیم و مرحله چرخش جدید را تعیین کنیم.

می توانید بخشی از کد را مشاهده کنید که شامل تابع اولیه سازی و تغییر پین است.

Void setup() (pinMode(A0, INPUT)؛ pinMode(A1, INPUT); pinMode(A2, INPUT)؛ // فعال کردن مقاومت های کششی داخلی digitalWrite(A0, HIGH)؛ digitalWrite(A1, HIGH)؛ digitalWrite( A2، HIGH = 0b00000010. // 1. PCIE1: فعال کردن تغییر وضعیت 1 PCMSK1 = 0b0000111 // فعال کردن وقفه تغییر وضعیت برای A0, A1, A2 ( // حلقه اصلی) ISR (P_NT); ) ) ( // اگر وقفه توسط یک دکمه ایجاد شود اگر (!digitalRead(A0)) ( دکمه = درست؛ ) // اگر وقفه ناشی از سیگنال های رمزگذار دیگری باشد ( // خواندن سیگنال های A و B بولین A_val = DigitalRead (A1);<<= 1; seqA |= A_val; seqB <<= 1; seqB |= B_val; // Маскировать четыре старших бита seqA &= 0b00001111; seqB &= 0b00001111; // Сравнить запсанную последовательность с ожидаемой последовательностью if (seqA == 0b00001001 && seqB == 0b00000011) { cnt1++; left = true; } if (seqA == 0b00000011 && seqB == 0b00001001) { cnt2++; right = true; } } }

استفاده از یک وقفه خارجی فرآیند را ساده‌تر می‌کند، اما از آنجایی که این وقفه فقط دو پین به آن اختصاص داده شده است، اگر آن را با رمزگذار اشغال کنید، نمی‌توانید از آن برای اهداف دیگر استفاده کنید. برای استفاده از وقفه خارجی، باید پایه های 2 (INT0) و 3 (INT1) را در حالت ورودی قرار دهید و مقاومت های کشش داخلی آنها را روشن کنید. سپس گزینه Falling Edge را انتخاب کنید تا هر دو وقفه در ثبت EICRA فعال شوند. وقفه های خارجی را در ثبات EIMSK فعال کنید. هنگامی که شفت رمزگذار شروع به چرخش می کند، ابتدا سیگنال اصلی به صفر منطقی می رسد و سیگنال دوم برای مدتی در یک منطقی باقی می ماند. بنابراین، باید مشخص کنیم که کدام یک از سیگنال ها در حالت وقفه در حالت یک منطقی قرار دارند. پس از اینکه سیگنال پیشرو به صفر منطقی رسید، پس از مدتی سیگنال دوم نیز به صفر منطقی می‌رسد و باعث وقفه دیگری می‌شود. اما این زمان و سیگنال دیگر (پیشرو) در سطح منطقی پایینی خواهند بود، یعنی شروع چرخش نیست، بنابراین ما آن را نادیده می گیریم.

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

Void setup() (pinMode(2, INPUT)؛ pinMode(3, INPUT)؛ // فعال کردن مقاومت های کششی داخلی digitalWrite(2, HIGH)؛ digitalWrite(3, HIGH)؛ EICRA = 0b00001010؛ // انتخاب تماس در لبه سقوط EIMSK = 0b00000011 // فعال کردن وقفه خارجی ) void loop ( // حلقه اصلی ) ISR (INT0_vect) ( // اگر سیگنال دوم در حالت یک منطقی باشد، این یک چرخش جدید است اگر (digitalRead( 3) == HIGH) ( چپ = درست؛ ) ) ISR (INT1_vect) ( // اگر سیگنال دوم در حالت یک منطقی باشد، پس این یک چرخش جدید است اگر (digitalRead(2) == HIGH) (راست = درست است، واقعی؛ ) )

کد کامل طرح آردوینو، از جمله حلقه اصلی، در زیر آمده است:

#عبارتند از #عبارتند از #عبارتند از فرار بایت seqA = 0; بایت فرار seqB = 0; بایت فرار cnt1 = 0; بایت فرار cnt2 = 0; volatile boolean right = نادرست; volatile boolean left = نادرست; دکمه بولی فرار = نادرست; نور پس زمینه بولی = درست; بایت آیتم منو = 1; صفحه بایت = 1; نمایشگر Adafruit_PCD8544 = Adafruit_PCD8544(13, 12,11, 8, 10); void setup() (pinMode(A0, INPUT)؛ pinMode(A1, INPUT); pinMode(A2, INPUT)؛ // فعال کردن مقاومت های کششی داخلی digitalWrite(A0, HIGH)؛ digitalWrite(A1, HIGH)؛ digitalWrite( A2, HIGH // فعال کردن پین نور پس زمینه (9, OUTPUT) (2) جهت نمایش LDC.begin(60) را تنظیم کنید () ( // ایجاد صفحات منو if (page==1) ( display.setTextSize(1)؛ display.clearDisplay(); display.setTextColor(BLACK, WHITE)؛ display. setCursor(15, 0)؛ display.print ("MAIN MENU"); setTextColor (سیاه، سفید)؛ ) display.print(">کنتراست: 99%"); display.setCursor(0, 25); if (menuitem==2) ( display.setTextColor(WHITE, BLACK); ) else ( display.setTextColor(BLACK, WHITE); ) display.print(">Test Encoder"); if (menuitem==3) ( display.setTextColor(WHITE, BLACK); ) else ( display.setTextColor(BLACK, WHITE); ) display.setCursor(0, 35); display.print(">نور پس زمینه:"); if (نور پس زمینه) ( display.print("روشن"); ) else ( display.print("OFF"); ) display.display(); ) else if (page==2) ( display.setTextSize(1)؛ display.clearDisplay(); display.setTextColor(BLACK, WHITE)؛ display.setCursor(15, 0); display.print("ENC. TEST" display.drawFastHLine(0,10,83, BLACK) display.print("LEFT RIGHT"(5,25); display.setCursor(55, 25 display.setTextSize(2) اگر فرمان جدیدی از سمت چپ دریافت شد (left = false); =0) (آیتم منو = 3؛ ) ) اگر (راست) (راست = نادرست؛ آیتم منو++؛ اگر (منوآیتم==4) (آیتم منو=1؛ )) اگر (دکمه) (دکمه = نادرست؛ اگر (صفحه == 1) && menuitem==3) (digitalWrite(9، LOW); if (نور پس زمینه) (نور پس زمینه = نادرست؛ digitalWrite(9، LOW)؛ ) other (نور پس زمینه = درست؛ digitalWrite (9، HIGH)؛ ) در غیر این صورت اگر (صفحه == 1 && menuitem==2) ( page=2; cnt1=0; cnt2=0; ) دیگری اگر (صفحه == 2) ( page=1 ; ) ) ) ISR (PCINT1_vect) ( // اگر وقفه توسط یک دکمه ایجاد می شود اگر (!digitalRead(A0)) ( دکمه = true; ) // یا اگر وقفه ناشی از سیگنال‌های رمزگذار باشد (// خواندن سیگنال‌های A و B boolean A_val = digitalRead(A1)؛ boolean B_val = digitalRead(A2)؛ // نوشتن سیگنال‌های A و B در دنباله‌های جداگانه seqA<<= 1; seqA |= A_val; seqB <<= 1; seqB |= B_val; // Маскировать четыре старших бита seqA &= 0b00001111; seqB &= 0b00001111; // Сравнить запсанную последовательность с ожидаемой последовательностью if (seqA == 0b00001001 && seqB == 0b00000011) { cnt1++; left = true; } if (seqA == 0b00000011 && seqB == 0b00001001) { cnt2++; right = true; } } }

در ویدیوی زیر می‌توانید عملکرد رمزگذار را مشاهده کنید.