Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2017:vib-analysis

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2017:vib-analysis [2018/01/13 11:11]
Ondřej Fišer
2017:vib-analysis [2018/01/14 11:22] (aktuální)
Ondřej Fišer
Řádek 17: Řádek 17:
 {{ :​2017:​vibro_fiser:​schema_predzes.png?​600 |}} {{ :​2017:​vibro_fiser:​schema_predzes.png?​600 |}}
 ====== SW řešení ====== ====== SW řešení ======
-Prvním blokem je vlastní AD převodník. Prvním problémem, který bylo nutné vyřešit bylo periodické vzorkování a přepínání převodník mezi sebou v případě vysoké nebo nízké vstupní úrovně signálu. Periodické vzorkování je řešeno tak, že časovač Timer2 přetéká každých 10 us a tím spustí jeden převod AD převodníku. Tím je zajištěna vzorkovací frekvence 100 kHz. Následně po dokončení převodu nastává další přerušení a data se z převodníku vyčtou (není použito DMA). Přepínání převodníků mezi sebou je řešeno tak, že v proměnné je držena minimální a maximální hodnota vstupních vzorků a kdykoliv během měření dojde k překročení limitu hladin 96 nebo 4000 je převodník vypnut a zapnut další s menším zesílením. Naopak pokud je signál příliš malý tak dojde po skončení periody k přepnutí převodníku s vyšším zesílením. ​ 
- 
 **Ovládací software a jeho hlavní části popisuje následující obrázek:** **Ovládací software a jeho hlavní části popisuje následující obrázek:**
 {{ :​2017:​vibro_fiser:​blokacsw.png?​600 |}} {{ :​2017:​vibro_fiser:​blokacsw.png?​600 |}}
