مرحبا يا هبر!
هناك الكثير من المقالات على الشبكة حول تشغيل وحدات التحكم الدقيقة STM32 في الأجهزة الموفرة للطاقة - عادةً الأجهزة التي تعمل بالبطارية - ومع ذلك ، من المؤسف أنهم لا يفهمون هذا الموضوع خارج قائمة أوضاع توفير الطاقة وأوامر SPL / HAL التي تتضمنها (ومع ذلك ، تنطبق نفس المطالبة إلى الغالبية العظمى من المقالات حول العمل مع STM32).
وفي الوقت نفسه ، بسبب التطور السريع للمنازل الذكية وجميع أنواع إنترنت الأشياء ، أصبح الموضوع أكثر أهمية - في مثل هذه الأنظمة ، يتم تشغيل العديد من المكونات بالبطارية ، ومن المتوقع منها سنوات من التشغيل المستمر.
سنملأ هذه الفجوة بمثال STM32L1 - وحدة تحكم شائعة جدًا واقتصادية للغاية وفي نفس الوقت لديها بعض المشاكل الخاصة بهذه السلسلة. سيتم تطبيق كل ما سبق تقريبًا على STM32L0 و STM32L4 ، ومن حيث المشاكل والأساليب الشائعة ، إلى وحدات التحكم الأخرى المستندة إلى نوى Cortex-M.

