Kitengo 3 / 9

Mifumo Iliyopachikwa na Uzalishaji wa Msimbo wa Kidhibiti Kidogo

Faida:

  • Uwezo wa kutoa nambari iliyoingia iliyopewa rejista na muktadha wa vifaa kwa Arduino/STM32/ESP32 na AI.
  • Uwezo wa kutambua na kusahihisha mifumo iliyopachikwa kama vile kukatizwa, vipima muda na vitanzi visivyozuia katika pato la AI.
  • Uwezo wa kukagua msimbo uliozalishwa kwa suala la kumbukumbu, wakati halisi na usalama kabla ya kuipakia kwenye maunzi

Katika mechatronics, microcontroller ni mahali ambapo mawazo hukutana na ulimwengu wa kimwili. Kadi kama vile Arduino, STM32, ESP32; inasoma vitambuzi, inaendesha viendeshaji, inawasiliana, na hufanya haya yote chini ya kumbukumbu ndogo, nguvu ndogo ya uchakataji, na mahitaji madhubuti ya wakati. Ujuzi wa Bandia ni muhimu sana katika uwanja huu: inaweza kutoa mipangilio ya rejista kulingana na hifadhidata ya kihisi, kuweka nambari ya itifaki ya mawasiliano, kuweka kipima saa. Lakini mifumo iliyoingia ni mojawapo ya maeneo ambayo AI huzalisha zaidi "uongo wa kushawishi"; kwa sababu anwani za usajili, vinyago kidogo na tabia ya kuweka saa ni mahususi kwa bodi na hitilafu moja huvuruga tabia nzima. Katika kitengo hiki, tunashughulikia jinsi ya kuwa na msimbo uliopachikwa unaozalishwa na AI na jinsi ya kuikagua kabla ya kuipakia kwenye maunzi.

Tofauti ya Msimbo uliopachikwa kutoka kwa Programu Safi

Programu ya eneo-kazi ina kumbukumbu nyingi, mfumo wa uendeshaji, na urahisi wa kurekebisha. Msimbo uliopachikwa hauna nyingi kati ya hizi:

Ukubwa

eneo-kazi

mfumo uliopachikwa

kumbukumbu

Kiwango cha GB

Kiwango cha KB (k.m. 2 KB ya RAM)

muda

Kwa ujumla rahisi

Wakati mkali, halisi

utatuzi

Rahisi (kitatuzi, logi)

Ngumu (JTAG, serial, LED)

Matokeo ya hitilafu

Programu inaanguka

Kitendaji/vifaa vinaweza kuharibika

upatikanaji wa rasilimali

Muhtasari wa OS

Ufikiaji wa moja kwa moja kwa Daftari

Tofauti hizi huamua vigezo vyako vya kutathmini matokeo ya AI: utumiaji wa kumbukumbu, wakati halisi (isiyozuia), na usahihi wa rejista ya maunzi huwa juu ya orodha yako wakati wote.

Kizuia dhidi ya Msimbo wa Kuzuia

Makosa ya kawaida yanayofanywa na wanaoanza (na mara nyingi hufanywa na AI) ni matumizi ya kuchelewesha (). kuchelewa (1000) hufunga processor kwa sekunde 1; Katika kipindi hiki, hakuna sensorer nyingine zinaweza kusoma, hakuna vifungo vinavyoweza kudhibitiwa. Hii haikubaliki katika mechatronics. Badala yake, muundo wa millis() msingi usio wa kuzuia hutumiwa.

// MBAYA: kizuia -- kichakataji hakiwezi kufanya kazi nyingine yoyote kwa kitanzi 1 cha utupu () { digitalWrite(LED, HIGH); kuchelewa (1000); // kila kitu kinaacha digitalWrite(LED, LOW); kuchelewa (1000); // Kitufe cha dharura hakiwezi kusomeka kwa wakati huu!}// NZURI: kutozuia -- kitanzi hakijazuiwa, kazi zingine zinaendeshwa ikiwa (nowMs - previousMs >= interval) { previousMs = nowMs; ledStatus = !ledHali; digitalWrite(LED, ledStatus); } kitufeAngalia(); // inaweza kukimbia katika kila sensor ya mzungukoSoma (); //inaweza kukimbia katika kitanzi chochote}

Mchoro usio wa kuzuia ni msingi wa mechatronics iliyoingia: kitanzi cha udhibiti kinapita kwa kuendelea, hakuna kazi inayofunga nyingine. Kuambia AI "usitumie kuchelewesha, andika millis-msingi isiyozuia" wakati wa kuandika nambari inaboresha moja kwa moja ubora wa matokeo.

