نحن نربط بين التشفير ووحدة التحكم الدقيقة. أفر

30.07.2019

في هذا المشروع التجريبي سوف ننظر في مهمة ربط عنصر تحكم يسمى المشفر مع متحكم PIC.

لتنفيذ المشروع التوضيحي سنحتاج إلى:

  • جهاز تشفير ذو 24 موضعًا؛
  • 16 مصباح LED (3 مم)؛
  • يقودها سائق؛
  • متحكم

يعد التشفير عنصر تحكم حديث وأصلي للأجهزة الرقمية، وهو يشبه في المظهر المقاوم المتغير (انظر الشكل أدناه). الاسم الآخر لعنصر التحكم هذا هو مستشعر الزاوية، ومستشعر الدوران. يكون دوران العمود مصحوبًا بنقرات، على سبيل المثال 24 نقرة لكل دورة. يحتوي جهاز التشفير على 3 مخارج - A وB وC ويستخدم لإدخال البيانات بسرعة إلى الأجهزة الرقمية. تحتوي بعض الطرز على زر مدمج يتم تنشيطه بالضغط على عمود التشفير (تتم إضافة مخرج آخر).

مبدأ تشغيل التشفير

عند الدوران بنقرة واحدة، على سبيل المثال، إلى اليمين، يتم إغلاق جهة الاتصال A+C أولاً، ثم B+C. عندما يتم تشغيل العمود عند هذه النقرة، يتم فتح نقاط الاتصال بنفس التسلسل. عندما يتم تدوير العمود في الاتجاه الآخر، يتغير تسلسل الإغلاق مع جهة الاتصال C، أي. عند الانعطاف إلى اليسار، يتم إغلاق B+C أولاً، ثم A+C.

باستخدام برنامج التشفير في مشاريع المتحكم الدقيق، من الممكن تنفيذ عدة أنواع مختلفة من إدخال البيانات باستخدام نفس برنامج التشفير، ومع ذلك، فإن هذا يتطلب بعض التعليقات والتصور حتى يعرف المستخدم ما هي المعلومات التي يدخلها وفي أي موضع يوجد جهاز التشفير.


رسم تخطيطي: توصيل جهاز التشفير بالمتحكم الدقيق PIC (انقر للتكبير)

يتم توصيل أطراف التشفير A وB بمنفذي وحدة التحكم الدقيقة RB4 وRB5، ويتم توصيل طرف التشفير C بالأرض. تجدر الإشارة إلى أنه يجب توصيل مقاومات السحب بخطوط الإشارة الخاصة بالمنفذين A وB. ليس من قبيل الصدفة أن يكون جهاز التشفير متصلاً بخطوط الإدخال / الإخراج المحددة لوحدة التحكم الدقيقة: أولاً، يحتوي المنفذ B على مقاومات سحب مدمجة ولا يتعين علينا توصيل مقاومات خارجية، وثانيًا، المنفذ B لوحدة التحكم الدقيقة لديه وظيفة مفيدة للغاية - "المقاطعة عند التغيير" - المقاطعة عن طريق تغيير المستوى، مما سيسمح لنا بمراقبة حالة برنامج التشفير.

يتم استخدام 16 مصباح LED عادي مقاس 3 مم لتصور بيانات الإدخال وسيتم وضعها على لوحة الدائرة المطبوعة حول جهاز التشفير المثبت. ترتبط مصابيح LED بشريحة A6276.

الشريحة عبارة عن برنامج تشغيل LED مزود بإدخال معلومات تسلسلية 16 بت. يحتوي برنامج التشغيل على سجل تحويل CMOS 16 بت، ومزالج ومحركات مرتبطة للتحكم في مصابيح LED، ويمكنه تشغيل عدد أكبر من مصابيح LED مما يسمح به جهاز التحكم الدقيق. بالإضافة إلى ذلك، يمكن التحكم في برنامج التشغيل عبر واجهة SPI، مما يقلل من عدد خطوط الإدخال/الإخراج المستخدمة ويجعل المشروع قابلاً للتطوير.

برنامج المتحكم الدقيق لحل مشكلتنا بسيط نسبيًا. هناك 3 أوضاع تشغيل (إدخال المعلومات) وردود الفعل:

  • وضع تحديد المواقع بزاوية 360 درجة - في هذا الوضع، تشير مصابيح LED إلى "الموضع" الحالي لجهاز التشفير، ويمكن للمستخدم تدوير عمود التشفير إلى اليسار واليمين إلى أي زاوية؛
  • وضع "مستوى الصوت/المستوى" - في هذا الوضع، تشير مصابيح LED إلى القيمة الحالية بين الحد الأدنى والحد الأقصى لمستويات الإدخال (مثل مستوى الصوت في أجهزة الصوت)؛
  • وضع المفتاح الدوار ثلاثي المواضع - في هذا الوضع، لا يوجد سوى ثلاثة أوضاع قابلة للتحديد يختارها المستخدم عن طريق تحويل عمود التشفير إلى اليسار/اليمين.

مظاهرة للمشروع

تعرف على كيفية استخدام التشفير الدوار التزايدي في مشروع Arduino.

جهاز التشفير الدوار هو جهاز كهروميكانيكي يحول الحركة الدوارة إلى معلومات رقمية أو تناظرية. إنه مشابه جدًا لمقياس الجهد، ولكن يمكن تدويره إلى أجل غير مسمى، إما في اتجاه عقارب الساعة أو عكس اتجاه عقارب الساعة. هناك عدة أنواع من أجهزة التشفير الدوارة. النوعان الرئيسيان هما المشفرات المطلقة والنسبية (التزايدية). بينما يقوم المشفر المطلق بإخراج قيمة متناسبة مع زاوية العمود الحالي، يقوم المشفر التزايدي بإخراج ميل العمود واتجاهه. أصبحت أجهزة التشفير الدوارة أكثر شيوعًا في الأجهزة الإلكترونية الاستهلاكية، خاصة كمقابض التحكم، بالإضافة إلى التطبيقات في العديد من المجالات الأخرى. إنها تحل محل مقاييس الجهد وأزرار التنقل حيث يلزم التنقل السريع والإعداد وإدخال البيانات واختيار القائمة. تتضمن بعض أجهزة التشفير أيضًا زرًا مدمجًا يقوم بإنشاء مدخلات إضافية للمعالج والتي يمكن استخدامها كأمر مستخدم آخر في واجهة التحكم. في الصورة أدناه، يمكنك رؤية جهاز تشفير دوار تزايدي نموذجي مزود بزر الطاقة.

في هذه المقالة، سنوضح لك كيفية استخدام التشفير الدوار التزايدي في مشروع Arduino. سنشرح كيفية التعامل مع ارتداد الاتصال وتفسير إشارات التشفير في برنامج متحكم دقيق باستخدام المقاطعات.

إشارة إخراج تربيع التشفير التزايدي

