Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
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 | ||