Kidokezo: Tafuta ucheleweshaji ( katika msimbo uliopachikwa kutoka kwa AI. Ukiona kuchelewa kwa kitanzi kikuu cha udhibiti, mara nyingi msimbo huo haufai kwa mfumo wa wakati halisi na unapaswa kuandikwa upya.

Vikwazo na Vipima saa

Tunanasa matukio muhimu ya muda (mapigo ya encoder, kitufe, sampuli za mara kwa mara) kwa kukatizwa badala ya kusubiri kwenye kitanzi kikuu. Utaratibu wa kukatiza (ISR) unapaswa kuandikwa kwa ufupi na kwa uangalifu: hakuna ucheleweshaji, Serial.print au hesabu ndefu ndani yake; Vigezo vilivyoshirikiwa vinawekwa alama tete.

tete kwa muda mrefu encoderCounter = 0; // ISR na kitanzi vinashirikiwa -> hali tete utupu enkoderISR() { // ISR fupi: hesabu tu, usifanye kazi nyingine ikiwa (digitalRead(ENC_B)) enkoderCounter++; else encoderCounter--;} batili setup() {pinMode(ENC_A, INPUT_PULLUP); pinMode(ENC_B, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(ENC_A), enkoderISR, RISING);}void kitanzi() { counter kirefu; noInterrupts(); // kukatizwa kwa muda mfupi kwa counter ya kusoma atomiki = encoderCounter; kukatiza (); //fanya shughuli kwa usalama na kaunta...}

Mambo matatu muhimu katika mfano huu ni pale ambapo AI mara nyingi hukosa: (1) Kisimba cha kusimba kilichoshirikiwa lazima kiwe `tete` au uboreshaji wa kikusanyaji utakosa masasisho; (2) ISR inapaswa kuwa fupi; (3) Wakati wa kusoma kutofautisha kwa baiti nyingi kwenye kitanzi kikuu, usumbufu kwa usomaji wa atomiki lazima ufungwe kwa muda mfupi, vinginevyo ISR inaweza kuingilia kati wakati wa kusoma na thamani ya nusu / rushwa inaweza kusomwa (hali ya mbio). Hakikisha kuangalia ikiwa hizi tatu zipo kwenye nambari ya AI.

Usahihi wa Kusajili na Laha ya Data

AI inaweza kuwasilisha vibaya anwani ya rejista ya kihisi au sehemu ya usanidi ya MCU. Kwa mfano, rejista ya usimamizi wa nguvu ya MPU6050 IMU ni 0x6B; Ikiwa AI inatoa hii kama 0x6A, nambari imeundwa, inaonekana kufanya kazi, lakini sensor haiamka. Makosa kama hayo hugunduliwa tu wakati ikilinganishwa na hifadhidata.

// Kuamka kwa MPU6050: kulingana na hifadhidata PWR_MGMT_1 = 0x6B, thamani 0x00#fafanua MPU_ADDR 0x68#fafanua PWR_MGMT_1 0x6B // <-- VERIFY kutoka datasheetWire.beginTransmission(MPU_ADDR);Wire.write(PWR_MGMT_1);Wire.write(0x00); // kuamka kutoka kwa hali ya usingiziWire.endTransmission(kweli);

Makini: Thibitisha kila anwani ya rejista, barakoa kidogo na anwani ya I2C/SPI iliyotolewa na AI kutoka kwenye hifadhidata. Maadili haya ni kadi na chip maalum; Thamani ambayo AI "inakumbuka" inaweza kuwa kutoka kwa marekebisho mengine ya chip. Rejista isiyo sahihi husababisha kimya kimya tabia isiyo sahihi.

Uhamasishaji dhaifu / Uhamasishaji Wenye Nguvu

DHAIFU:"Soma kitambua halijoto kwenye ESP32."(Kihisi kipi? Itifaki ipi? Pini ipi? Ya jumla, pengine msimbo si sahihi.)STRONG:"Soma kitambua joto cha DS18B20 kwenye ESP32 (mfumo wa Arduino) kutoka GPIO4 ukitumia OneWire. Andika bila kuzuia, sampuli kila sekunde 1 (kwa kutumia kuchelewa, kulingana na milli). Weka alama ya hitilafu 18 katika kila kisanduku cha 18. maktaba na muunganisho wa pini unayotumia kwenye maoni ya kwanza Kwa sababu za kumbukumbu, tumia bafa ya char badala ya String."

Agizo lenye nguvu; Inatoa chip, mfumo, kitambuzi, itifaki, pini, muundo wa sampuli, hali ya makosa na kizuizi cha kumbukumbu. Kwa njia hii matokeo yanaweza kuthibitishwa na ya kweli.

Kagua Orodha Hakiki ya Msimbo Uliopachikwa

Kabla ya kupakia pato la AI, lipitishe kupitia orodha hii:

  1. Kuzuia: Je, kuna kuchelewa au kuzuia kwa muda mrefu katika kitanzi kikuu?
  2. tete: Je, vigezo vinavyoshirikiwa na ISR ni tete?
  3. Ufikiaji wa atomiki: Je, ubadilishaji wa baiti nyingi ulioshirikiwa ni salama kusoma?
  4. Sajili: Je, anwani na vinyago vidogo vinaoana na hifadhidata?
  5. Kumbukumbu: Kamba, safu kubwa, je, urejeshaji hutengeneza kiwango cha KB kufurika?
  6. Ushughulikiaji wa hitilafu: Je, hitilafu za usomaji wa kihisi, muda wa mawasiliano umeshughulikiwa?
  7. Kuanza kwa usalama: Je, vifaa vya kutoa vitendaji vimewekwa katika hali salama (ya tusi) wakati wa kuanza?

Kesi Ndogo

Mhandisi wa mifumo iliyopachikwa Baran ana AI kuandika msimbo unaosoma IMU kwa ndege isiyo na rubani. Nambari inakusanya na inaonekana kufanya kazi, lakini maadili ya pembe hayana maana. Baran hutumia orodha ya ukaguzi: inalinganisha anwani za rejista na hifadhidata na hugundua kuwa AI inatoa rejista ya usanidi wa gyroscope (0x1A badala ya 0x1B), kwa hivyo kiwango cha unyeti sio sawa. Mara baada ya kusahihishwa, maadili hutulia. Kisha chelewesha(10) notisi kwenye kitanzi kikuu; kubadilisha hii kwa muundo wa msingi wa millis, kwa sababu kuzuia kitanzi cha udhibiti wa ndege haikubaliki. Hatimaye, inaona kwamba kigezo cha kihesabu kilichoshirikiwa sio tete na kinaiongeza. AI ilitoa mifupa haraka; Lakini orodha ya mapitio ilipata makosa matatu tofauti: kujiandikisha, kuzuia na tete, na vifaa havikuwa hatari kabisa.

Makosa ya Kawaida

  • Kuua jibu la wakati halisi kwa kutumia delay() kwenye kitanzi kikuu cha kudhibiti.
  • Epuka kufanya kibadilishaji kishirikiwe na ISR kuwa tete na kukumbwa na ufisadi wa data kimya.
  • Kusoma kigezo cha baiti nyingi kishirikiwa bila ya atomiki na kutoa hali ya mbio.
  • Kutokuthibitisha rejista/vinyago kidogo vilivyotolewa na AI kwa kutumia hifadhidata.
  • Kuunda kumbukumbu iliyojaa kwa kutumia Mifuatano na mkusanyiko mkubwa katika RAM ndogo.
  • Inasahau kuweka salama matokeo ya kianzishaji.

Kwa muhtasari

  • Msimbo uliopachikwa; Inafanya kazi kwa kumbukumbu ndogo, muda mfupi, na ufikiaji wa rejista ya moja kwa moja.
  • Katika kitanzi kikuu, muundo usio na msingi wa millis hutumiwa badala ya kuchelewa.
  • ISR huwekwa fupi; vigeu vilivyoshirikiwa lazima viwe tete na vifikiwe atomiki.
  • Anwani za usajili na vinyago vidogo huthibitishwa kila mara dhidi ya hifadhidata; AI inaweza kuwa na makosa.
  • Kumbukumbu, ushughulikiaji wa makosa na hali ya uanzishaji salama huangaliwa kila wakati.
  • Agizo lenye nguvu; Inajumuisha chipu, mfumo, kitambuzi, itifaki, pini, na vikwazo.

Jukumu la maombi

Chagua kitambuzi (k.m. DS18B20, MPU6050 au HC-SR04) na kidhibiti kidogo (Arduino/ESP32/STM32). Ruhusu AI itengeneze msimbo wa kusoma usiozuia kwa kutumia kiolezo chenye nguvu cha haraka katika kitengo hiki. Kisha fuata vipengele saba vya orodha ya ukaguzi moja baada ya nyingine: linganisha angalau thamani ya rejista/pini na hifadhidata, angalia ucheleweshaji wa kitanzi, angalia hali tete ya vigeu vilivyoshirikiwa. Ni vitu ngapi "vilivyopitishwa" kwenye jaribio la kwanza na ni ngapi zilizohitajika kusahihisha? Kumbuka kila tatizo unalopata na kurekebisha kwake.