Tuesday 17 October 2017

Flytting Gjennomsnitt Filter Akselerometer


Et enkelt, enkeltpolet, lavpass, rekursivt IIR-filter er raskt og enkelt å implementere, f. eks. hvor x, y er de røde (ufiltrerte) XY-akselerometer-signaler, xf, yf er de filtrerte utgangssignalene, og k bestemmer filterets tidskonstant (typisk en verdi mellom 0,9 og 0,9999. hvor en større k betyr en lengre tidskonstant ). Du kan bestemme k empirisk, eller hvis du kjenner din nødvendige avskjæringsfrekvens, Fc. så kan du bruke formelen: hvor Fs er samplingsfrekvensen. Merk at xf, yf er de tidligere verdiene for utgangssignalet på RHS, og de nye utgangsvurderingene på LHS i uttrykket ovenfor. Vær også oppmerksom på at vi antar her at du vil samle akselerometersignalene med jevne mellomrom, f. eks. hver 10 ms. Tidskonstanten vil være en funksjon både k og dette samplingsintervallet. Gjennomsnittlig filter Dette eksempelet viser den anbefalte arbeidsflyten for å generere C-kode fra en MATLAB-funksjon ved hjelp av codegen-kommandoen. Dette er trinnene: 1. Legg kodedirektivet til MATLAB-funksjonen for å indikere at den er beregnet for kodegenerering. Dette direktivet gjør det også mulig for MATLAB-kodeanalysatoren å identifisere advarsler og feil spesifikke for MATLAB for kodegenerering. 2. Generer en MEX-funksjon for å kontrollere at MATLAB-koden er egnet for kodegenerering. Hvis det oppstår feil, bør du fikse dem før du genererer C-kode. 3. Test MEX-funksjonen i MATLAB for å sikre at den er funksjonelt ekvivalent med den originale MATLAB-koden, og at det ikke oppstår run-time-feil. 4. Generer C-kode. 5. Kontroller C-koden. Forutsetninger Det er ingen forutsetninger for dette eksemplet. Opprett en ny mappe og kopier relevante filer Følgende kode vil opprette en mappe i din nåværende arbeidsmappe (pwd). Den nye mappen inneholder bare de filene som er relevante for dette eksemplet. Hvis du ikke vil påvirke gjeldende mappe (eller hvis du ikke kan generere filer i denne mappen), bør du endre arbeidsmappen din. Kjør kommando: Opprett en ny mappe og kopier Relevante filer Om gjennomsnittsfiltreringsfunksjon Funksjonen averagingfilter. m fungerer som et gjennomsnittsfilter på inngangssignalet som tar en inngangsvektor av verdier og beregner et gjennomsnitt for hver verdi i vektoren. Utgangsvektoren har samme størrelse og form som inngangsvektoren. Direktivet for kodegruppe indikerer at MATLAB-koden er beregnet for kodegenerering. Lag noen eksempler Data Generer en støyende sinusbølge og plott resultatet. Generer en MEX-funksjon for testing Generer en MEX-funksjon ved hjelp av codegen-kommandoen. Codegen-kommandoen kontrollerer at MATLAB-funksjonen er egnet for kodegenerering og genererer en MEX-funksjon som du kan teste i MATLAB før du genererer C-kode. Fordi C bruker statisk typing, må kodegen bestemme egenskapene til alle variabler i MATLAB-filene på kompileringstiden. Her leverer kommandolinjevalg-kommandoen et eksempelinngang, slik at kodegen kan utlede nye typer basert på inngangstyper. Ved å bruke prøvesignalet som er opprettet ovenfor som eksempelinngangen, sikrer at MEX-funksjonen kan bruke samme inngang. Som standard genererer kodegen en MEX-funksjon som heter averagingfiltermex i den nåværende mappen. Dette lar deg teste MATLAB-koden og MEX-funksjonen og sammenligne resultatene. Test MEX-funksjonen i MATLAB Kjør MEX-funksjonen i MATLAB Generer C-kode Kontroller generert kode Kommandoen codegen med - konfig coder. config (lib) - alternativet genererer C-kode pakket som et frittstående C-bibliotek. Den genererte C-koden finnes i mappen codegenlibaveragingfilter. Filene er: Kontroller C-koden for gjennomsnittlig filter. c Funksjon Velg landAccelerometer Accelerometer måler akselerasjon. Det er akselerasjon på grunn av bevegelse og også akselerasjon på grunn av tyngdekraften. Accelerometre brukes ofte til å beregne en vippevinkel. De kan bare gjøre dette pålitelig når de er statiske og ikke beveger seg. For å få en nøyaktig vinklingsvinkel, blir de ofte kombinert med en eller flere gyro39s, og kombinasjonen av data brukes til å beregne vinkelen. Digitale akselerometre gir deg informasjon ved hjelp av en seriell protokoll som I2C. SPI eller USART, mens analoge akselerometre gir et spenningsnivå innenfor et forhåndsdefinert område som du må konvertere til en digital verdi ved hjelp av en ADC (analog til digital omformer) - modul. I denne opplæringen vil vi kort forklare funksjonaliteten til akselerometre, hvordan de brukes til å måle vippevinkler og til slutt gi noen eksempler på kode. Se også veiledningen om å kombinere akselerometer og gyro-data for å gi en bedre tiltvinkel for et dynamisk system. Hva måler en akselerometermåling Accelerometre akselerasjon. For et statisk objekt som er akselerasjonen på grunn av tyngdekraften (1g). Legg også merke til at utgangen fra akselerometer ikke er lineær, men er en sinusbølge, slik at du ikke kan ta direkte utgang som en proporsjonal representasjon av en vinklingsvinkel basert på tyngdekraften. Normalt vil en akselerator39s x - og y-utgangsspenninger være halv av forsyningsspenningen ved måling av null g (dvs. enheten er vinkelrett på tyngdekraften - horisontal). Kant det på en måte, og spenningen vil øke, vippe den den andre veien, og den vil senke. Med et akselerometer på tre akser vil z-aksen måle 1g med enheten horisontal. Utgangen av en akselerometer er en sinusbølge av akselerasjonen målt. Accelerometre er mer følsomme for små endringer i tilt når de er vinkelrett på tyngdekraften. Dvs. når horisontale, små endringer i tilt gir nyttige målinger. Tidligere om 45 grader av tilt blir de stadig mindre følsomme. Av denne grunn er det vanlig å bruke mer enn en akseverdi ved å bestemme vinklingsvinkelen som det vil bli sett under. Målevinkelvinkel ved hjelp av en akse Hvis du vil måle tilt i både x og y-aksen med et 2-akset akselerometer, kan du bare bruke sin-1 (a) hvor a er utgangen fra aksen på akselerometeret. Husk at over 45 og -45 grader vil nøyaktigheten redusere målevinkelen med to akse. Reduksjonen i oppløsning og nøyaktighet utover 45 grader av tilt kan forbedres ved å bruke 2 akse for å måle vippen. Gravitasjonselementet som virker på x-aksen, er en sinusfunksjon mens det som skjer på y-aksen er en cosinus. Når følsomheten til x-aksen begynner å slippe av etter 45 grader av tilt, øker følsomheten til y-aksen. Som det fremgår av diagrammet nedenfor, viser de dristige delene av hver linje området med mest følsomhet. Således ved å kombinere x - og y-verdiene, kan en mye bedre nøyaktighet oppnås. Målevinkler ved hjelp av treakse For nøyaktige målinger av tilt i x - og y-flyene trenger vi derfor et 3-aksers akselerometer. Vi kunne bruke formelen ovenfor til å beregne vinklene ved å bruke x og z for x-aksen og bruke y og z for y-aksen. Men vi kan forbedre ting ytterligere ved å bruke alle tre utgangene til å beregne hver vinkel. Dette gjøres ved å bruke følgende formler. La oss komme til noen koding Forhåpentligvis er vi nå ganske klare om prinsippene, men vi kan se hvordan dette gjøres i praksis. Vi vil bruke et aksel akselerometer på 3 akser og utarbeide vinkler for rulle (x) og tonehøyde (y). Vi antar at avhengig av hvilken type akselerometer du har brukt, har du lest verdiene for x, y og z, og at du også har basisverdier for x, y og z når akselerometeret er stasjonært og nivå. tomrom kalkoksangler (tomrom) Bruk xy og z fra akselerometer, beregne x og y vinkler float xval, yval, zval, resultat usignert kort lang x2, y2, z2 24 bit Lar oss få avvikene fra vår grunnlinje xval (float) accelvaluex - ) xx (ukjent kort lang) (xvalxval) y2 (usignert kort lang) (yvalyval) z2 (usignert kort lang) (zvalzval) X Axis resultsqrt (y2z2) resultxvalresultat accelanglex atan (resultat) Y Axis resultsqrt (x2z2) resultyvalresultat accelangley atan (result) Ok, det er det. Bare et par notater om akselerometre generelt. De er svært følsomme og er derfor ganske utsatt for vibrasjon. Hvis du bruker en i et system med motorer eller andre kilder til vibrasjon, foreslår jeg sterkt noen form for skumdemping. Ta også flere avlesninger fra akselerometeret og gjennomsnitts dem for å filtrere ut eventuelle støy.

No comments:

Post a Comment