الوكالة الدولية للطاقة على ATtiny13


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

علاوة على ذلك ، تتوفر WDT المضمنة في معظم المتحكمات الدقيقة الحديثة.

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

نشأت المشكلة الثانية مع وحدة تحكم Elecrow ATMEGA 32u4 A9G GSM . هنا ، نادرًا ما يحدث تجميد لبطاقة SIM. (بالمناسبة ، تحدث نفس المشكلة مع أجهزة المودم 3G و 4G USB). لمكافحة هذا التجميد ، تحتاج إلى تشويه الطاقة على بطاقة SIM. ويبدو أنه حتى مودم GSM لديه نتيجة لذلك ، ولكن هذه الميزة غير مضمنة في دارات الجهاز. ولتحقيق أقصى قدر من الموثوقية ، اضطررت مرة أخرى إلى اللجوء إلى كلب حراسة خارجي.

أنا لم أكرر الدائرة على توقيت 555. كشفت الكثير من العيوب:

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

متطلبات جديدة WDT


  • انخفاض تكلفة الجهاز ، وسهولة التصنيع والأبعاد الصغيرة
  • التحكم في التغيير الدوري لمستوى المنطق 0/1 عند الإدخال
  • ضبط بسيط لوقت الاستجابة (كخيار ، واختيار فترات محددة مسبقا)

تطوير الحديد


تم اختيار متحكم ATtiny13 ليكون الدائرة الرئيسية. كانت قدراته أكثر من كافية لمهمتي. والسعر ، مع الأخذ في الاعتبار الحد من العناصر الربط ، هو تقريبا نفس السعر من 555 الدائرة الصغيرة.



تم توزيع خمسة استنتاجات MK (RESET قررت عدم لمس) على النحو التالي:

  1. إخراج الموقت
  2. إعادة تعيين الإدخال
  3. الاستنتاجات الثلاثة المتبقية هي أوقات الاستجابة.

لتبديل الطاقة ، يتم استخدام قناة موسفيت P-channel. أي حالة متوافقة مناسبة ، ولكن من المستحسن أن تأخذه مع ما يسمى "مستوى التحكم المنطقي" - أي ، يفتح بالكامل من الجهد المنخفض 3-5V: IRLML2502 ، AO3415 ، إلخ. على الرغم من صغر حجمها ، فإن هذا الترانزستور قادر على التحكم في حمولة 4A. إذا كنت بحاجة إلى تبديل شيء آخر ، يمكنك توصيل مرحل 5V مباشرة بهذا الإخراج.

يضيء مؤشر LED عندما يتم تنشيط المؤقت ويتم إيقاف تشغيل الوحدة الرئيسية.

يحتوي الموصل الرئيسي للاتصال بلوحة متحكم على أربعة مخرجات

  1. الحافلة المشتركة
  2. المدخلات - إعادة تعيين الموقت
  3. + 5V الإخراج (التي تسيطر عليها الموقت)
  4. المدخلات + 5V

لا يمكن تثبيت اثنين من الموصلات - مبرمج ICSP وصداري الطاقة على السبورة. وميض وحدة التحكم الدقيقة في المبرمج مسبقًا ، واضبط وقت الاستجابة باستخدام وصلة مرور ثابتة.

قائمة الأجزاء



عمل


تحولت الألواح لتكون صغيرة - 18 × 22 مم. قمت بنشر خيارين:

للتصنيع أحادي الجانب بواسطة LUT:





وللطلب في المصنع مع تحسين تصميم والتحولات بين الطرفين. (سأطلب من الصينيين ، في بعض الأحيان)





التكنولوجيا المنزلية تعطي شيئا مثل هذا النموذج الأولي.







إدراج


بالنسبة للبرامج الثابتة ، استخدمت مبرمجًا محليًا قائمًا على Arduino Nano



أنا مبرمجة في Arduino IDE مع تثبيت الدعم ل Attiny13 - MicroCore . واجه أحدث إصدار من IDE مشاكل مع مبرمج ArduinoISP ، لكنه كان يعمل بشكل جيد في إصدار Arduino IDE 1.6.13. لم يكن لدى فريق arduino.cc الودي رغبة في اكتشاف ما عابث هناك)))



Tinku ضبطها للعمل من مرنان داخلي مع تردد 1.2 ميغاهيرتز. البرنامج بسيط - نقوم بتهيئة المدخلات / المخرجات ، وقراءة PB2 -PB4 وتحديد وقت الاستجابة ، وضبط الموقت والانتقال إلى وضع IDLE. وفقا لالموقت المقاطعة ، نحدد حالة إدخال السيطرة. إذا تغيرت الحالة إلى العكس ، فأعد ضبط العداد. إذا تجاوزت قراءة العداد وقت الاستجابة المحدد ، فإننا نشوه طاقة الخرج.

