Accelerometer & Gyro handledning (1 / 3 steg)
Steg 1: Accelerometern
Om vi tar denna ruta på en plats med ingen gravitation fält eller för den delen med inga andra fält som kan påverka bollens position - flyter helt enkelt bollen i mitten av rutan. Du kan tänka dig i rutan är i yttre rymden långt-långt från alla kosmiska kroppar, eller om sådan plats är svårt att hitta föreställa sig minst ett rymdskepp som kretsar kring planeten där allt är i tyngdlös tillstånd. Från bilden ovan kan du se att vi tilldelar varje axel ett par väggar (vi bort väggen Y + så vi kan se i rutan). Tänk dig att varje vägg är tryckkänslig. Om vi flyttar plötsligt rutan till vänster (vi påskynda det med acceleration 1g = 9,8 m/s ^ 2), bollen kommer att slå i väggen X-. Vi sedan mäta trycket styrkan att bollen gäller väggen och produktionen ett värde av-1 g på X-axeln.
Observera att accelerometern faktiskt kommer att upptäcka en kraft som riktas i motsatt riktning från acceleration vektorn. Denna kraft kallas ofta tröghetsbaserad tvinga eller fiktiv kraft . En sak du bör lära av detta är att en accelerometer mäter acceleration indirekt genom en kraft som tillämpas på en av sina väggar (enligt vår modell, kan det vara en fjäder eller något annat i verkliga livet accelerometrar). Denna kraft kan orsakas av acceleration, men som vi ser i nästa exempel den alltid orsakas inte av acceleration.
Om vi tar vår modell och lägga den på jorden bollen kommer att falla på Z-väggen och en styrka på 1g på gäller den nedre väggen, som visas i bilden nedan:
I detta fall rutan är inte flytta men vi får fortfarande en läsning av-1 g på Z-axeln. Det tryck som bollen har tillämpat på väggen orsakades av en gravitation kraft. I teorin kunde det vara en annan typ av kraft - till exempel om du tänker dig att vår boll metallic, utsläppande en magnet bredvid rutan kunde flytta bollen så den träffar en annan vägg. Det säger bara för att bevisa att i huvudsak accelerometer åtgärder kraft inte acceleration. Det händer bara som accelerationen orsakar en tröghetsbaserad kraft som fångas av kraft upptäckt mekanismen av accelerometern.
Medan denna modell är inte exakt hur en MEMS sensor konstrueras är det ofta bra lösa accelerometer relaterade problem. Det finns faktiskt liknande sensorer som har metallic bollar inne, de kallas tilt växlar, men de är mer primitiva och oftast de kan bara berätta om enheten lutas ned inom vissa sträcker eller inte, inte omfattningen av lutning.
Vi har hittills analyserat accelerometern utgången på en enda axel och detta är allt får du med en enda axel accelerationsmätare. Det verkliga värdet av treaxiala accelerationsmätare kommer från det faktum att de kan upptäcka tröghetsbaserad styrkor på alla tre axlarna. Låt oss gå tillbaka till vår boxmodell, och låt oss rotera box 45 grader åt höger. Bollen kommer att röra 2 väggarna nu: Z- och X-som visas i bilden nedan:
Värdena på 0,71 är inte godtyckliga, de är faktiskt en approximation för SQRT(1/2). Detta kommer att bli mer tydliga som vi inför vår nästa modell för accelerometern.
I den tidigare modellen har vi fast kraften som gravitationen och roteras vår imaginära låda. I sista 2 exemplen har vi analyserat produktionen i 2 olika box positioner, medan force vector förblev konstant. Detta var användbart för att förstå hur accelerometern samverkar med utomstående krafter, är det mer praktiskt att utföra beräkningar om vi fixa koordinatsystemet till yxor av accelerometern och föreställa sig att force vector roterar runt oss.
Gärna ta en titt på modellen ovan, jag bevarade färgerna på axlarna så att du kan göra en mental övergång från den tidigare modellen till den nya. Tänk bara att varje axel i den nya modellen är vinkelrätt mot rutan i den tidigare modellen respektive ansikten. Vektorn R är kraft vektorn som accelerometern mäter (det kan vara antingen kraften som gravitation eller tröghetsbaserad kraften från exemplen ovan eller en kombination av båda). RX, Ry, Rz är projektionen av R vektorn på X, Y, Z-axlar. Observera följande förhållande:
R ^ 2 = Rx ^ 2 + Ry ^ 2 + Rz ^ 2 (ekv. 1)
vilket är i princip motsvarande av Pythagoras sats i 3D.
Kom ihåg att lite tidigare jag berättat att värdena för SQRT(1/2) ~ 0,71 är inte slumpmässigt. Om du ansluter dem formeln ovan, efter att att våra gravitation kraft var 1 g kan vi kontrollera att:
1 ^ 2 = (-SQRT(1/2)) ^ 2 + 0 ^ 2 + (-SQRT(1/2)) ^ 2
helt enkelt genom att ersätta R = 1, Rx = - SQRT(1/2), Ry = 0, Rz =-SQRT(1/2) i Eq.1
Efter en lång ingress teori får vi närmare till verkliga livet accelerometrar. De värden som Rx, Ry, Rz är faktiskt linjärt relaterade till de värden som din verkliga accelerometer kommer ut och som du kan använda för att utföra olika beräkningar.
Innan vi kommer dit låt oss prata lite om hur accelerometrar kommer att leverera denna information till oss. De flesta accelerometrar faller i två kategorier: digitala och analoga. Digital accelerometrar ger dig information med ett seriellt protokoll som I2C, SPI eller USART, medan analoga accelerometrar kommer ut en spänning nivå inom ett fördefinierat intervall som du måste konvertera till ett digitalt värde använder en ADC (analog till digital omvandlare) modul. Jag går inte in i detalj om hur ADC fungerar, dels för att det är ett omfattande ämne och dels för att det är olika från en plattform till en annan. Vissa mikrokontroller har en inbyggd ADC moduler några av dem behöver externa komponenter för att utföra ADC konverteringar. Oavsett vilken typ av ADC modul du använder du kommer att sluta med ett värde i ett visst intervall. För exempel en 10-bitars ADC modul kommer ut ett värde i intervallet 0..1023, Observera att 1023 = 2 ^ 10 -1. En 12-bitars ADC modul kommer utgång ett värde i intervallet 0..4095, Observera att 4095 = 2 ^ 12-1.
Låt oss gå vidare genom att betrakta ett enkelt exempel, anta att vår 10 bitars ADC modul gav oss följande värden för de tre accelerometer kanalerna (axlar):
AdcRx = 586
AdcRy = 630
AdcRz = 561
Varje ADC modul kommer att ha en referens spänning, låt oss anta att i vårt exempel är det 3.3V. Om du vill konvertera en 10 bitars adc värde till spänning använder vi följande formel:
VoltsRx = AdcRx * Vref / 1023
En snabb anteckning här: för 8-bitars ADC senaste delaren att 255 = 2 ^ 8-1, och för 12 bitars ADC senaste divider vore 4095 = 2 ^ 12 -1.
Tillämpning av denna formel på alla 3 kanaler får vi:
VoltsRx = 586 * 3.3V / 1023 = ~ 1.89V (vi runt alla resultat till 2 decimaler)
VoltsRy = 630 * 3.3V / 1023 = ~ 2.03V
VoltsRz = 561 * 3.3V / 1023 = ~ 1.81V
Varje accelerometer har en noll-g spänningsnivån, du hittar den i specs, detta är den spänning som motsvarar 0g. För att få ett signerat spänning värde måste vi beräkna övergången från denna nivå. Låt oss säga våra 0g spänningsnivån är VzeroG = 1.65V. Vi beräkna spänningen skiftar från zero-g spänning så här::
DeltaVoltsRx = 1.89V - 1.65V = 0.24V
DeltaVoltsRy = 2.03V - 1.65V = 0.38V
DeltaVoltsRz = 1.81V - 1.65V = 0.16V
Vi har nu vår accelerometer avläsningar i volt, det är fortfarande inte i g (9,8 m/s ^ 2), att göra slutliga konverteringen tillämpar vi accelerometer känsligheten, vanligen uttryckt i mV/g. kan säga vår känslighet = 478.5mV / g = 0.4785V / g. känslighet värden finns i accelerometer specifikationer. Slutliga kraft värden uttryckt i g använder vi följande formel:
RX = DeltaVoltsRx / känslighet
RX = 0.24V / 0.4785V / g = ~ 0,5 g
Ry = 0.38V / 0.4785V / g = ~ 0,79 g
RZ = 0.16V / 0.4785V / g = ~ 0,33 g
Vi kan naturligtvis kombinera alla steg i en formel, men jag gick igenom alla steg för att klargöra hur du går från ADC avläsningar till en force vector komponent uttryckt i g.
RX = (AdcRx * Vref / 1023 - VzeroG) / känslighet (Eq.2)
Ry = (AdcRy * Vref / 1023 - VzeroG) / känslighet
RZ = (AdcRz * Vref / 1023 - VzeroG) / känslighet
Vi har nu alla 3 komponenter som definierar våra tröghetsbaserad force vector, om enheten inte är föremål för andra krafter än gravitation, vi kan anta detta är riktningen av våra gravitation force vector. Om du vill beräkna lutningen på enheten i förhållande till marken kan du beräkna vinkeln mellan denna vektor- och Z-axeln. Om du är också intresserad av per-axel riktning av lutning kan du dela upp detta resultat i 2 delar: lutning på X- och Y-axeln som kan beräknas som vinkeln mellan gravitation vektor och X / Y-axlarna. Beräkningen av dessa vinklar är enklare än du kanske tror, nu när vi har beräknas värdena för Rx, Ry och Rz. Låt oss gå tillbaka till vår sista accelerometer modell och gör några ytterligare anteckningar:
Vinklarna som vi är intresserade av är vinklarna mellan X, Y, Z-axlar och force vector R. Vi ska definiera dessa vinklar som Axr, Ayr, Azr. Du kan märka från en rätvinklig triangel som utgörs av R och Rx som:
cos(AXR) = Rx / R, och på samma sätt:
cos(Ayr) = Ry / R
cos(AZR) = Rz / R
Vi kan dra av från Eq.1 att R = SQRT (Rx ^ 2 + Ry ^ 2 + Rz ^ 2).
Vi kan nu hitta våra vinklar med hjälp av arccos() funktion (inverterad cos() funktion):
AXR = arccos(Rx/R)
Ayr = arccos(Ry/R)
AZR = arccos(Rz/R)
Vi har gått långt för att förklara den accelerometer modellen, bara för att komma upp till dessa formler. Beroende på dina program kan du använda alla mellanliggande formler som vi har härlett. Kommer vi också att introducera gyroskop modellen snart och vi får se hur accelerometer och gyroskop data kan kombineras för att ge ännu mer exakt lutning anseende.
Men innan vi gör det låt oss göra några mer användbara anteckningar:
cosX = cos(Axr) = Rx / R
Mysig = cos(Ayr) = Ry / R
cosZ = cos(Azr) = Rz / R
Här triplett kallas brukar Riktning cosinus och det representerar i grunden enhet vektorn (vektor med längden 1) som har samma riktning som vår R vektor. Du kan enkelt kontrollera att:
SQRT (cosX ^ 2 + mysig ^ 2 + cosZ ^ 2) = 1
Detta är en trevlig egenskap eftersom det befriar oss från övervakning modulus(length) av R vektor. Ofta om vi är bara intresserad av riktningen av våra tröghetsbaserad vektor, är det vettigt att normalisera det är modul för att förenkla andra beräkningar.