-  +===== AD převodník ===== 
-{{ :​2017:​vibro_fiser:​cubemx.png?600 |}}+Prvním blokem je vlastní AD převodník. Prvním problémem, který bylo nutné vyřešit bylo periodické vzorkování a přepínání převodník mezi sebou v případě vysoké nebo nízké vstupní úrovně signálu. Periodické vzorkování je řešeno tak, že časovač Timer2 přetéká každých 10 us a tím spustí jeden převod 12ti bitového AD převodníku. Tím je zajištěna vzorkovací frekvence 100 kHz. Následně po dokončení převodu nastává další přerušení a data se z převodníku vyčtou (není použito DMA). Přepínání převodníků mezi sebou je řešeno tak, že v proměnné je držena minimální a maximální hodnota vstupních vzorků a kdykoliv během měření dojde k překročení limitu hladin 96 nebo 4000 je převodník vypnut a zapnut další s menším zesílením. Naopak pokud je signál příliš malý tak dojde po skončení periody k přepnutí převodníku s vyšším zesílením.  
 + 
 +**Obsluha okamžitého přepínání AD převodníků:​** 
 +<code c> 
 + ​if(maximumADC<​adcVal) maximumADC=adcVal;​ 
 + ​if(minimumADC>​adcVal) minimumADC=adcVal;​ 
 + ​if((adcSET==1)&&​((maximumADC>​4000)||(minimumADC<​96))) 
 +     { 
 +         ​maximumADC=2048;​ 
 +        HAL_ADC_Stop(&​hadc1);​ 
 +        HAL_ADC_Start_IT(&​hadc2);​ 
 +        adcSET=2; 
 +     } 
 +if((adcSET==2)&&​((maximumADC>​4000)||(minimumADC<​96))) 
 +     { 
 +         ​maximumADC=2048;​ 
 +        HAL_ADC_Stop(&​hadc2);​ 
 +        HAL_ADC_Start_IT(&​hadc3);​ 
 +        adcSET=3; 
 +     } 
 +</​code>​ 
 +===== IIR filtr ===== 
 +Následuje blok IIR filtru, tento blok může částečně kompenzovat rezonanční křivku akcelerometru a zvětšit tak šířku pásma ve kterém zařízení může měřit. Zdrojový kód vychází z následujícího obrázku rovnic, dále je z něj patrné že je tento filtr rozdělen do dvou bloků. Koeficienty byly vygenerovány pomocí programu Matlab. 
 +{{ :​2017:​vibro_fiser:​df2graf.png?​400 |}}{{ :​2017:​vibro_fiser:​df2diff2.png?​400 |}} 
 + 
 +**Zdrojový kód IIR filtru složeného ze dvou bloků:** 
 +<code c> 
 +uint16_t IIR( float coef[][5], uint16_t ADCval) 
 +
 +         static double v1[2]; 
 + static double v2[2]; 
 + static double accu; 
 + static double y[2]; 
 + static double vn1; 
 + accu=sample/​2+coef[0][2]*v1[0]+coef[0][4]*v2[0];​ 
 + vn1 = 2* accu; 
 + accu=coef[0][0]*vn1+coef[0][1]*v1[0]+coef[0][3]*v2[0];​ 
 + y[0]=2*accu;​ 
 + 
 + v2[0]=v1[0];​ 
 + v1[0]=vn1;​ 
 + 
 + accu=y[0]/​2+coef[1][2]*v1[1]+coef[1][4]*v2[1];​ 
 + vn1 = 2* accu; 
 + accu=coef[1][0]*vn1+coef[1][1]*v1[1]+coef[1][3]*v2[1];​ 
 + y[1]=2*accu;​ 
 + 
 + v2[1]=v1[1];​ 
 + v1[1]=vn1;​ 
 + 
 + sample=y[1];​ 
 + 
 +  return( sample); 
 +
 +</​code>​ 
 +===== Numerická integrace ===== 
 +Část numerické integrace je tvořena prostým sumováním vzorkům z AD převodníku (přepočítaných na reálnou hodnotu po zesílení danou větví). Po každé periodě signálu dojde k vynulování integrační proměnné, tak aby nedošlo vlivem šumu (více v kapitole Závěr) "​ujetí"​ hodnoty po integrování směrem k nekonečnu. 
 + 
 +**Simulace integrování v programu Matlab:** 
 +{{ :​2017:​vibro_fiser:​integrace.png?600 |}} 
 +Vlevo je originální sinusový signál, vpravo je signál po integraci. 
 +===== SD karta ===== 
 +Čtečka SD karet je připojena pomocí 1 bitové datové sběrnice k rozhraní SDIO. Rozhraní běží na kmitočtu 24 MHz a v softwarové implementaci je využito knihovny fatfs.h pro obsluhu práce SD kartou a souborovým systémem FAT32.  
 + 
 +**Zdrojový kód obsluhy práce s SD kartou:** 
 +<code c> 
 +if(BSP_SD_Init()==MSD_OK) 
 +
 +fresult=f_mount(&​fatfs,"",​1);​ 
 +fresult=f_open(&​myfile,"​vibro.dat",​FA_CREATE_ALWAYS|FA_WRITE);​ 
 +sprintf((char*)buffer,"​%d;​%f;​%f",​vzorek,​realADC,​Integrace);​ 
 +f_printf(&​myfile,​(const char*)buffer);​ 
 +f_close(&​myfile);​ 
 +
 +</​code>​ 
 +===== Konfigurace STM32CubeMX ===== 
 +Inicializační kódy jsou vygenerovány ve studiu STM32CubeMX. Hodiny jsou nakonfigurovány tak aby procesor pracoval na nejvyšších možných kmitočtech. V tomto projektu jsou využity následující periferie: ADC1, ADC2, ADC3, RCC, SDIO, TIM2, USART2. Middleware je využita pouze pouze knihovna FATFS. 
 + 
 +**Mapování pinů a konfigrace hodiny mikrokontroléru:​** 
 +{{ :​2017:​vibro_fiser:​cubemx.png?​800 |}} 
 + 
 +====== Závěr ====== 
 +V rámci tohoto projektu byla realizována deska předzesilovačů pro akcelerometr ADXL1002. Dále bylo implementováno periodické vzorkování AD převodníků,​ jejich přepínání podle úrovně signálu, IIR filtr a integrování vstupního signálu. Vstupy AD převodníků jsou zatížené poměrně vysokým šumem, který je způsobený nevhodným napájením analogové části (včetně referenčního vstupu) mikrokontroléru. Toto napájení je spojené s digitálním napájením,​ stejně tak není oddělená analogová a digitální zem. Pokud by byla vhodně řešeno zapojení země a referenční vstup by byl spojen s napájecím napětím akcelerometru,​ tak by se přesnost měření celkově zlepšila a nebylo by nutné nulovat integrační proměnnou po každé periodě. 
 +Průběžné výsledky zpracování signálu je možné sledovat na UARTu nebo na SD kartě. 
 + 
 +FFT analýza nebyla z časových důvodů implementována. Další práce bude spočívat v implementaci FFT analýzi (vysoké rozlišení bude pravděpodobně vyžadovat větší externí RAM paměť) a implementaci FreeRTOS pro jednodušší práci s dalšími periferiemi (RS485-ModBUS,​ OLED display, teplotní čidla atd.).
  
 +Použitá vývojová prostředí:​ Embitz, STM32CubeMX,​ Matlab
  
2017/vib-analysis.1515838293.txt.gz · Poslední úprava: 2018/01/13 11:11 autor: Ondřej Fišer