يُنتج المشفر الدوار التزايدي إشارتين للخرج أثناء دوران العمود، ويسمى أيضًا الخرج التربيعي. اعتمادًا على الاتجاه، تتقدم إشارة واحدة على الأخرى. يمكنك أدناه رؤية الشكل الموجي للإخراج لجهاز التشفير الدوار المتزايد وتسلسل البت المتوقع.

كما يتبين من الشكل، كلا المخرجين يكونان في البداية في الحالة المنطقية الواحدة. عندما يبدأ عمود التشفير في الدوران في اتجاه عقارب الساعة، تنخفض الحالة عند الإخراج A إلى الصفر المنطقي أولاً، ثم يتبعه الإخراج B بتأخر. عند الدوران عكس اتجاه عقارب الساعة، يحدث العكس. تعتمد الفواصل الزمنية في مخطط الإشارة على سرعة الدوران، ولكن تأخر الإشارة مضمون في أي حال. بناءً على هذه الخاصية التي يتميز بها التشفير الدوار التزايدي، سنكتب برنامجًا لـ Arduino.

تصفية ارتداد الاتصال لجهاز التشفير الميكانيكي

تحتوي أجهزة التشفير الميكانيكية على مفاتيح مدمجة تولد إشارة خرج تربيعية أثناء الدوران.

عند التعامل مع إشارات التشفير، فإن المشكلة الرئيسية هي ارتداد الاتصال. إنه يسبب تحديدًا خاطئًا لاتجاه الدوران ومقدار دوران عمود التشفير ويجعل استخدام أجهزة التشفير مشكلة. يمكننا التخلص من ارتداد جهات الاتصال عن طريق تصفيته في أحد البرامج أو استخدام أنظمة تصفية إضافية.

تعد تصفية الضوضاء في برامج المتحكم الدقيق أحد خيارات التصفية، ولكن لها بعض العيوب. تحتاج إلى كتابة تعليمات برمجية أكثر تعقيدًا للتعامل مع الضوضاء. ستستغرق عملية التصفية وقت المعالجة وستؤدي إلى حدوث تأخيرات في سلسلة محادثات البرنامج الرئيسية. قد تحتاج إلى ضبط مؤقتات لتجاهل فترات ارتداد جهات الاتصال. وفي النهاية، قد لا تتمكن من الحصول على نتيجة مرضية وموثوقة.

تعتبر تصفية الضوضاء باستخدام أجهزة إضافية أكثر بساطة وتوقف الضوضاء عند مصدرها. سوف تحتاج إلى مرشح RC من الدرجة الأولى. في الصورة أدناه يمكنك رؤية كيف تبدو الإشارة بعد استخدام مرشح RC.

يعمل مرشح RC على إبطاء وقت السقوط ووقت الصعود ويوفر ارتدادًا للأجهزة. عند اختيار زوج المقاوم والمكثف، يجب أن تأخذ في الاعتبار السرعة القصوى. وإلا، سيتم تصفية الاستجابة المتوقعة لبرنامج التشفير.

تطبيق بسيط

سنقوم بإنشاء تطبيق يوضح كيفية استخدام التشفير الدوار في مشروع Arduino. سوف نستخدم برنامج التشفير للتنقل وإدخال البيانات والاختيار. يوجد أدناه رسم تخطيطي للتطبيق.

تعتمد الدائرة على لوحة Arduino Uno. يتم استخدام شاشة LCD الخاصة بهاتف Nokia 5110 للواجهة الرسومية، ويتم إضافة جهاز تشفير دوار ميكانيكي مزود بزر ومرشحات RC كعناصر تحكم.

سنقوم بتطوير قائمة برمجية بسيطة سنوضح فيها تشغيل جهاز التشفير الدوار.

معالجة إشارات التشفير باستخدام المقاطعات

يجب اكتشاف إشارات التشفير وتفسيرها في البرنامج في أسرع وقت ممكن حتى لا يعيق تدفق البرنامج الرئيسي. يمكننا اكتشاف الإشارات عن طريق الاقتراع في الحلقة الرئيسية، أو باستخدام المقاطعات. الاستقصاء ليس فعالاً لأنك تحتاج إلى حجز الوقت والموارد في الحلقة الرئيسية، مما يؤدي إلى تأخيرات إضافية. يعد استخدام المقاطعات حلاً أسرع وأكثر فعالية من حيث التكلفة. سنوضح لك كيفية استخدام المقاطعات لمعالجة إشارات التشفير.

يحتوي Atmega328 على نوعين من المقاطعات التي يمكن استخدامها لهذا الغرض؛ المقاطعة الخارجية ومقاطعة تغيير الإخراج. يتم تعيين الأطراف INT0 وINT1 إلى مقاطعة خارجية، ويتم تعيين PCINT0 - PCIN15 إلى المقاطعة عندما يتغير حالة الدبوس. يمكن للمقاطعة الخارجية اكتشاف ما إذا كانت إشارة الإدخال آخذة في الانخفاض أو الارتفاع ويمكن تشغيلها في ظل أحد الشروط التالية: الارتفاع أو الهبوط أو التبديل. هناك العديد من موارد الأجهزة المتاحة لمقاطعة تغيير الدبوس، لكنها لا تستطيع اكتشاف الحواف الصاعدة والهابطة، ويتم استدعاؤها عند حدوث أي تغيير في الحالة المنطقية (التبديل) على الدبوس.

لاستخدام مقاطعة تغيير الدبوس، قم بتوصيل مخرجات تحويل التشفير A وB إلى A1 وA2، ومخرج الزر إلى Arduino pin A0، كما هو موضح في مخطط الدائرة. اضبط الأطراف A0 وA1 وA2 على وضع الإدخال وقم بتشغيل مقاومات السحب الداخلية الخاصة بها. قم بتمكين مقاطعة تغيير الدبوس في سجل PCICR وتمكين المقاطعات للدبابيس A0 وA1 وA2 في سجل PCMS1. إذا تم اكتشاف أي تغيير في الحالة المنطقية على أحد هذه المدخلات، فسيتم استدعاء ISR(PCINT1_vect) (مقاطعة حالة الدبوس).

وبما أن مقاطعة تغيير الدبوس يتم استدعاؤها لأي تغيير منطقي، فإننا نحتاج إلى مراقبة كلتا الإشارتين (A وB) واكتشاف الدوران عند تلقي التسلسل المتوقع. كما يتبين من مخطط الإشارة، فإن الحركة في اتجاه عقارب الساعة تولد A = …0011… وB = …1001…. عندما نكتب كلتا الإشارتين إلى bytes seqA وseqB، مع نقل القراءة الأخيرة إلى اليمين، يمكننا مقارنة هذه القيم وتحديد خطوة التدوير الجديدة.

يمكنك رؤية جزء من الكود الذي يتضمن وظيفة مقاطعة التهيئة وتغيير الدبوس.