#define F_CPU 1200000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> boolean pb1_state; volatile uint16_t pb1_count; //     TIMER0 ISR(TIM0_OVF_vect){ pb1_count++; } int main(){ //   PB0 DDRB |= (1 << PB0); // pinMode(PB0, OUTPUT); PORTB &= ~(1 << PB0); // digitalWrite(PB0, LOW);} //   PB1   DDRB &= ~(1 << PB1); // pinMode(PB1, INPUT_PULLUP); PORTB |= (1 << PB1); //   PB2   DDRB &= ~(1 << PB2); // pinMode(PB2, INPUT_PULLUP); PORTB |= (1 << PB2); //   PB3   DDRB &= ~(1 << PB3); // pinMode(PB3, INPUT_PULLUP); PORTB |= (1 << PB3); //   PB4   DDRB &= ~(1 << PB4); // pinMode(PB4, INPUT_PULLUP); PORTB |= (1 << PB4); //       PB2,PB3,PB4 (   ) (,  = TM/4 ) uint16_t TM = 0; bool pb2 = false; bool pb3 = false; bool pb4 = false; if( PINB & (1 << PINB2) )pb2 = true; if( PINB & (1 << PINB3) )pb3 = true; if( PINB & (1 << PINB4) )pb4 = true; if( pb2 == true && pb3 == true && pb4 == true )TM = 4; // 1  else if( pb2 == false && pb3 == true && pb4 == true )TM = 8; // 2  else if( pb2 == true && pb3 == false && pb4 == true )TM = 20; // 5  else if( pb2 == false && pb3 == false && pb4 == true )TM = 40; // 10  else if( pb2 == true && pb3 == true && pb4 == false )TM = 80; // 20  else if( pb2 == false && pb3 == true && pb4 == false )TM = 120; // 30  else if( pb2 == true && pb3 == false && pb4 == false )TM = 240; // 60  else if( pb2 == false && pb3 == false && pb4 == false )TM = 480; // 120  pb1_count = 0; pb1_state = false; //  ADC PRR = (1<<PRADC); // shut down ADC //   TIMSK0 = (1<<TOIE0); //   TIMER0 TCCR0B = (1<<CS02) | (1<<CS00); //    1/1024 //    MCUCR &= ~(1<<SM1); // idle mode MCUCR &= ~(1<<SM0); // idle mode MCUCR |= (1<<SE); sei(); while(1) { //      asm("sleep"); //   TIMSK0 &= ~ (1<<TOIE0); //  TIMER0 //   PB1 bool pb1 = false; if( PINB & (1 << PINB1) )pb1 = true; //    ,   if( pb1 != pb1_state )pb1_count = 0; pb1_state = pb1; //      if( pb1_count >= TM ){ PORTB |= (1 << PB0); // digitalWrite(PB0, HIGH);} _delay_ms(1000); //   PORTB &= ~(1 << PB0); // digitalWrite(PB0, LOW);} pb1_count = 0; //   } TIMSK0 = (1<<TOIE0); //   TIMER0 sei(); } return 0; } 

جميع الرموز تناسب 340 بايت - بالضبط ثلث كيلوبايت من الذاكرة الرنانة. يتم فحص تشغيل المؤقت ببساطة - اعتمادًا على وقت التثبيت - يضيء مصباح LED بشكل دوري لمدة ثانية واحدة. في هذا الوقت ، يختفي إخراج Vout voltage 5V. إذا تم إغلاق جهة اتصال "الإدخال" على الأرض بتردد مدته 1 ثانية ، فلن تتم إعادة الضبط ولا يضيء المصباح.

إدارة WDT في البرنامج الرئيسي على النحو التالي

 #define PIN_WDT 5 //GPIO ,   WDT bool WDT_flag = false; //    void WDT_begin(){ pinMode(PIN_WDT,OUTPUT); digitalWrite(PIN_WDT,WDT_FLAG); } //   (   1    WDT,  ) void WDT_reset(){ if( WDT_flag)WDT_flag = false; else WDT_flag = true; digitalWrite(PIN_WDT,WDT_FLAG); } 

هذا كل شيء. يمكن تنزيل جميع الملفات المصدر والدوائر ولوحات الدوائر
جيثب

Source: https://habr.com/ru/post/ar447004/


All Articles