يجب أن تبدو النتيجة العملية شبيهة بالصورة أعلاه (ونعم ، سنتحدث أيضًا عن قابلية تطبيق أجهزة القياس المتعددة وأدوات القياس الأخرى على المهام المماثلة).
أوضاع توفير الطاقة في STM32L1
أساسيات توفير البطارية هي أوضاع توفير الطاقة الرئيسية للمعالج. لكل مصنع وكل سلسلة من وحدات التحكم الخاصة به (مجموعة محددة هي امتداد البائع لأوضاع Cortex-M الأساسية القياسية مع الفروق الدقيقة المختلفة فيما يتعلق بالأطراف ، وفولتات الإمداد ، وما إلى ذلك).
على وجه التحديد ، تلقى STM32L1 ، الذي ينتمي إلى السلسلة الاقتصادية من وحدات التحكم ، وفيما يتعلق بهذا ، من بين أمور أخرى ، مجموعة موسعة من إعدادات الطاقة ، لدينا ما يلي:
- تشغيل - الوضع العادي. شامل ، جميع الأجهزة الطرفية المتاحة ، تردد يصل إلى 32 ميجا هرتز.
- تشغيل منخفض الطاقة (تشغيل LP) - وضع خاص مع تردد تشغيل ضمن 131 كيلوهرتز وأقصى استهلاك ، مع مراعاة المحيط بالكامل ، 200 μA. في وضع LP Run ، ينتقل منظم طاقة المعالج إلى وضع اقتصادي خاص ، والذي يوفر ما يصل إلى خمسين مصباحًا صغيرًا مقارنة بالعمل في نفس التردد في وضع التشغيل.
- النوم - تعليق النواة ، ولكن مع الحفاظ على جميع ترددات الساعة. يمكن أن تستمر الأجهزة الطرفية للمعالج في العمل إذا لم تكن النواة بحاجة إليها ، ولكن يمكن إيقاف تشغيلها تلقائيًا.
- النوم المنخفض الطاقة (LP Sleep) - مزيج من النوم مع انتقال المثبت إلى الوضع الاقتصادي. تردد الساعة ليس أعلى من 131 كيلو هرتز ، إجمالي الاستهلاك لا يزيد عن 200 μA.
- إيقاف - توقف كامل لجميع ترددات الساعة ، باستثناء مولد "الساعة" 32768 هرتز ، خارجي أو داخلي. في حالة STM32L1 ، تستمر فقط الساعة في الوقت الحقيقي في العمل في هذا الوضع ، كل شيء آخر يتوقف تمامًا ؛ في المعالجات الأحدث ، يمكن تسجيل بعض الأجهزة الطرفية بترددات منخفضة. تقريبا جميع أرجل المعالج تحتفظ بحالتها. يتم حفظ محتويات ذاكرة الوصول العشوائي ، وتستمر المقاطعات الخارجية في العمل.
- وضع الاستعداد - إغلاق كامل لمعالج المعالج وذاكرة الوصول العشوائي وجميع الأجهزة الطرفية ، باستثناء الساعات في الوقت الفعلي. لا يتم حفظ ذاكرة الوصول العشوائي (على سبيل المثال ، من وجهة نظر البرنامج ، فإن المغادرة في وضع الاستعداد هي تقريبًا نفس تشويه الطاقة - تبدأ من جديد) ، يستمر RTC في التأشير. المقاطعات الخارجية لا تعمل ، باستثناء ثلاثة أرجل WKUPx خاصة ، ويوقظ تبديلها من 0 إلى 1 المعالج.
يعد إدخال كل وضع من الأوضاع أمرًا بسيطًا للغاية - تحتاج إلى تعيين العلامات في ثلاثة إلى خمسة تسجيلات ، وبعد ذلك (بالنسبة لأوضاع السكون) ، قم باستدعاء تعليمات WFI أو WFE ، وهذا هو تعليمات Cortex-M القياسية ، ويعني "انتظر المقاطعة" و "انتظر الحدث" . اعتمادًا على العلامات (يتم وصفها في الدليل المرجعي للمعالج ، بالنسبة لـ STM32L1 هو
RM0038 ) ،
سيقع المعالج نفسه في هذا الوضع في هذا الأمر.
بالإضافة إلى ذلك ، سيكون من الجيد حظر المقاطعات (لن يؤثر ذلك على قدرة الأحداث الخارجية والداخلية على إيقاظ المعالج من وضع السكون) وانتظر حتى يتم حفظ البيانات من السجلات إلى الذاكرة إذا حدث ذلك فجأة ، باستخدام الأمر DSB.
على سبيل المثال ، هذه هي الطريقة التي يبدو بها الدخول في وضع التوقف:
PWR->CR &= ~(PWR_CR_PDDS); PWR->CR |= PWR_CR_CWUF; PWR->CR |= PWR_CR_LPSDSR; PWR->CR |= PWR_CR_ULP; SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk); unsigned state = irq_disable(); __DSB(); __WFI(); init_clk(); irq_restore(state);
WFI عبارة عن تعليمات للحظر ، حيث سيدخل المعالج في حالة نوم عميق ولن يخرجها حتى يحدث نوع من الانقطاع. نعم ، أكرر ، على الرغم من أننا أوقفنا المقاطعات بشكل صريح ، فسوف يستجيب لها المعالج ويستيقظ - ولكنه لن يبدأ في المعالجة إلا بعد إعادة تشغيلها. وهذا له معنى عميق.
في الكود أعلاه ، بعد WFI ، هناك نوع من إعادة تهيئة ترددات التشغيل لا تذهب هكذا - والحقيقة هي أن L1 يترك
دائمًا النوم العميق عند تردد 4.2 ميجاهرتز ومع مولد MSI الداخلي كمصدر لهذا التردد. في العديد من الحالات ، من الواضح أنك لا تريد معالج المقاطعة الذي يوقظ المعالج لبدء التشغيل عند هذا التردد - على سبيل المثال ، لأن ترددات جميع أجهزة ضبط الوقت ، UART ، وغيرها من الحافلات ستنطلق. لذلك ، نقوم أولاً باستعادة ترددات التشغيل (أو ، إذا أردنا البقاء على MSI ، إعادة حساب الحافلات الضرورية أقل من 4.2 ميجاهرتز) ، وبعد ذلك نتعمق في المقاطعات.
من الناحية العملية ، فإن الوضعين الأكثر استخدامًا هما Run و Stop. والحقيقة هي أن LP Run بطيء بشكل مؤلم ولا معنى له إذا كان المعالج يحتاج إلى إجراء بعض العمليات الحسابية وليس مجرد انتظار الأحداث الخارجية ، وأن Sleep و LP Sleep ليست اقتصادية للغاية (استهلاك يصل إلى 2 مللي أمبير) وهناك حاجة إذا كنت بحاجة توفير القليل على الأقل ، ولكن في نفس الوقت اترك الأجهزة الطرفية العاملة و / أو توفر أسرع رد فعل ممكن للمعالج للأحداث. مثل هذه المتطلبات موجودة ، ولكن بشكل عام ليس في كثير من الأحيان.
عادةً لا يتم استخدام وضع الاستعداد ، لأنه بعد استحالة المتابعة من حيث توقفت بسبب عدم وجود ذاكرة الوصول العشوائي ، هناك أيضًا بعض المشاكل مع الأجهزة الخارجية ، والتي سنناقشها أدناه ، والتي تتطلب حلولاً للأجهزة. ومع ذلك ، إذا تم تصميم الجهاز مع وضع ذلك في الاعتبار ، فيمكن استخدام وضع الاستعداد كوضع "إيقاف" ، على سبيل المثال ، أثناء التخزين طويل الأمد لهذا الجهاز.
في الواقع ، عند تقديم هذا ، غالبًا ما تنقطع معظم الأدلة بشكل منتصر.
المشكلة هي أنه بعد اتباعها ، ستحصل على حزن 100-200 μA من الاستهلاك الحقيقي بدلاً من 1.4 μA الموعودة مع ساعات العمل - حتى في تصحيح Nucleo المرجعي ، الذي لا يحتوي على أي رقائق خارجية وأجهزة استشعار ، إلخ. التي يمكن أن تعزى إليها.
لا ، معالجك يعمل ، لا يوجد شيء في أخطاء ، وفعلت كل شيء بشكل صحيح.
ليس فقط حتى النهاية.
متلازمة تململ الساقين
المشكلة الأولى STM32L1 ، التي تشير إليها
بعض المقالات ، ولكنها غالبًا ما تذكر فقط في المنتديات ، عندما في اليوم الثالث من المناقشة ، من أين أتت 100-200 μA ، يتذكر شخص ما وجود
AN3430 ويصل إلى الصفحة 19 فيه - هذا حالة الساقين بشكل افتراضي.
ألاحظ أنه حتى STMicro نفسها تشير إلى المشكلة من خلال الأكمام ، وفي معظم المستندات التي يُنظر فيها إلى تحسين استهلاك الطاقة ، فإنها تقتصر على عبارة واحدة أو عبارتين مع نصيحة سحب الأرجل غير المستخدمة إلى الأرض أو وضعها في وضع الإدخال التناظري ، دون توضيح الأسباب.
الشيء المحزن هو أنه بشكل افتراضي ، يتم تكوين جميع الأرجل كمدخلات رقمية (0x00 في سجل GPIOx_MODER). يوجد مشغل Schmitt دائمًا على المدخلات الرقمية ، مما يحسن من مناعة الضوضاء لهذا الإدخال ، وهو مستقل تمامًا - إنه عنصر منطقي بسيط ، عازل مع التباطؤ لا يتطلب تسجيل الوقت الخارجي.
في حالتنا ، هذا يعني أننا أغلقنا الساعة في وضع الإيقاف ، واستمر مشغلات شميت في العمل كما لو لم يحدث شيء - اعتمادًا على مستوى إشارة الإدخال ، فإنهم يحولون مخرجاتهم إلى 0 و 1.
في الوقت نفسه ، يعلق جزء من أرجل المعالج في دائرة نموذجية في الهواء - أي أنه لا توجد إشارة واضحة عليها. سيكون من الخطأ التفكير في أن عدم وجود إشارة واضحة يعني أنه في هذه الأرجل 0 ليس على هذه الأرجل بسبب مقاومة إدخالها العالية ، هناك بعض الضوضاء العشوائية بقيمة غير محددة ، من التقاطات وتدفق التيار من المسارات المجاورة إلى القناة الأولى للتلفزيون ، إذا كانت القدم طويلة بما يكفي للعمل كهوائي (ومع ذلك ، سيتم إيقاف تشغيل أجهزة التلفزيون التناظرية في روسيا قريبًا ، الأمر الذي من شأنه أن يؤدي إلى بعض الانخفاض في استهلاك الطاقة للمتحكمات الدقيقة التي تم تكوينها بشكل غير صحيح).
وفقًا لهذه التقلبات ، تتحول الساق بطريقة عشوائية بين 0 و 1. يستهلك منطق CMOS التيار عند التبديل. أي أن
ساق المعالج المعلق في الهواء ، المكون في وضع الإدخال الرقمي ، يستهلك تيارًا ملحوظًا في حد ذاته .
الطريق للخروج من هذا بسيط - عند بدء البرنامج ، تحتاج إلى تكوين جميع الأرجل لحالة الإدخال التناظري ؛ STM32 لديها رسميًا لجميع الأرجل بدون استثناء ، بغض النظر عما إذا كانت متصلة بـ ADC أم لا ، وتختلف عن الإدخال الرقمي فقط في حالة عدم وجود مشغل Schmitt عند الإدخال.

