Rachet inverterad pendel kontroll (4 / 7 steg)
Steg 4: Gratis RTOS
För att köra alla uppgifterna som krävs i realtid, användes FreeRTOS. FreeRTOS är en realtid arbetsdrift systemet, vilket innebär att det kommer att reagera på händelser inom en förutsägbar tid. Detta är viktigt eftersom det tillåter att systemet ska vara förutsägbar. Koden var avsedd att ha fyra uppgifter som följer:
- Läsning från UART
- Läsning från ESP8266 WiFi modul
- Läst MPU-6050 IMU
- Kör en kommandorad konsol
Läsning från UART
Detta var en enkel uppgift som intervjuade UART för nya figurer. När ett nytt tecken hittades, placerades sedan tecknet i en kö, som lästes av kommandoraden konsolen uppgiften. Detta kunde ha genomförts med UART avbrott, men valet var enkelt, arbetat, och genom att göra denna uppgift den lägsta prioriteten, det endast var tillåtet att köra när det inte fanns något annat att göra. Detta innebär att det inte slösa CPU-cykler polling UART när andra saker skulle kunna göras. Den bara annan oro med polling UART var om tecken kommer i för snabbt. I vår inställning tillfrågade vi UART för nya tecken varje 10 ms, som är betydligt snabbare än mänskliga kunde typ. Detta kan vara problematiskt om UART konsolen skulle köras från ett för, men vi bestämde oss för enkelheten i modulen uppvägs den funktionen.
Läsning från ESP8266 WiFi modul
Som en del av detta projekt ville vi också trådlös kommunikation. Det vore ju olyckligt om kuben behövs för att vara ansluten till en dator. Detta uppnåddes med hjälp av en ESP8266, en liten, lätt att använda WiFi modul tillgänglig från många olika leverantörer. ESP8266 kommunicerar till Zynq styrelsen också använder en UART gränssnitt, vilket gjorde det nödvändigt att skriva en annan UART förare. För UART drivrutinen måste vi läsa i många tecken på en gång, vilket innebar att det var nödvändigt att avbrott. Avbryta handler wass anropas när ett tecken lästes av UART och lägger till data i en kö. Kön är sedan läsa av ESP8266 uppgiften, som beslutar vad de ska göra med karaktären.
Uppgiften bestod av en stor stat maskin för initiering av modulen och läsa inkommande data. När uppgiften fick paket från modulen skickade det dem till samma kön som användes av den UART modul, som lästes av konsolen uppgiften. Detta gör att samma konsolkommandon som ska användas av båda operatören fysiskt ansluten till systemet eller över WiFi. Denna metod också möjliggör återanvändning av kod och håller koden tarvlig mer organiserade.
Läst MPU-6050 IMU
IMU-6050 är en 6-axlig IMU består av en 3-axlig accelerometer och en 3-axlig gyroskop. Detta möjliggör upptäckt av vinkeln och rotationshastighet av systemet, som båda är viktigt att kontrollerna algoritmen. Att få uppgifter av sensorn var enkelt. Sensorn kommunicerar över I2C med adressen 0x68. Innan du läser data accelerometer och gyroskop, måste sensorn tas ur viloläge genom att skriva 0 till adress 0x6B, power management registret. Därifrån kan du läsa den råa accelerometer och gyroskop behandlingen börjar på adress 0x3B. Se databladet och registrera karta för fullständig funktionalitet.
När vi först började spela med sensor, märkte vi att raw-data inte var exakt samt vara bullrig. Vi använde två separata tekniker för att lösa dessa problem. Efter att titta på data, märkte vi att IMU verkar ha en förskjutning från de korrekta värdena. För att lösa detta problem, placerade vi IMU på en nivå tabell, där vi visste orienteringen för var och en av accelerometer axeln. Sedan vi tog och i genomsnitt 5 mätningar från IMU. Vi tog den kända orienteringen och subtraheras den acceleration det gav oss. Resultatet blev en offset vektor som var subtraheras från varje IMU läsning. Detta ökade precisionen i systemet. För att lösa bullerproblemet använde vi en enkel 5 punkt genomsnitt filter. Istället för att återvända varje IMU läsning, skulle vi spara 5 avläsningar och genomsnittet av varje värde. Detta hjälpte eliminera en hel del buller vi såg från sensorn.
Här var vi hopp om att skicka denna information till FPGA, som skulle körning algoritmen som kontroller. Tyvärr, vi har svårigheter att genomföra kontroller algoritmen i Verilog och beslutade att genomföra det i C. På grund av detta, en gång en giltig IMU läsning var tagit, RTOS uppgiften skulle sedan beräkna den nödvändiga varvtal och skicka den till motorn via PWM generation block. Medan detta gjorde att genomföra enklare, hade det varit trevligt att köra kontrollerna i FPGA som vi tror skulle ha förbättrat den kontrollerar kretsar.
Läsa en kommandorad konsol
Konsolen kommandoraden var ansvarig för skicka högre nivån kommandon och röstningen information, till exempel IMU avläsningarna från systemet. Konsolen kommandoraden sprang som sin egen uppgift och tar i data från både UART och ESP8266. Detta gjorde det möjligt för konsolen att drivas direkt från en dator eller via ett trådlöst nätverk. Uppgiften blockerat på en FreeRTOS kö tills datan var tillgänglig. Uppgiften som sedan drivs som en tillståndsdator, läsning i ett kommandonamn och data. Om kommandot var giltig skulle sedan köra den tillhörande koden och vänta på ett annat kommando. Detta möjliggjorde flexibla kommandon och var till hjälp för felsökning och befallande systemet.