إعداد الفراغ () (pinMode (A0، INPUT)؛ pinMode (A1، INPUT)؛ pinMode (A2، INPUT)؛ // تمكين مقاومات السحب الداخلية digitalWrite (A0، HIGH)؛ digitalWrite (A1، HIGH)؛ digitalWrite ( A2, HIGH); PCICR = 0b00000010; // 1. PCIE1: تمكين مقاطعة تغيير الحالة 1 PCMSK1 = 0b00000111; ) ) ( // إذا كانت المقاطعة ناجمة عن زر if (!digitalRead(A0)) ( Button = true;) // إذا كانت المقاطعة ناجمة عن إشارات التشفير else ( // قراءة الإشارات 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; } } }

يؤدي استخدام مقاطعة خارجية إلى جعل العملية أكثر بساطة، ولكن نظرًا لأن هذه المقاطعة تحتوي على طرفين مخصصين لها فقط، فلن تتمكن من استخدامها لأغراض أخرى إذا شغلتها ببرنامج تشفير. لاستخدام مقاطعة خارجية، يجب عليك ضبط الأطراف 2 (INT0) و3 (INT1) على وضع الإدخال وتشغيل مقاومات السحب الداخلية الخاصة بها. ثم حدد خيار الحافة المتساقطة لتشغيل المقاطعتين في سجل EICRA. تمكين المقاطعات الخارجية في سجل EIMSK. عندما يبدأ عمود التشفير في الدوران، تنخفض الإشارة الرائدة أولاً إلى الصفر المنطقي، وتظل الإشارة الثانية عند الصفر المنطقي لبعض الوقت. لذلك، نحن بحاجة إلى تحديد أي من الإشارات تكون في الحالة المنطقية أثناء المقاطعة. بعد أن تنخفض الإشارة الرائدة إلى الصفر المنطقي، بعد مرور بعض الوقت، ستنخفض الإشارة الثانية أيضًا إلى الصفر المنطقي، مما يتسبب في مقاطعة أخرى. لكن هذه المرة والإشارة الأخرى (البادئة) ستكون عند مستوى منطقي منخفض، مما يعني أنها ليست بداية الدوران، لذلك نتجاهلها.

يمكنك أدناه رؤية جزء من الكود الذي يتضمن وظيفة التهيئة ومعالجة المقاطعة الخارجية.

الإعداد الفارغ () (pinMode (2، INPUT)؛ pinMode (3، INPUT)؛ // تمكين مقاومات السحب الداخلية digitalWrite (2، HIGH)؛ digitalWrite (3، HIGH)؛ EICRA = 0b00001010؛ // تحديد الاتصال عند الحافة المتساقطة EIMSK = 0b00000011; // تمكين المقاطعة الخارجية ) حلقة باطلة() ( // الحلقة الرئيسية ) ISR (INT0_vect) ( // إذا كانت الإشارة الثانية في الحالة المنطقية، فهذا دوران جديد if (digitalRead( 3) == HIGH) ( left = true; ) ) ISR (INT1_vect) ( // إذا كانت الإشارة الثانية في الحالة المنطقية الواحدة، فهذا دوران جديد if (digitalRead(2) == HIGH) ( right = حقيقي؛ ) )

الكود الكامل لرسم Arduino، بما في ذلك الحلقة الرئيسية، موجود أدناه:

#يشمل #يشمل #يشمل البايت المتطاير seqA = 0؛ البايت المتطاير seqB = 0؛ البايت المتطاير cnt1 = 0؛ البايت المتطاير cnt2 = 0؛ حق منطقي متقلب = خطأ؛ اليسار المنطقي المتطاير = خطأ؛ زر منطقي متطاير = خطأ؛ الإضاءة الخلفية المنطقية = صحيح؛ عنصر القائمة بايت = 1؛ صفحة البايت = 1؛ عرض Adafruit_PCD8544 = Adafruit_PCD8544(13, 12,11, 8, 10); إعداد الفراغ () (pinMode (A0، INPUT)؛ pinMode (A1، INPUT)؛ pinMode (A2، INPUT)؛ // تمكين مقاومات السحب الداخلية digitalWrite (A0، HIGH)؛ digitalWrite (A1، HIGH)؛ digitalWrite ( A2، HIGH)؛ // تمكين pinMode لإضاءة شاشة LCD (9، OUTPUT)؛ digitalWrite (9، HIGH)؛ // 1. PCIE1: تمكين مقاطعة تغيير الحالة 1 = 0b00000111؛ (2)؛ // ضبط اتجاه شاشة العرض LDC.begin(60); // ضبط شاشة التباين على شاشة العرض.clearDisplay(); () ( // إنشاء صفحات القائمة if (page==1) (display.setTextSize(1);display.clearDisplay();display.setTextColor(BLACK, WHITE);display.setCursor(15, 0);display.print ("القائمة الرئيسية")؛ Display.drawFastHLine(0,10,83,BLACK); عرض.setCursor(0, 15); setTextColor(BLACK, WHITE); ) Display.print(">التباين: 99%"); Display.setCursor(0, 25); إذا (menuitem==2) (display.setTextColor(WHITE, BLACK);) else (display.setTextColor(BLACK, WHITE);) Display.print(">Test Encoder"); إذا (menuitem==3) (display.setTextColor(WHITE, BLACK);) else (display.setTextColor(BLACK, WHITE);) Display.setCursor(0, 35); Display.print(">الإضاءة الخلفية:"); إذا (الإضاءة الخلفية) (display.print("ON"); ) 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.setCursor(55, 25);display.setTextSize(2); =0) ( Menuitem=3; ) ) if (right) ( right = false; Menuitem++; if (menuitem==4) ( Menuitem=1; ) ) if (button) ( Button = false; if (page == 1 && Menuitem==3) (digitalWrite(9, LOW); if (backlight) ( backlight = false; digitalWrite(9, LOW); ) else ( backlight = true; digitalWrite(9, HIGH); ) ) else if (page == 1 && Menuitem==2) ( page=2; cnt1=0; cnt2=0; ) else if (page == 2) ( page=1 ; ) ) ) ISR (PCINT1_vect) ( // إذا كانت المقاطعة ناتج عن زر if (!digitalRead(A0)) ( Button = true; ) // أو إذا كانت المقاطعة ناجمة عن إشارات التشفير else ( // قراءة الإشارات 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; } } }

يمكنك رؤية برنامج التشفير أثناء العمل في الفيديو أدناه.

باختصار، يمكن تسمية أجهزة التشفير بمحولات طاقة الإزاحة الزاوية. إنها تعمل على تعديل زاوية دوران الجسم الذي يدور، على سبيل المثال، عمود الآلية، إلى إشارة تيار كهربائي. في هذه الحالة، لا يتم تحديد زاوية دوران العمود فحسب، بل يتم أيضًا تحديد اتجاه دورانه، بالإضافة إلى سرعة الدوران والموضع الحالي بالنسبة إلى الموضع الأصلي.

أصبحت أجهزة التشفير أكثر شيوعًا عند استخدامها في أنظمة الحركة الدقيقة، وفي مصانع الأدوات الآلية، وفي مجمعات الإنتاج التي تستخدم الروبوتات، وفي أجهزة القياس التي تتطلب تسجيل قياسات دقيقة للإمالة والدوران والدوران والزوايا.

أنواع ومبدأ التشغيل

أجهزة التشفير هي أجهزة استشعار الدوران. يحتوي أبسط جهاز استشعار على مقبض يمكن تدويره في اتجاه عقارب الساعة أو عكس اتجاه عقارب الساعة. اعتمادًا على زاوية الدوران والاتجاه، يتم إصدار إشارة رقمية لإبلاغ عن موضع المقبض أو في أي اتجاه تم تدويره.

بالنسبة لمثل هذا التشفير، الموضح في الشكل، يمكن أيضًا استخدام المقبض كزر. هذه وظيفة مساعدة لنوع معين من أجهزة التشفير.

بناءً على نوع البيانات المُخرجة، يتم تقسيم أجهزة التشفير إلى مجموعتين كبيرتين:

  1. مطلق.
  2. تدريجي.

التشفير المطلق

باستخدام التشفير المطلق، يتم تقسيم دائرة الدوران بأكملها إلى عدد معين من القطاعات، غالبًا ما تكون بنفس الحجم. يتم ترقيم هذه القطاعات. عند التشغيل، يعرض جهاز التشفير رقم القطاع الذي يوجد فيه حاليًا. ولهذا سميت مطلقة. باستخدام هذا النوع من أجهزة التشفير، يمكنك دائمًا تحديد الزاوية بالنسبة للقطاع الصفري الذي يتم تدوير جهاز التشفير فيه في لحظة معينة، أي أنه عند التدوير، فإنه ينتج قيم أرقام القطاع، حتى القيمة القصوى. ثم يعود إلى الصفر.

إذا تم تدوير عمود التشفير في الاتجاه الآخر، فسوف يبدأ في إنتاج قيم معاكسة. في حالتنا، يستخدم خمسة دبابيس لإخراج قيم التدوير.

هذه الخوارزمية لها عيوبها. يوضح الجدول 1 ترتيب قيم الإخراج لجهاز التشفير n. يجدر الانتباه إلى السطرين الأخيرين، الانتقال من 127 إلى 128.

الجدول 1

بالتأكيد كل البتات تتغير هنا. في برنامج التشفير المثالي تتغير جميعها في نفس الوقت ولا توجد مشاكل. في أي برنامج تشفير حقيقي تقريبًا، تتغير البتات بسرعة، ولكن ليس في وقت واحد. وفي مرحلة ما يتبين أن إخراج برنامج التشفير هو قيمة تعسفية تمامًا. وبما أن جميع البتات تتغير، فإن المشفر سيكون له قيمة عشوائية من صفر إلى جميع الآحاد.

يظهر مثال على هذا التبديل على اليمين. ماذا يمكن أن يعني هذا؟ لنلقي نظرة على مثال. يستخدم المتحكم الدقيق محركًا للتحكم في العمود وتدويره بزاوية معينة. عند نقطة معينة، عند التبديل من الخلية 127 إلى الخلية 128، فإنه يتلقى قيمة عشوائية معينة. يستنتج جهاز التحكم أن العمود موجود في مكان مختلف تمامًا، على عكس الموقع الفعلي، ويبدأ في تدويره في اتجاه مختلف، وبسرعة مختلفة، وما إلى ذلك.

بعد فترة زمنية معينة، يتلقى المتحكم الدقيق القيمة الصحيحة ويبدأ في محاولة إيقاف العمود وتدويره في الاتجاه الصحيح. يمكن أن تستغرق هذه العملية وقتًا طويلاً، بشرط تكرار حدوث مثل هذا الخطأ. مثل هذه الأخطاء غير منتظمة ويصعب حسابها.

كود رمادي

تم حل المشكلة الموضحة أعلاه عن طريق إدخال رمز رمادي. إحدى ميزات الكود الرمادي هي أنه عند تحويل جهاز التشفير إلى واحد، تتغير قيمة الكود الرمادي أيضًا بمقدار واحد. يتغير نوع واحد فقط. يمكن ملاحظة ذلك في الجدول 2 في المقارنة بين الكود الثنائي والرمز الرمادي.

الجدول 2

السطرين الأولين متماثلان، ولكن بالفعل في السطر الثاني تغير الجزء الأوسط. ثم يتغير بت واحد أيضًا. ومن الجدير بالذكر أيضًا أن كود Gray الأخير والأول يختلف بمقدار بت واحد، مما يعني أن كود Gray قد يدخل في حلقة.

ميزة هذا الرمز هي أن الخطأ الذي تمت مناقشته أعلاه غير ممكن. من بين العيوب، يمكن ملاحظة أن المتحكم الدقيق يحتاج إلى تحويل الكود الرمادي إلى كود ثنائي من أجل فهم الوضع الذي يوجد فيه المشفر المطلق.

التشفير التزايدي

النوع التالي هو التشفير التزايدي، الذي له بنية أبسط. لكنه في الوقت نفسه لا يُظهر الموقع المحدد لقلمه. فهو يظهر فقط اتجاه الدوران، ويجب حساب عدد أقسام الدوران بواسطة المتحكم الدقيق.

يحتوي جهاز التشفير التزايدي على مجموعة من الشرائط المتصلة بالأرض بشكل افتراضي، وعند تشغيلها، يتم تقصيرها وفتحها. والنتيجة هي الإشارة الموضحة في الشكل (شبيهة بالموجة المربعة). يحتوي جهاز التشفير على شريطين دائريين من هذا القبيل. تتم إزاحة الشرائط بمقدار الربع، ويتم إزاحة الإشارات أيضًا بمقدار الربع. هذا مهم لأنه يسمح لك بتحديد اتجاه الدوران.

يمكن تمثيل دائرة التشفير التزايدي في الشكل الصحيح. تشير الأزرار إلى التوصيلات الدورية لجهاز التشفير بالأرض. نظرًا لأن جهاز التشفير غير متصل بوحدة منطقية داخليًا، فمن الضروري سحب الوحدات المنطقية بشكل مستقل من الخارج من خلال المقاومات إلى خرج التشفير. في هذه الحالة، عندما لا تكون أي من أرجل جهاز التشفير متصلة بالأرض، سيكون هناك ساق منطقية على الأرجل.

إذا قام المشفر بتوصيل بعض الأرجل بالأرض، فسيكون لهذه الساق صفر منطقي. في حالة الهدوء، يكون إخراج جهاز التشفير منطقيًا. عندما تبدأ بتدوير جهاز التشفير في أي اتجاه، يتم توصيل أحد الأطراف أولاً بالأرض، ثم الآخر. بعد ذلك، يتم فصل هذه المسامير عن الأرض بدورها، ويتم تشكيل وحدة منطقية عليها مرة أخرى.

يمكن تحديد اتجاه الدوران من خلال أي من المحطات متصل بالأرض أولاً. عند حساب الدورات الكاملة، يمكنك حساب عدد النقرات التي يقوم بها جهاز التشفير.

في الواقع، المشفر لديه أربع حالات:

  1. وحدتين.
  2. صفر وواحد.
  3. صفر وصفر.
  4. واحد وصفر.

ثلاث حالات لا تساوي تلك هي غير مستقرة، ولا يمكن أن يكون المشفر فيها. تنفذ العديد من وحدات التحكم الدقيقة وظيفة عد الدورات باستخدام مؤقتات لها مدخلات محددة. يقوم المؤقت بحساب عدد النقرات على مستوى الأجهزة وفي أي اتجاه تم تشغيل جهاز التشفير، ويعرض القيمة. أي أن العداد يزيد الرقم.

من خلال تغيير هذا الرقم، يمكنك تحديد عدد النقرات التي قام بها برنامج التشفير. من خلال عدد النقرات يمكنك تحديد زاوية الدوران. يحتوي جهاز التشفير أيضًا على ارتداد الاتصال، مما يجعل تحليل الإشارة أمرًا صعبًا.

التشفير البصري

يتكون هذا المحول على شكل قرص مثبت على عمود ومصنوع من الزجاج. يختلف مستشعر الدوران البصري عن الأنواع الأخرى من حيث أنه يحتوي على مصفوفة بصرية إضافية تتحرك عند تدوير العمود. وفي الوقت نفسه، يقوم بتحويل عزم الدوران إلى تدفق ضوئي، والذي يتم استقباله بعد ذلك بواسطة جهاز استشعار ضوئي.

يتذكر المحول البصري زوايا الدوران. في هذه الحالة، يتوافق كل موضع فردي مع رمز رقمي خاص، والذي يشكل، إلى جانب عدد الثورات، وحدة قياس المستشعر. يتصل برنامج التشفير ويعمل بطريقة مشابهة لبرنامج التشفير التزايدي.

حسب طبيعة عملها يتم تقسيمها إلى الكهروضوئيةو مغناطيسي . يعتمد مبدأ تشغيل المغناطيس على استخدام المغناطيس، الذي تم اكتشافه لأول مرة في عام 1879. في هذه الحالة، يظهر فرق الجهد فقط عند وضع سلك تيار مباشر في مجال مغناطيسي.

من حيث الدقة وخصائص الدقة، فإن النوع المغناطيسي من أجهزة الاستشعار هو أدنى من الكهروضوئية، ومع ذلك، فهو أبسط في التصميم وأقل تطلبا على ظروف التشغيل والمساحة. جهاز التشفير المغناطيسي هو جهاز يكتشف مرور القطب المغناطيسي للمغناطيس أثناء الدوران بجوار العنصر الحساس. يتم التعبير عن معلومات جهاز الإرسال بالرمز الرقمي.

التشفير الكهروضوئي هو جهاز استشعار يعمل على مبدأ الكهروضوئية. ويلاحظ هذا التأثير عندما تتعرض المادة للضوء. تم اكتشاف هذا المبدأ في عام 1887. عند تشغيل مثل هذا المستشعر، يتم تحويل شعاع الضوء باستمرار إلى إشارة تيار كهربائي.

نظائرها من التشفير الكهروضوئي هي الإلكترونية الضوئية والبصرية و. تعتبر هذه المستشعرات أكثر حساسية لخصائص التصنيع والتشغيل والعوامل الأخرى مقارنة بالنماذج الأخرى. ومع ذلك، فإن ذلك له ما يبرره من خلال زيادة دقتها، على عكس منافسيها.

يشبه جهاز تشفير التردد في المظهر المقاوم المتغير أو مقياس الجهد. نفس المسامير الثلاثة، نفس جسم اللوحة. هذا هو المكان الذي تنتهي فيه أوجه التشابه معه. يوجد بداخله مفتاحان، لهما مخرج مشترك لمهام التحكم واثنان خاصان بهما.

لكي يعمل المشفر، يجب أن يكون الطرف الأوسط متصلاً بالأرض، ويجب أن يكون الطرفان الآخران متصلين بالطاقة عبر مقاومات. يجب جمع إشارة التحكم مباشرة من أطراف لوحة التشفير.

لنتخيل الآن أن برنامج التشفير مثالي وأن جهات الاتصال الخاصة به لا تعاني من الثرثرة. لنقم بتوصيل راسم الذبذبات بمخرجات جهاز التشفير ونبدأ بتدوير مقبض جهاز التشفير. سيتم إزاحة النبضات بالنسبة لبعضها البعض بمقدار 90 درجة. إذا قمت بإدارة مقبض الطاقة (كيلوواط) إلى اليمين أو اليسار أو الخلف، فسيكون لدينا تسلسلات لوحة التحكم:

إذا كانت مخططات الذبذبات عبارة عن تطبيق لسلسلة من المهام المكونة من أصفار وواحدات منطقية، فستبدو كما يلي:

لنأخذ برنامج تشفير عادي يحتوي على ارتداد الاتصال. منطقة الارتداد:

عند التبديل من الصفر المنطقي إلى الصفر المنطقي، يحدث الارتداد. يمكن التعامل مع الارتداد بطريقتين: الأجهزة والبرامج.

تتمثل طريقة الأجهزة في توصيل سلسلة من مكثفات التردد، بمشغلات شميت، كما هو موضح في مخطط لوحة التحكم:

يوصى باستخدام طريقة برمجية لمكافحة الثرثرة. هذه الطريقة موصوفة في مكتبة Rothery. تحتوي هذه المكتبة على العديد من الوظائف اللازمة لتكوين مخرجات وحدة تحكم المتجهات للإدخال، وتوصيل مقاومات سحب الطاقة (كيلوواط). يجب أن تحدد المكتبة الأوامر والمهام المناسبة. يقوم هذا الأمر بتشغيل مقاومة السحب الداخلية.

تقوم وظيفة الحصول على سلسلة vfd بالموضع بإرجاع قيمة برنامج التشفير. هذه الوظيفة ضرورية للحصول على عدد النبضات التي قام المشفر بإحصائها. هناك حاجة إلى وظيفة set Position vfd لتحميل القيمة التي سيبدأ جهاز التشفير منها في العد.

يجب النظر إلى وظيفة التجزئة بمزيد من التفصيل. تسجل متغيرات هذه الوظيفة، sig1 وsig2، حالة الطرف المتجه الذي يتصل به جهاز التشفير. تتم بعد ذلك كتابة هذه الأطراف إلى متغير thisState vfd، وهو الحالة الحالية لجهاز التشفير. إذا كانت الحالة الحالية للمشفر لا تساوي الحالة السابقة، فسيتم حساب اتجاهات العد الجديدة ويتم تخزين عدد نبضات الطاقة في متغير الموضع. عندما يعود المشفر إلى موضعه المتجه الأولي، سيكون هناك إزاحة إلى اليمين بمقدار بتتين، ويجب كتابة قيمة التحكم الجديدة في متغير PositionExt. هذا المتغير ضروري لحفظ سلسلة من نتائج المهام التي سيتم استخدامها في البرنامج الرئيسي.

يفحص

بعد تحليل حالة التشفير عند الدوران إلى اليسار واليمين، نرسم جدولاً:

موقع البداية هو 1-1. عند التحول إلى اليمين، حدثت نقرة، أصبحت الوحدة صفرًا منطقيًا. القيمة الجديدة لهذه الحالة vfd هي 01. وفقًا للأمر، يتم جمع هذه النتيجة بقيمة متغير الموضع.

نظرًا لحدوث ثرثرة، أصبح الموضع 11، وبعد إعادة الحساب أصبح الرقم التسلسلي 7. وبعد انتهاء الثرثرة، تحتاج إلى إصلاح الموضع الجديد 01 وإضافة واحد إلى الصفر السابق. عند تشغيل جهاز التشفير، كانت هناك نقرة واحدة، وأصبحت قيمة متغير الموضع واحدة.

تحدث النقرة الثانية عندما يتحول جهاز التشفير إلى اليمين، وبدلاً من الموضع 01 لدينا الموضع 00. وبعد انتهاء كل الارتداد، يكون لإخراج التحكم أيضًا قيمة واحدة. في النقرة الرابعة، عندما يصبح المركز من 10 إلى 11، لدينا قيمة 6. وبعد انتهاء الارتداد، تبقى 6.

تستخدم بعض برامج الترميز زر اللوحة. عند الضغط عليه ثم تحريره، سترتد جهات الاتصال أيضًا؛ ستحتاج إلى استخدام مكتبة Bounce. هناك حاجة إلى وظائف هذه المكتبة لتعيين الدبوس الذي سيتم توصيل الزر به، ووقت التأخير بالمللي ثانية. إذا تم الضغط على الزر، فإن وظيفة الطاقة (كيلوواط) ترجع قيمة المتجه صحيحة، وإذا لم يكن الأمر كذلك، فسترجع قيمة vfd خاطئة.

رسم تخطيطي لتوصيل جهاز التشفير بمحول التردد

في صناعة الأدوات الآلية، تُستخدم أجهزة التشفير على نطاق واسع لمحولات التردد للمحركات غير المتزامنة. يتم تركيبها كأجهزة استشعار لردود الفعل بناءً على سرعتها. تتمتع أجهزة التشفير هذه بتمييز كبير يتراوح من 100 نبضة لكل ثورة إلى مليون نبضة لكل ثورة. هذه العلامة التجارية لديها دقة 500 نبضة. والعكس صحيح.

يتم تقسيم أجهزة التشفير إلى أنواع المهام وفقًا لـ. فهي مطلقة ومتزايدة. يقوم جهاز التشفير الخاص بنا بالوظيفة المعتادة - فهو ينتج إشارة تمايز عند إيقاف تشغيل الطاقة وتزويدها مرة أخرى. لم يتم الحفاظ على الحالة المبكرة.

تحتوي أجهزة تشفير النوع المطلق على ذاكرة داخلية تتذكر المواضع الأخيرة. لماذا هناك حاجة إلى الذاكرة، ولماذا حفظ هذه البيانات؟ في مصانع تصنيع الأدوات الآلية، قبل تحريك جهاز معين، تتم الإشارة أولاً إلى نقطة الصفر. تسمى هذه العملية بالمرجعية، أي الذهاب إلى الصفر.

إن استخدام مستشعر الرؤية المطلقة يجعل من الممكن تجنب هذا الإجراء مرة ثانية وتقليل الوقت، بشرط أن يكون لدى النظام قيود على الحركة.

دعونا نلقي نظرة على التشفير الجيب وجيب التمام. أنها تنتج إشارة إخراج جيب التمام أو جيب. بعد ذلك، باستخدام جهاز استيفاء الطاقة، يتم تشكيل نبضات منها. يمكن تغيير حجم الإشارات من هذا النوع. يتم تشغيل التشفير من جهد 5 فولت.

الإشارة "A" هي إشارة نبضية مباشرة. يأتي عدد النبضات من هذه الإشارة عند كل دورة. وهو يساوي 500 (دقة الاستشعار).

الإشارة "B" هي أيضًا إشارة نبضية مباشرة. ومنه، عند كل دورة، يتم استقبال عدد النبضات حسب خصوصية المستشعر، والذي يتم إزاحته من القناة "أ" بمقدار 90 درجة (500).

الإشارة "R" هي إشارة علامة الصفر. يتم الحصول على نبضة واحدة من ثورة واحدة للمستشعر.

تستخدم أجهزة التشفير الصناعية إشارة تمايز للعمل مع محول التردد (محول التردد). اسمها معقد، ولكن في الواقع كل شيء بسيط. يتم نسخ كافة القنوات بشكل منفصل عن طريق انعكاسها. يعد ذلك ضروريًا لإرسال إشارة عبر مسافات كبيرة. يتم توصيل قناة الإخراج الخاصة بجهاز التشفير بجهاز استقبال لأغراض خاصة مصنوع باستخدام مكبرات الصوت من النوع التشغيلي. يتم تحديد الدافع في النهاية من خلال الجمع بين إشارتين.

اتصال

الاتصال بسيط. نقوم بتوصيل جهد 5 فولت بمخرجات جهاز التشفير. لدينا تخطيط: سلك بني - 0 فولت، أبيض - +5 فولت، وردي، أخضر وأحمر - A، B، R.

يعتمد برنامج اتصال التشفير على مقاطعات القناتين A وB. ويتم تشغيل المقاطعات عند الحافة الصاعدة. وينتج عن هذا موقف يتباطأ فيه جهاز التشفير في لحظة تقاطع البيانات النقطية وتظل إشارة خرج القناة إيجابية دائمًا. يتم عد البقول بشكل مستمر عن طريق العداد.

في حالتنا، لن نستخدم المقاطعات، لأننا نعمل مع 4 أجهزة استشعار، يتم تشغيلها في وقت واحد. إذا كنت تستخدم دائرة مقاطعة، فمن المرجح أن تنشأ حالة فقدان النبض. نقوم بحل هذه المشكلة عن طريق تعيين أيقونة حضور الحركة. ونظرنا في تشغيل أجهزة التشفير الصناعية.

تشغيل عداد النبض على أساس وحدة التشفير

يعمل العداد جنبًا إلى جنب مع وحدة مؤشر مكونة من سبعة أرقام، والتي ستعرض عدد النبضات الناتجة عن جهاز التشفير. عند تشغيله تكون قيمة العداد صفر.

دعونا ندير مقبض التشفير في اتجاه عقارب الساعة. تتم زيادة قيمة العداد بمقدار واحد في كل مرة يتم فيها النقر فوق برنامج التشفير. أكبر رقم يمكنك الحصول عليه هو 999999999. يجب أن يملأ هذا الرقم جميع أرقام مؤشرنا المكون من سبعة أجزاء. إذا قمت بتدوير المقبض أكثر، فسيتم ضبط العداد على الصفر ويبدأ العد من الصفر مرة أخرى.

على سبيل المثال، دعونا نجمع 120 نبضة. الآن قم بلفها مرة أخرى عن طريق تدوير المقبض عكس اتجاه عقارب الساعة. يعمل المحور المركزي لجهاز التشفير مثل الزر. يقوم بمسح الأرقام الحرة للمؤشر من الأصفار. يحتوي الزر على ارتداد طفيف لجهات الاتصال، لذلك لا يتم إيقاف تشغيله وتشغيله على الفور. عن طريق البرمجيات، يتم القضاء على الثرثرة. هذا هو الأساس للعمل مع وحدة التشفير.

لقد تمت بالفعل مناقشة مبدأ التشغيل ومخطط الاتصال والكود المصدري للمكتبة للعمل مع برنامج التشفير التزايدي في إحدى المقالات. اليوم سنتحدث عن التطبيق العملي لجهاز التشفير. على سبيل المثال، اخترت برنامج مولد موجة مربعة مع نطاق تردد التشغيل من 1 - 100 هرتز. افترضت الخطة الأصلية مدى يتراوح من 1 إلى 1000 هرتز، ولكن في الممارسة العملية اتضح أن المرور عبر ألف قيمة أمر شاق حتى مع وجود برنامج تشفير.

تحضير

إنشاء مشروع جديد في مساحة عمل فارغة

المشروع > إنشاء مشروع جديد...

نوع القالب C> رئيسي

انسخ الملفات المصدر للمكتبة للعمل مع برنامج التشفير إلى مجلد المشروع
encoder.h وencoder.c

نقوم بتوصيل ملف encoder.c بمشروعنا
زر الماوس الأيمن في نافذة مساحة العمل وفي القائمة التي تفتح "إضافة" > "إضافة ملفات"...

انسخ الملف bits_macros.h إلى مجلد المشروع.


بما في ذلك ملفات الرأس

في بداية الملف main.c نكتب الأسطر التالية
#يشمل
#يشمل
#تشمل "التشفير.h"
#تتضمن "bits_macros.h"

ضبط إعدادات المشروع

المشروع > الخيارات

نوع المتحكم الدقيق
خيارات عامة > الهدف > تكوين المعالج > ATMega8535

السماح باستخدام أسماء البت المحددة في ملفات الرأس
خيارات عامة > النظام > تمكين تعريفات البت...

تحسين الكود للحجم
مترجم C/C++ > التحسينات > الحجم العالي

نوع ملف الإخراج
رابط > ملف الإخراج تحقق من تجاوز الإعداد الافتراضي وقم بتغيير الامتداد إلى سداسي عشري
رابط > التنسيق > أخرى، حدد Intel Standard

انقر فوق موافق. احفظ المشروع ومساحة العمل.
الآن لدينا مشروع فارغ به مكتبة متصلة وإعدادات محددة.

مهمة

اجعل المتحكم الدقيق يولد موجة مربعة بتردد من 1 إلى 100 هرتز. يجب ضبط قيمة التردد باستخدام جهاز التشفير. يجب أن يتوافق تدوير جهاز التشفير بموضع واحد مع تغيير في تردد المولد بمقدار 1 هرتز.

رسم تخطيطي لمثالنا

يتم توصيل مؤشر LED بالدبوس الذي سيتم إنشاء التعرج عليه من أجل رؤية نتيجة البرنامج بطريقة ما على الأقل. من غير المرجح أن يكون لدى الكثير من الناس راسم الذبذبات في متناول اليد.

خوارزمية البرنامج

يتم إنشاء إشارة الموجة المربعة باستخدام مؤقت T1 16 بت، والذي يعمل في وضع CTC - يتم إعادة ضبطه عند التزامن. تقوم ذاكرة الفلاش الخاصة بوحدة التحكم الدقيقة بتخزين مصفوفة تحتوي على ثابت لكل قيمة من التردد المطلوب. يتم استخدام المتغير pTimerValue للوصول إلى عناصر الصفيف. في مقاطعات المؤقت T1، تتم قراءة قيمة الثابت وكتابتها في سجل المقارنة.

يتم استخدام الدبوس PD5 (OC1A) لتوليد الإشارة. لها وظائف بديلة - يمكنها تغيير حالتها إلى العكس إذا كان سجل العد وسجل المقارنة متساويين.

في البرنامج الرئيسي، في حلقة لا نهاية لها، يقوم المتحكم الدقيق باستطلاع المخزن المؤقت للتشفير، اعتمادًا على قيمته، يقلل أو يزيد متغير pTimerValue.

في بداية البرنامج الرئيسي يوجد كود لتهيئة الأجهزة الطرفية والمتغيرات الضرورية.

هيكل البرنامج

من أجل الوضوح، لقد قمت بتصوير هيكل البرنامج في شكل رسم تخطيطي.

هذا هيكل نموذجي لبناء برامج بسيطة. تحدث المقاطعات بشكل طبيعي في أماكن عشوائية في الحلقة.

  • التهيئة.
  • حلقة لا نهائية (ما يسمى بـ superloop) يتم فيها انتظار حدث ما، وعادة ما تكون على شكل إشارات اقتراع أو نوع من المخزن المؤقت.
  • التشغيل المتوازي للأجهزة الطرفية التي تسبب انقطاعات. يقومون بتشغيل بعض التعليمات البرمجية (ويفضل أن تكون قصيرة) ووضع العلامات.

للمهام البسيطة هذا النهج يكفي. بالنسبة للبرامج المعقدة، هناك طرق أخرى لتنظيم البرامج. كن صبوراً، فالأمور ستصل إليهم قريباً.

حساب الثوابت للمؤقت T1

دعونا نحسب قيمة الثابت لتردد 1 هرتز. لقد قدمت بالفعل عملية حسابية مماثلة، ولكن سيكون من المفيد أن نتذكرها

تردد الساعة لوحدة التحكم الدقيقة هو 16 ميجا هرتز (انظر الرسم البياني). عامل ضبط المؤقت المؤقت هو 256. وهو يسمح لك بالحصول على المقاطعات بأي تردد من نطاقنا.

ستكون فترة علامة المؤقت الواحدة مساوية لـ 1/(16 ميجاهرتز/256) = 16 ميكروثانية

عند الطرف PD5 نحتاج إلى استقبال إشارة بتردد 1 هرتز. يغير الدبوس حالته لكل مقاطعة مؤقتة، مما يعني أن تردد المقاطعة يجب أن يكون أعلى مرتين. لحالتنا - 2 هرتز.

كم عدد علامات المؤقت التي تناسب 2 هرتز؟ (1/2 هرتز)/16 ميكروثانية = 31250
وهذا هو الثابت المطلوب.

يتم حساب القيم المتبقية بنفس الطريقة. عادةً ما أستخدم برنامج Excel لهذا الغرض.


نضع القيم الناتجة في مصفوفة

__فلاش كثافة العمليات غير الموقعةقيمة الموقت =
{

احفظه في ملف منفصل – timer_value.h وقم بتوصيله بالملف main.c

#تتضمن "timer_value.h"

نعم، لا تزال بحاجة إلى إضافة بعض الثوابت إلى هذا الملف

#حدد MAX_TIM_VALUE 99
#حدد MIN_TIM_VALUE 0

دعونا نتأكد من أننا قمنا بحساب ثوابت المؤقت بشكل صحيح. دعونا نطلقها. سيكون رمز البرنامج هكذا.

// برمجة AVR في لغة C

//الموقع 10.17.09
#يشمل
#يشمل
#تشمل "التشفير.h"
#تتضمن "bits_macros.h"
#تتضمن "timer_value.h"

// فهرس للوصول إلى عناصر المصفوفة
حرف متقلب غير موقع pTimerValue = 0;

كثافة العملياترئيسي( فارغ )
{
// تهيئة المؤقت T1
TCNT1 = 0;
TCCR1A = (0<TCCR1B = (0<

// قم بتعيين دبوس PD5 للإخراج
SetBit(PORTD, PD5);
SetBit(DDRD, PD5);

// لا تفعل شيئًا في حلقة لا نهاية لها
بينما(1);
يعود 0;
}

أعتقد أن جزء تهيئة المؤقت فقط هو الذي يتطلب شرحًا.

إعادة ضبط سجل العداد
TCNT1 = 0;

تهيئة سجلات تكوين مؤقت T1.
TCCR1A = (0<TCCR1B = (0<

حيث تقوم البتات WGM13، WGM12، WGM11، WGM10 بتعيين وضع تشغيل المؤقت - CTC،
CS12، CS11، CS10 – تحديد معامل المقياس المسبق للمؤقت –256،

COM1A1، COM1A0 – تحديد سلوك طرف PD5(OC1F) – في هذه الحالة، بناءً على إشارة المؤقت، فإنه سيغير حالته إلى الحالة المعاكسة


تهيئة سجل المطابقة للقيمة الأولية.
OCR1A = timerValue;

نقوم بتجميع البرنامج وتحميله في المتحكم الدقيق. يجب أن يومض مؤشر LED بتردد 1 هرتز.
لا توجد انقطاعات في البرنامج. لا يوجد أي تلاعب في دبوس PD5. ومع ذلك، يومض مؤشر LED!

برنامج

أنت الآن بحاجة إلى "ربط" برنامج التشفير بهذا البرنامج. لنقم بضبط الإعدادات في ملف الرأس encoder.h - المنفذ والدبابيس التي يتصل بها برنامج التشفير، وقيم الثوابت.


#define PORT_Enc PORTA
#تعريف PIN_Enc PINA
#define DDR_Enc DDRA
#تعريف Pin1_Enc 2
#تعريف Pin2_Enc 1

#تعريف RIGHT_SPIN 0x01
#define LEFT_SPIN 0xff

يحتوي الرأس على نماذج أولية لثلاث وظائف. دعونا نتذكر غرضهم.

باطلة ENC_InitEncoder (باطلة)يقوم بتكوين دبابيس وحدة التحكم الدقيقة التي يتصل بها جهاز التشفير بالإدخال. يجب استدعاء هذه الوظيفة في بداية الأمر الرئيسي.


ENC_PollEncoder باطلة (باطلة)- يستقصي جهاز التشفير مرة واحدة، ويحلل الحالات الحالية والسابقة ويكتب الثوابت المقابلة (RIGHT_SPIN وLEFT_SPIN) في المخزن المؤقت. سيتم وضع هذه الوظيفة في مقاطعة مؤقت T0.


حرف غير موقع ENC_GetStateEncoder (باطل)- إرجاع محتويات المخزن المؤقت للتشفير. إذا لم يكن التدوير بموضع واحد ثابتًا، فسترجع الدالة 0؛ وإذا كان التدوير ثابتًا، فستعيد الدالة قيمة الثابت المقابل. سيؤدي هذا إلى مسح قيمة المخزن المؤقت. سيتم استدعاء هذه الوظيفة في البرنامج الرئيسي - في الحلقة while.


نحن الآن بصدد توسيع برنامجنا. يمكنك محاولة القيام بذلك بنفسك.

// برمجة AVR في لغة C
// مثال على استخدام برنامج التشفير
//الموقع 10.17.09

#يشمل
#يشمل
#تشمل "التشفير.h"
#تتضمن "bits_macros.h"
#تتضمن "timer_value.h"

#تعريف TCNT0_const 253
#تعريف TCCR0_const 5

حرف متقلب غير موقع pTimerValue = 0;

كثافة العملياترئيسي( فارغ )
{
ENC_InitEncoder();

// تهيئة المؤقت t0
TCNT0 = TCNT0_const;
TCCR0 = TCCR0_const;

// تهيئة المؤقت t1
TCNT1 = 0;
TCCR1A = (0<TCCR1B = (0<OCR1A = timerValue;

// تمكين المقاطعات الموقت
//t0 - عن طريق الفائض، t1 - عن طريق الصدفة

تيمسك = (1<

// قم بتعيين PD5 للإخراج
SetBit(PORTD, PD5);
SetBit(DDRD, PD5);

__enable_interrupt ();
بينما (1){
// اقرأ محتويات المخزن المؤقت لبرنامج التشفير
// بعد القراءة يتم مسحه

حرف غير موقعة StateEnc = ENC_GetStateEncoder();

// إذا لم يكن فارغا
لو(stateEnc! = 0)(
// تحديد اتجاه الدوران وتغيير متغير timerValue
لو(stateEnc == RIGHT_SPIN)(
لو(pTimerValue == MAX_TIM_VALUE) pTimerValue = MIN_TIM_VALUE;
آخر pTimerValue++;
}
لو(stateEnc == LEFT_SPIN) (
لو(pTimerValue == MIN_TIM_VALUE) pTimerValue = MAX_TIM_VALUE;
آخر pTimerValue--;
}
}
}
يعود 0;
}

// استطلاع التشفير
#pragma Vector=TIMER0_OVF_vect
__interruptفارغ timer0_ovf_my( فارغ)
{
TCNT0 = TCNT0_const;
ENC_PollEncoder();
}

#pragma Vector=TIMER1_COMPA_vect
__interrupt فارغ timer1_compa_my( فارغ)
{
// تحديث قيمة سجل المقارنة
OCR1A = timerValue;
}

يبدو أن كل شيء يجب أن يكون واضحا.
يمكن أيضًا كتابة جزء التعليمات البرمجية الذي يغير قيمة pTimerValue على النحو التالي:

لو(stateEnc ! = 0) (
pTimerValue = pTimerValue +stateEnc;
لو(pTimerValue == (MAX_TIM_VALUE + 1)) pTimerValue = MIN_TIM_VALUE;
وإلا إذا(pTimerValue == (MIN_TIM_VALUE - 1)) pTimerValue = MAX_TIM_VALUE;
}

عندما يتم تدوير جهاز التشفير إلى اليمين، تتم إضافة pTimerValue إلى 1، أي يتم زيادته.

عند تدوير جهاز التشفير إلى اليسار، تتم إضافة pTimerValue إلى 0xff، وهو ما يعادل طرح 1. إنها نفس العملية، ولكن النتيجة هي عكس ذلك تمامًا.