للقيام بذلك ، يكفي كتابة القيمة 0xFF ... FF لجميع تسجيلات GPIOx_MODER ، من الأسهل القيام بذلك ، كما ذكر أعلاه ، مباشرة في البداية ، ثم أثناء اللعب ، قم بإعادة تكوين الأرجل الفردية حسب الحاجة في هذا الجهاز.
هنا ، ومع ذلك ، تنشأ مشكلة من الدرجة الثانية - من الجيد إذا كانت البرامج الثابتة تعمل على وحدة تحكم واحدة محددة ، وبالتالي فأنت تعرف دائمًا ما هو
x في GPIOx. الأسوأ من ذلك إذا كانت البرامج الثابتة عالمية - يمكن أن يحتوي STM32 على
ما يصل إلى 8 منافذ ، ولكن يمكن أن يكون أصغر ؛ عند محاولة الكتابة إلى منفذ غير موجود في هذا النموذج من وحدة التحكم ، ستحصل على خطأ فادح ، أي تحطم نواة.
ومع ذلك ، يمكن التحايل على هذه الحالة - تسمح لك Cortex-M بالتحقق من صحة صلاحيتها ، علاوة على ذلك ، في حالة M3 و M4 ، يكون الشيك تافهًا بشكل عام ، وعلى M0 يتطلب بعض السحر ، ولكن يمكن تحقيقه (
يمكن قراءة التفاصيل هنا ، لن نحب هذه المقالة )
هذا ، بشكل عام ، بدأ المعالج ، وضبط الترددات - وخضع على الفور لجميع منافذ GPIO المتاحة ، وكتابتها إلى MODER (الرمز أدناه مكتوب لنظام RIOT OS ، ولكن بشكل عام فهو واضح بدون تعليق ويمكن نقله إلى ثلاث دقائق أي منصة أخرى).
#if defined(CPU_FAM_STM32L1) GPIO_TypeDef *port; uint32_t ahb_gpio_clocks = RCC->AHBENR & 0xFF; periph_clk_en(AHB, 0xFF); for (uint8_t i = 0; i < 8; i++) { port = (GPIO_TypeDef *)(GPIOA_BASE + i*(GPIOB_BASE - GPIOA_BASE)); if (cpu_check_address((char *)port)) { port->MODER = 0xffffffff; } else { break; } } /* restore GPIO clock */ uint32_t tmpreg = RCC->AHBENR; tmpreg &= ~((uint32_t)0xFF); tmpreg |= ahb_gpio_clocks; periph_clk_en(AHB, tmpreg); #endif
ألاحظ أن هذا ينطبق فقط على سلسلة L1 ، في L0 و L4 تم أخذ التجربة في الاعتبار ، وهم افتراضيًا يقومون بتكوين جميع المنافذ كمدخلات تناظرية عند بدء التشغيل.
بعد القيام بكل هذه الإجراءات بعناية ، يمكنك تحميل البرنامج الثابت إلى الجهاز النهائي ... والحصول على 150 uA في وضع الإيقاف على المعالج وإيقاف تشغيل جميع الرقائق الخارجية ، على الرغم من حقيقة أن تقديراتك هي الأكثر تشاؤمًا ، قادمة من أوراق البيانات لكل شيء قمت بحامته على اللوحة لا تعطي أعلى من 10 μA.
علاوة على ذلك ، فإنك تحاول أخذ المعالج إلى وضع الاستعداد بدلاً من التوقف ، أي فقط قم بإيقاف تشغيله بالكامل تقريبًا - وبدلاً من السقوط ، يزيد استهلاك الطاقة ثلاث مرات ، ويقترب من نصف مللي أمبير!
لا داعي للذعر. كما كنت قد خمنت ، فعلت كل شيء بشكل صحيح. لكن ليس حتى النهاية.
متلازمة تململ الساق - 2
تتكون المشكلة التالية من جزأين.
الأول واضح تمامًا: إذا كان جهازك لا يتكون من متحكم واحد ، فمن المهم ألا ننسى أن الرقائق الخارجية تحتوي أيضًا على إشارات إدخال يتم تشغيلها من قبل شميت ، والتي ، علاوة على ذلك ، يمكن أن توقظ المنطق الداخلي للرقاقة. على سبيل المثال ، ستحاول شريحة UART سحبها وإزالتها من وضع السكون لقراءة البيانات منها مع أي حركة على هذا الناقل.
وفقًا لذلك ، إذا تم تعليق كل هذه الأرجل في الهواء ، فلن نحصل على أي شيء جيد.
تحت أي ظروف ينتهي بهم المطاف في الهواء؟
أولاً ، عندما تنتقل وحدة التحكم إلى وضع الاستعداد ، يتم نقل جميع وحدات GPIO إلى حالة High-Z ، بمقاومة عالية - أي ، في الواقع ، الرقائق الخارجية المتصلة بها في الهواء. من المستحيل إصلاح هذا برمجيًا في STM32L1 (في مجموعات أخرى ووحدات تحكم أخرى يحدث بطرق مختلفة) ، وبالتالي فإن المخرج الوحيد - في نظام يستخدم وضع الاستعداد ، يجب سحب مدخلات الرقائق الخارجية إلى الأرض أو تشغيلها بواسطة مقاومات خارجية.
يتم اختيار مستوى معين بحيث يكون الخط غير نشط من وجهة نظر الشريحة:
- 1 لـ UART TX
- 0 لـ SPI MOSI
- 0 لـ SPI CLK في وضع SPI 0 أو 1
- 1 لـ SPI CLK مع وضع SPI 2 أو 3
- 1 لـ SPI CS
ثانيًا ، على STM32
عند استخدام وضع التوقف (sic!)
، يمكن أن تكون حالة GPIOs المتصلة بكتل الأجهزة الداخلية للواجهات ... مختلفة. أي أن نفس واجهة SPI ، عند تكوينها ، في Stop ، تتحول فجأة إلى إما إدخال رقمي ، أو بشكل عام ، High-Z - مع النتائج المقابلة للرقائق الخارجية المعلقة عليه. بينما تشير الوثائق إلى أن الساقين في حالة جيدة ، لا يمكنك الاعتماد عليها إلا إذا كنت تستخدم ساقيك كوحدات GPIO عادية.
لا يمكنك فهمها ومسامحتها ، ولكن يمكنك تذكرها وإصلاحها: بالنسبة للواجهات التي تتصرف بهذه الطريقة ، يجب عليك إضافة التبديل القسري إلى GPIO العادي بمستويات تتوافق مع المستويات غير النشطة لهذه الواجهة في وظيفة العناية بالنوم. بعد الخروج من النوم ، يمكن استعادة الواجهات.
على سبيل المثال ، نفس SPI قبل النوم (للحصول على البساطة ، آخذ الرمز من نظام التشغيل RIOT ، من الواضح أنه من السهل تنفيذه على التسجيلات):
for (i = 0; i < SPI_NUMOF; i++) { if (is_periph_clk(spi_config[i].apbbus, spi_config[i].rccmask) == 1) { if (spi_config[i].dev->CR1 & (1<<1)) { gpio_init(spi_config[i].sclk_pin, GPIO_IN_PU); } else { gpio_init(spi_config[i].sclk_pin, GPIO_IN_PD); } gpio_init(spi_config[i].mosi_pin, GPIO_IN_PD); gpio_init(spi_config[i].miso_pin, GPIO_AIN); } }
يرجى ملاحظة أن المخرجات هنا لم تتم تهيئتها على أنها GPIO_OUT بمستوى 0 أو 1 ، ولكن كمدخلات بسحب يصل إلى 0 أو 1 - هذه ليست نقطة أساسية ، ولكنها توفر أمانًا إضافيًا إذا ارتكبت خطأ وحاولت لعب الضغط مع نوع من رقاقة خارجية تسحب هذا الرجل في الاتجاه الآخر. مع GPIO_OUT يمكنك ترتيب دائرة قصر ، مع GPIO_IN مع السحب - أبدا.
بالإضافة إلى ذلك ، لا تتأثر إشارة SPI CS - في هذه الحالة ، يتم إنشاؤها برمجيًا ، أي بواسطة GPIO العادي ، وتحافظ على حالتها في حلم بثقة.
لاستعادة حالة الساق عند ترك النوم ، يكفي كتابة قيم السجلات التي سيتم تغييرها (MODER ، PUPDR ، OTYPER ، OSPEEDR - انظر الحالة في حالة معينة) عند المدخل ، إلى المتغيرات ، ولفها مرة أخرى في السجلات عند ترك النوم من المتغيرات .
والآن ... تا دعام! صورة العنوان. واحد ونصف ميكرامب.
لكن من السابق لأوانه الاحتفال. على هذا انتهينا من التحسين
الثابت لاستهلاك الطاقة ، وقبلنا
ديناميكي .
أخيل ضد السلحفاة
أيهما أفضل - تأكل أكثر وتجري أسرع أو تأكل أقل ، لكن أبطأ؟ في حالة المتحكمات الدقيقة ، فإن الجواب على هذا السؤال هو ضعف غير بديهي.
أولاً ، يمكن تغيير ترددات التشغيل في نطاق واسع جدًا - من 65 كيلو هرتز (تشغيل LP) إلى 32 ميجا هرتز في الوضع العادي. مثل أي شريحة CMOS ، يحتوي STM32 على مكونين في استهلاك الطاقة - ثابت وديناميكي ؛ والثاني يعتمد على التردد ، الأول ثابت. ونتيجة لذلك ، لن ينخفض استهلاك الطاقة بسرعة مثل تردد التشغيل والإنتاجية ، واعتمادًا على المهمة ، قد يتبين أن التردد الأمثل من وجهة نظر كفاءة الطاقة يكون مختلفًا - حيث تحتاج إلى الانتظار لبعض الأحداث ، ولكن لسبب ما لا يمكنك الذهاب إلى النوم ، سيكون هناك الترددات المنخفضة فعالة ، حيث تحتاج فقط إلى درس الأرقام - عالية. في المهام المعتادة "للمستشفى" ، من غير المنطقي عادة أن تذهب إلى ما دون 2-4 ميجاهرتز.
ثانيًا ، وهذه لحظة أقل خطورة ، يعتمد معدل الخروج من النوم على تردد العمل وطريقة استقباله.
أسوأ حالة هي الخروج من النوم بتردد 32 ميجاهرتز من الكوارتز الخارجي (دعني أذكرك بأن STM32L1 يستيقظ على مذبذب داخلي 4 ميجاهرتز) ، لأنه يتكون من ثلاث مراحل:
- في الواقع يستيقظ المعالج من النوم
- استقرار توليد الكوارتز (1-24 ميجاهرتز)
- استقرار توليد PLL (32 ميغاهرتز)
في الواقع ، إن إخراج المعالج من وضع السكون هنا هو المشكلة الأصغر ، حيث يبلغ تردده 4.2 ميجاهرتز حوالي 10 ميكرومتر. لكن استقرار الكوارتز يمكن أن يستغرق ما يصل إلى 1 مللي ثانية (على الرغم من أنه عادة ما يكون أسرع بالنسبة للمرنانات عالية السرعة ، بترتيب عدة مئات من الميكروثانية) ، فإن الوصول إلى وضع PLL هو 160 ثانية أخرى.
قد لا تكون هذه التأخيرات كبيرة من وجهة نظر استهلاك الطاقة لنظام نادرًا ما يستيقظ (ليس أكثر من مرة واحدة في الثانية) ، ولكن عندما تكون الفترة بين عمليات التنبيه عشرات الملي ثانية وأقل ، وتكون عمليات التنشيط قصيرة ، تبدأ النفقات العامة في إضافة إضافة قابلة للقياس بالفعل حتى مع الأخذ في الاعتبار أنه أثناء الاستيقاظ يستهلك المعالج تيارًا صغيرًا نسبيًا.
ما الذي يمكن عمله بهذا؟ بشكل عام ، الجواب واضح: حاول تجنب استخدام الكوارتز الخارجي. على سبيل المثال ، يمكن للبرنامج الذي توجد فيه مهام فرعية ثقيلة نادرة تتطلب تسجيل الوقت بدقة (على سبيل المثال ، المهام التافهة - تبادل بيانات UART) ، والمهام الفرعية البسيطة المتكررة ، أن يقرر بنفسه عند كل يقظة ما إذا كان من الضروري الانتقال إلى كوارتز خارجي ، أو سيكون من الأسهل (وأسرع!) أداء المهمة الحالية على مولد MSI ، والتي استيقظ عليها المعالج بالفعل دون قضاء الكثير من الوقت في تهيئة الترددات.
ومع ذلك ، في هذه الحالة ، قد يكون من الضروري ضبط ترددات الساعة للمحيط ، وكذلك ضبط أوضاع الوصول إلى ذاكرة الفلاش (عدد دورات التأخير) ، وجهد نواة المعالج (في STM32L1 يتم اختياره من ثلاث قيم محتملة) ، إلخ. ومع ذلك ، فيما يتعلق بأوضاع تشغيل النواة والذاكرة ، غالبًا ما يكون من الممكن ضبطها عن طريق اختيار الأوضاع الموصى بها للحصول على أقصى تردد مستخدم ، لأن التشغيل غير الأمثل للنواة في الترددات المنخفضة لن يعطي تغييرًا كبيرًا في الأداء العملي واستهلاك الطاقة بسبب الحجم الصغير للمهام عند هذه الترددات نفذت.
على الرغم من أن جميع هذه التدابير تنطبق بالفعل على الضبط الدقيق للأوضاع (وعلى سبيل المثال ، فإن معظم أنظمة التشغيل والمكتبات لا تعرف حتى أي شيء قريب من الصندوق) ، في بعض الحالات ، يمكن أن تؤدي إلى انخفاض في متوسط الاستهلاك على مقياس الوحدات في المئة ، وأحيانًا أكثر. تخيل ، على سبيل المثال ، عداد المياه الذي يستقصي جهات اتصال مفتاح القصب كل 50 مللي ثانية ، بينما يستغرق المسح الفعلي عدة عشرات من الميكروثانية - هل تريد إضافة ~ 500 ميكرون في هذا الوقت لتنشيط وحدة التحكم؟ ..
الثانية طويلة بشكل لا يطاق
مشكلة أخرى لا تتعلق مباشرة بالحفاظ على الطاقة ، ولكنها تنشأ حتمًا فيما يتعلق بها - كيف نحسب الفترات الزمنية التي تقل عن ثانية واحدة؟
والحقيقة هي أنه في STM32L1 ، يوجد مؤقت واحد فقط يعمل في وضع الإيقاف - وهذا هو RTC ، وهي وحدة زمنية قياسية تبلغ ثانية واحدة. في الوقت نفسه ، توجد في البرامج فترات زمنية ثابتة للوحدات ، وعشرات ومئات المللي ثانية ، لأخذ نفس عداد المياه على الأقل.
كيف تكون تعمل على معالجات مع مؤقتات LPTIM ، بسرعة 32768 هرتز؟ خيار جيد ، في الواقع ، ولكنه ليس ضروريًا دائمًا. ممكن بدونها.
ليس على كل STM32L1 ، ولكن بدءًا من Cat. 2 (هذه المعالجات STM32L151CB-A ، STM32L151CC وأحدث) ، تم استكمال كتلة RTC بسجل جديد - SSR ، SubSeconds Register. بتعبير أدق ، لم يتم استكماله كثيرًا لأنه جعله مرئيًا للمستخدم ، بالإضافة إلى المنبهات الفرعية ALRMASSR و ALRMBSSR تمت إضافتها.
لا يحتوي هذا السجل على أي وحدات زمنية مفهومة ؛ فقد تم تخزينه من عداد داخلي فني. في STM32L1 ، تمر ساعة تدق عند 32768 هرتز من خلال عدادات مقسمة ، غير متزامنة ومتزامنة ، والتي تقسمها عادةً على 32768 للحصول على علامة 1 ثانية للساعة. لذا ، SSR ليست سوى القيمة الحالية للعداد الثاني.
على الرغم من أن SSR لا يحسب بالمللي ثانية ، ولكن في وحداته ، يمكن تغيير أبعاد هذه الوحدات عن طريق تغيير نسبة قواسم العداد المتزامن وغير المتزامن ، مع الحفاظ على إجمالي معاملها يساوي 32768 للحصول على المعيار 1 ثانية عند إدخال RTC. بمعرفة هذه المعاملات ، يمكننا حساب سعر قسم واحد من SSR بالمللي ثانية ، ومن هنا يمكننا المتابعة إلى برمجة الإنذارات الفرعية.
وتجدر الإشارة إلى أن العداد المسبق غير المتزامن هو أكثر اقتصادا من SSR المتزامن ، وبالتالي فإن تعيينه على 1 ، وتقسيم تردد الإدخال بالفعل إلى SSR على 32768 ، بعد تلقي عدد 30 μs فقط ، هو أمر غير مؤاتٍ للغاية. لأنفسنا ، حددنا القيمة المثلى للمقسّم الأولي 7 ، للمزامنة - 4095 ((7 + 1) * (4095 + 1) = 32768). مع انخفاض إضافي في الحاجز الأولي ، يبدأ استهلاك الطاقة لـ RTC في النمو بشكل ملموس - بجزء من أمبير صغير ، ولكن بما أننا نقارن ذلك مع "المرجع" 1.4 μA في وضع التوقف ، فإن الكسور مهمة. بشكل افتراضي ، بالنسبة إلى STM32L1 ، تكون هذه القيم 127 و 255 ، أي السعر المرجعي حوالي 4 مللي ثانية ، وهو خشن قليلاً.
إذا كنت تريد التعمق أكثر في الشفرة ، فإننا في الوقت المناسب أنهينا
برنامج التشغيل القياسي RTC من نظام التشغيل RIOT لدعم RTC_SSR والفترات الزمنية بالمللي ثانية. منذ ذلك الحين ونحن نستخدمها حرفيا في كل خطوة (ومنذ أن عملنا في نظام التشغيل ، هناك خدمة معلقة فوقها ، مما يسمح لك بتعليق أي عدد من المهام مع فترات عشوائية على جهاز توقيت واحد بنقرة من المعصم).
يتم نقل نفس النهج إلى وحدات التحكم STM32L0 و STM32L4 ، وجميع النماذج لها سجل RTC_SSR ؛ هذا يلغي الحاجة إلى مؤقتات LPTIM ويوحد الكود لمختلف المنصات.
كيف نفهم أن المتر المتعدد يكذب
بالطبع ، بعد كل التحسينات ، يطرح السؤال المشروع: ما الذي حققناه في الواقع؟
دون معرفة الإجابة عليه ، يمكن للمرء أن يقتصر تمامًا على WFE واحد مع أعلام تم تكوينها بشكل صحيح ، والذهاب إلى النوم والحصول على 200-500 μA.الطريقة الأكثر تقليدية لقياس التيار هي بالطبع مقياس متعدد. لفهم أنها تقع على حمولة مثل متحكم مع استهلاكها الديناميكي أمر بسيط للغاية - إذا تم تشغيله ، فهو يكذب.ومع ذلك ، هذا لا يعني أن المتر المتعدد لا طائل منه في هذه المسألة. تحتاج فقط إلى أن تكون قادرًا على تطبيقه.أولاً ، يعد المتر المتعدد شيئًا بطيئًا للغاية ، والوقت النموذجي لعد واحد فيه هو مقياس ثانٍ ، والوقت المعتاد لتغيير حالة وحدة التحكم الدقيقة هو مقياس ميكروثانية. في نظام يغير استهلاكه بهذه الوتيرة ، سيظهر المتر المتعدد ببساطة قيمًا عشوائية.ومع ذلك ، فإن أحد المتغيرات غير العشوائية التي تهمنا هو استهلاك وحدة التحكم الدقيقة في وضع السكون ؛ إذا تجاوز بشكل كبير القيمة التي قدّرناها في أوراق البيانات ، فمن الواضح أن هناك خطأ ما. هذا هو استهلاك نظام ثابت ، أي أنه يمكن قياسه بمقياس متعدد.الطريقة الأكثر تافهًا الموضحة في صورة العنوان هي جهاز متعدد في وضع مقياس دقيق ، والذي أصبح الآن في معظم الموديلات متوسطة المدى ، ولديه دقة جيدة ودقة ممتازة. يحتوي UT120C على دقة 0.1 μA مع دقة معتمدة تبلغ ± 1٪ ± 3 تصريفات ، وهو ما يكفي بالنسبة لنا.هناك مشكلة واحدة فقط في هذا الوضع - فالأجهزة المتعددة فيه مقاومة سلسلة كبيرة ، ومئات أوم في الحجم ، لذلك في الوضع العادي ، لن يبدأ الميكروكونترولر مع هذا المتر المتعدد في دائرة الطاقة ببساطة. لحسن الحظ ، فإن وضعي "mA" و "uA" في جميع الأجهزة تقريبًا على المقياس قريبان ، ومقابس القياس على كلا النطاقين متشابهة ، لذا يمكنك بدء تشغيل وحدة التحكم بأمان عند حد "mA" ، وعندما تذهب إلى النوم ، انقر فوق "uA "- يحدث هذا بسرعة كافية بحيث لا يكون لدى وحدة التحكم الوقت لفقد الطاقة وإعادة التشغيل.يرجى ملاحظة أنه إذا واجهت وحدة التحكم طفرات في النشاط ، فلن تكون هذه الطريقة قابلة للتطبيق. على سبيل المثال ، تتم إعادة ضبط موقت المراقبة كل 15 ثانية في البرامج الثابتة للجهاز - في هذه اللحظات ، يتمكن جهاز القياس المتعدد من إظهار شيء ما في منطقة 27 μA ، والتي بالطبع لا علاقة لها بالطقس على كوكب المريخ. في حالة حدوث شيء قصير بشكل تعسفي على النظام الخاص بك أكثر من مرة كل 5-10 ثوانٍ ، فسيكمن المتر المتعدد ببساطة.طريقة أخرى لقياس ثابت(أنا أسلط الضوء مباشرة على هذه الكلمة) الاستهلاك بواسطة مقياس متعدد هو قياس السقوط على التحويلة الخارجية. إذا كنت ترغب في قياس التيارات الصغيرة جدًا على مقياس بضع عشرات من المعسكرات الدقيقة ، فأنت بحاجة إلى وضع تحويلة كبيرة (على سبيل المثال ، 1 كيلو أوم) ، وبالتوازي معها - صمام ثنائي شوتكي في اتصال مباشر. إذا انخفض التحويلة أكثر من 0.3 فولت ، فسيتم فتح الصمام الثنائي ويحد من انخفاض الجهد ، وحتى 0.3 فولت ، يمكنك قياس الانخفاض بأمان باستخدام جهاز متعدد في نطاق الميليفولت ، 1 مللي فولت = 1 μA.للأسف ، لن يعمل على قياس الانخفاض على تحويلة ذات مقاومة منخفضة مع جهاز متعدد الطبقات نموذجي - أجهزة من الطبقة المتوسطة ، حتى إذا أظهرت شيئًا أقل من 100 μV ، فإن الدقة في هذا النطاق مؤسفة. إذا كان لديك جهاز سطح مكتب جيد يمكنه عرض 1 فولت ، فأنت لم تعد بحاجة إلى نصيحتي.ومع ذلك ، فإن الإحصائيات جيدة ، ولكن ماذا عن الديناميكيات؟ كيفية تقييم نفس التأثير للترددات المختلفة على متوسط استهلاك الطاقة؟كل شيء معقد هنا.دعونا نكتب المتطلبات الأساسية:- النطاق الحالي لا يقل عن 1 --A - 100 مللي أمبير (10 ^ 5)
- فترة القياس لا تزيد عن 10 μs
- انخفاض الجهد لا يزيد عن 100 mV
- مدة القياس - غير محدودة
إذا قمنا ببساطة بترجمة هذا بشكل مباشر إلى أرقام ، نحصل على ADC سريع نسبيًا ولا يقل عن 18 بت مع انحياز إدخال أقل من 30 μV ، وواجهة أمامية تناظرية قادرة على قياس الفولتية من 1 μV ، وواجهة سريعة إلى الكمبيوتر تسمح لنا بنقل كل هذا واحفظ.وكل هذا لاستخدام واحد.ترى ، نعم ، لماذا لا تقع مثل هذه الأشياء في كل زاوية من عشرة دولارات؟ يلبي Keysight N6705C في التقريب الأول متطلباتنا ، إلا أنه يكلف 7960 دولارًا.من بين حلول الميزانية ، على سبيل المثال ، تدمج SiLabs القياس الحالي في تصحيح الأخطاء - تعتمد خصائص نظام مراقبة الطاقة المتقدم (AEM) على نموذج التصحيح المحدد ، ولديهم أكبر مشكلة في سرعة القياس. في "مجموعات المبتدئين" القديمة ، يبلغ STK3300 / 3400 100 هرتز فقط ، وفي تصحيح الأخطاء الأحدث ، STK3700 / 3800 (يمكن التعرف عليه بسهولة من خلال Textolite الأسود) - 6.25 كيلو هرتز ، وفي الموديلات القديمة من سلسلة DK ، يمكن أن يصل إلى 10 كيلو هرتز ، ولكنه يكلف أيضًا هم بالفعل 300 + دولار. بالنسبة للمهام الجادة ، توصي SiLabs رسميًا باستخدام Keysight المذكور أعلاه.من حيث المبدأ ، يمكن تصميم هذا الجهاز بنفسك - أولاً وقبل كل شيء ، تحتاج إلى مضخمات تشغيلية جيدة جدًا مع الحد الأدنى من انحياز الإدخال ، مثل OPA2335. يتم وضع هذه المضخمات التشغيلية على نفس التحويلة المكونة من 2-3 قطع بعوامل تضخيم مختلفة ، وكلها مجروحة لمدخلات ADC مختلفة (مع هذا النهج ، من الممكن تمامًا استخدام وحدة التحكم الدقيقة المضمنة) ، ثم في كل مرة يتم أخذ البيانات ، يتم تحديدها برمجيًا أي مكبرات الصوت في هذا اللحظة ليست محملة ، تحسب القراءات منها.يتم حل مشكلة سرعة نقل البيانات إلى جهاز كمبيوتر بكل بساطة - نظرًا للأغراض العملية ، فنحن مهتمون بشكل أساسي بمتوسط استهلاك النظام في الحياة الواقعية ، ويمكن جمع قراءات الميكروثانية في وحدة التحكم الدقيقة على متن العداد ويمكن إرسال المتوسط الحسابي لبعض المقاييس المعقولة للملي ثانية.بالإضافة إلى ذلك ، كما تظهر الممارسة ، من المفيد جدًا أن يكون لديك جهاز تسجيل ، وإن كان بسيطًا وغير دقيق للغاية ، ولكن دائمًا في متناول اليد - حتى لا تحصل على مفاجآت مع نوع من تغيير البرامج الثابتة مكسور بسبب توفير الطاقة.على سبيل المثال ، قمنا ببناء واحد في محول USB القياسي UMDK-RF ، والذي يتم استخدامه باستمرار عند تصحيح البرامج الثابتة - لديه بالفعل مبرمج SWD مع دعم بروتوكول DAPLink وجسر USB-UART ومنطق إدارة الطاقة ، على التوالي ، حصل على عداد استهلاك تقريبا مجانا. المقياس نفسه عبارة عن تحويلة 1 أوم ومضخم INA213 (كسب 50 مرة ، وإزاحة صفرية نموذجية تبلغ 5 ميكرو فولت):
يتم توصيل مكبر الصوت مباشرة بإدخال ADC الخاص بوحدة التحكم الدقيقة (STM32F042F6P6) ، ويعالج ADC مع فترة 10 ميكرو ثانية باستخدام مؤقت الأجهزة ، وما يصل عبر USB يتم إخراج البيانات المتوسطة لفاصل زمني 100 مللي ثانية. ونتيجة لذلك ، من خلال تغيير شيء ما في منطق البرامج الثابتة ، يمكنك فقط الذهاب للتدخين أو شرب القهوة ، وترك الجهاز على الطاولة ، والعودة ، وإلقاء نظرة على جدول مثل هذا:
دقة هذا الجهاز "المجاني" ، بالطبع ، ليست عالية - مع ADC 12 بت ومضخم واحد ، الحد الأدنى من الكم هو 16 μA ، ولكنه مفيد للغاية لتقييم سلوك الأجهزة المصححة بشكل سريع ومنتظم من وجهة نظر استهلاك الطاقة. في النهاية ، إذا فعلت شيئًا خاطئًا في البرامج الثابتة أو الجهاز ، فعندئذٍ بضمان عالي جدًا ، ستتمكن من الخروج من وحدات microamps على الأقل المئات ، وسيكون هذا مرئيًا بوضوح.
مكافأة أخرى لطيفة هي أنه نظرًا لأن البيانات يتم إرسالها إلى منفذ COM الظاهري في شكل نصي (القيم الموجودة في المعسكرات الصغيرة) ، يمكنك وضع النافذة الطرفية بجوار النافذة التي تعرض وحدة تحكم الجهاز وإلقاء نظرة على استهلاك الطاقة في وقت واحد مع رسائل التصحيح.أنا أتفاخر بهذا لسبب ما ، ولكن لأقدم لكل من يريد استخدام هذا الحد الأدنى (والرخيص للغاية!) مبرمج المصحح في مشاريعهم الخاصة.يمكنك رسم الرسم التخطيطي هنا ( المصدر في DipTrace ) ، اسحب البرامج الثابتة هنا (وجبة الغداء umdk-rf ، عندما يكون الهدف هو UMDK-RF ، بناءً على مشروع dap42 ). يتم رسم المخطط بشكل فوضوي ، ولكن آمل أن تكون النقاط الرئيسية واضحة ، فالبرنامج الثابت مكتوب بلغة C باستخدام libopencm3 ويتم تجميعه باستخدام الذراع المعتاد بدون eabi-gcc. كوظائف إضافية ، يحتوي البرنامج الثابت على إدارة الطاقة ، حيث يلتقط إشارات التحميل الزائد من مفاتيح التحكم ويدخل جهاز التحكم المتصل بها في أداة تحميل التشغيل الأصلية بضغطة طويلة على زر.ملاحظة: إذا كنت تريد أن يقوم زر التمهيد بإحضار وحدة التحكم الخاصة بالمبرمج إلى أداة تحميل التشغيل بطريقة منتظمة ، فيجب أن يتم تغيير قطبية الاتصال ، وخيار تحرير وحدات البايت لوحدة التحكم في التمهيد الأول وإزالة إدخال البرنامج إلى أداة تحميل التشغيل ، وقطبية المقاطعة للمنتظم وظائف هذا الزر.يمكنك إلقاء نظرة على كيفية قياس التيار على زوج من المضخمات التشغيلية مع عوامل كسب مختلفة (على سبيل المثال ، لتحسين مصحح الأخطاء الموصوف أعلاه لمهامك) ، هنا (الصفحة 9) ، خيار بديل أكثر تقليدية - مع مضخم تشغيل واحد ومضخم ADC 24 بت باهظ الثمن - لديها TI (EnergyTrace في الصفحة 5).ملاحظة يرجى ملاحظة أنه أثناء تصحيح الأخطاء باستخدام UART أو JTAG / SWD متصل ، يمكن أن يتدفق تيار صغير أيضًا من خلال أرجلهم ، وهو ما لن يحدث أثناء التشغيل الفعلي للجهاز. لذلك ، على UMDK-RF ، حوالي 15 μA تسرب في SWD (وبالتالي ، في صورة الرأس ، يتم إجراء القياسات باستخدام جهاز متعدد على الإصدار القديم من اللوحة ، بدون SWD) ، وعلى STM32 Nucleo كانت هناك حالات مع تدفق زائف عبر SWD حوالي 200 μA . يجب التحقق من لوحات التصحيح المستخدمة للقياس بحثًا عن هذه الميزات - إما عن طريق فصل خطوط الواجهة الخاصة بهم ، إذا كان هناك مثل هذا الاحتمال ، أو بمقارنة النتائج مع استهلاك الجهاز الذي تم قياسه دون تثبيته لتصحيح الأخطاء ، على سبيل المثال ، باستخدام جهاز متعدد في الوضع الثابت.بدلا من الاستنتاج
آمل أن تكون قد فهمت بالفعل الخطأ الذي ارتكبته باختيار برمجة وحدة التحكم الدقيقة كتخصصك الرئيسي.