Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:adc-to-matlab

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
2014:adc-to-matlab [2015/01/18 11:39]
Jan Novotný [Program pro mikrokontrolér]
2014:adc-to-matlab [2015/01/18 21:22] (aktuální)
Jan Novotný [Výsledky]
Řádek 11: Řádek 11:
   *Periferie USB_OTG   *Periferie USB_OTG
 ====A/D převodník==== ====A/D převodník====
-Mikrokontrolér STM32F429ZIT nabízí tři vnitřní 12-bitové analogově-digitální převodníky,​ z nichž zde jsou využity dva, a to ADC1 a ADC2, každý pro vzorkování jednoho vstupního analogového kanálu. Přenos digitalizovaných dat do paměti je řešen přes DMA pro dosažení co největší rychlosti. Převodníky jsou nastaveny do tzv. Multimode Interleaved módu (prokládaný režim). Ten spočívá v tom, že výstupem každého převodníku jsou 16-bitová slova, ta jsou pak složena do 32-bitového slova, které je posláno přes DMA do paměti. 16-bitová slova jsou do 32-bitového slova organizována tak, že v horních 16 bitů obsahuje data z převodníku ADC2, spodních 16 bitů obsahuje data z převodníku ADC1. Tuto situaci znázorňuje následující obrázek:+Mikrokontrolér STM32F429ZIT nabízí tři vnitřní 12-bitové analogově-digitální převodníky,​ z nichž zde jsou využity dva, a to ADC1 a ADC2, každý pro vzorkování jednoho vstupního analogového kanálu. Přenos digitalizovaných dat do paměti je řešen přes DMA pro dosažení co největší rychlosti. Převodníky jsou nastaveny do tzv. Multimode Interleaved módu (prokládaný režim). Ten spočívá v tom, že výstupem každého převodníku jsou 16-bitová slova, ta jsou pak složena do 32-bitového slova, které je posláno přes DMA do paměti. 16-bitová slova jsou do 32-bitového slova organizována tak, že v horních 16 bitů obsahuje data z převodníku ADC2 (kanál č. 2), spodních 16 bitů obsahuje data z převodníku ADC1 (kanál č. 1). Tuto situaci znázorňuje následující obrázek:
 {{ :​2014:​adc-to-matlab:​ADC_reg.jpg?​650 |Seřazení výstupních registrů A/D převodníků v prokládaném režimu}} {{ :​2014:​adc-to-matlab:​ADC_reg.jpg?​650 |Seřazení výstupních registrů A/D převodníků v prokládaném režimu}}
 ====Kontrolér DMA==== ====Kontrolér DMA====
Řádek 119: Řádek 119:
 s = serial('​COM5'​);​ s = serial('​COM5'​);​
 set(s, '​InputBufferSize',​ 150000); set(s, '​InputBufferSize',​ 150000);
-set(s, '​Timeout', ​5);+set(s, '​Timeout', ​10);
 set(s, '​DataBits',​ 8); set(s, '​DataBits',​ 8);
 fopen(s); fopen(s);
  
-len_bytes = fread(s,4); +len_bytes = fread(s,1,'​uint32'​); 
-len_data = len_bytes(1) + (2^8)*len_bytes(2) + (2^16)*len_bytes(3) + (2^24)*len_bytes(4); + 
-data = fread(s,len_data);+data_16b ​= fread(s,len_bytes/​2,'​uint16'​);
  
 fclose(s); fclose(s);
Řádek 131: Řádek 131:
 clear s; clear s;
  
-k=1; 
-for l=1:​2:​length(data) 
-    data_16b(k) = data(l) + 256*data(l+1);​ 
-    k = k+1; 
-end; 
-length(data_16b) 
 matrix_16b = reshape(data_16b,​2,​(length(data_16b)/​2));​ matrix_16b = reshape(data_16b,​2,​(length(data_16b)/​2));​
    
Řádek 162: Řádek 156:
 </​code>​ </​code>​
  
-Funkce nejprve vyčistí pracovní plochu programu MATLAB, vytvoří spojení s příslušným sériovým portem (zde COM5), nastaví parametry přenosu, tj. velikost vstupního zásobníku pro přijatá data, čas, po kterém je spojení automaticky uzavřeno a počet bitů každého přijatého znaku (čísla). Poté jsou z portu přečteny ​bajty udávající délku přijatých dat v bajtech. Délka je pak z hodnot těchto čtyř bajtů vypočtena. Následně jsou samotná data ze sériového portu načtena do proměnné ''​data''​ a spojení je ukončeno a zrušeno. Z této proměnné obsahující osmibitová data je pak vytvořena nová proměnná ''​data_16b'',​ ve které jsou osmibitová data sdružena po dvojicích do 16-bitových slov. Proměnná ''​data_16b''​ je pak zpracována tak, aby se od sebe oddělily oba kanály, a to změnou na dvouřádkovou matici, kde první řádek obsahuje liché pozice a druhý řádek sudé pozice původní proměnné. ​Tento poměrně komplikovaný postup ​je nutnýprotože navzorkovaná data jsou přes USB posílána po bajtech a to tak, že první ​bajty představují jeden kanál, druhé ​bajty druhý kanál atd. Tuto situaci naznačuje níže uvedený obrázek. Na závěr funkce už následuje pouze vytvoření časové osy a vykreslení obou kanálů, před kterým je ještě proveden přepočet velikostí vzorků na okamžitá napětí.+Funkce nejprve vyčistí pracovní plochu programu MATLAB, vytvoří spojení s příslušným sériovým portem (zde COM5), nastaví parametry přenosu, tj. velikost vstupního zásobníku pro přijatá data, čas, po kterém je spojení automaticky uzavřenoa počet bitů každého přijatého znaku (čísla). Poté jsou z portu do 32-bitové proměnné ​přečteny ​čtyři ​bajty udávající délku přijatých dat v bajtech. Následně jsou samotná data ze sériového portu načtena do proměnné ''​data_16b''​ a spojení je ukončeno a zrušeno. Proměnná ''​data_16b''​ je pak zpracována tak, aby se od sebe oddělily oba kanály, a to změnou na dvouřádkovou matici, kde první řádek obsahuje liché pozice a druhý řádek sudé pozice původní proměnné. ​Pro úplnost ​je třeba zmínit, že navzorkovaná data jsou přes USB posílána po bajtech a to tak, že první ​dva bajty představují jeden kanál, druhé ​dva bajty druhý kanál atd. Tuto situaci naznačuje níže uvedený obrázek. Na závěr funkce už následuje pouze vytvoření časové osy a vykreslení obou kanálů, před kterým je ještě proveden přepočet velikostí vzorků na okamžitá napětí.
 {{ :​2014:​adc-to-matlab:​usb_razeni.png?​650 |Formát odesílání dat přes USB do počítače}} {{ :​2014:​adc-to-matlab:​usb_razeni.png?​650 |Formát odesílání dat přes USB do počítače}}
 ---- ----
Řádek 172: Řádek 166:
  
  
-Na následujícím videu lze vidět navzorkování signálu. Nejprve se v MATLABu spustí funkce ''​Serial_2channel()''​ a pak se na Discovery kitu stiskne modré tlačítko, čímž se provede navzorkování a odeslání dat. Dokončení tohoto procesu je indikováno rozsvícením zelené LED diody a výsledné průběhy se pak objeví v grafu v MATLABu. +Na následujícím videu lze vidět navzorkování signálu. Nejprve se v MATLABu spustí funkce ''​Serial_2channel()''​ a pak se na Discovery kitu stiskne modré tlačítko, čímž se provede navzorkování a odeslání dat. Dokončení tohoto procesu je indikováno rozsvícením zelené LED diody a výsledné průběhy se pak objeví v grafu v MATLABu. Bohužel kvalita videa není dobrá, protože nebyl k dispozici přístroj poskytující dostatečnou kvalitu záznamu
-{{youtube>​1hZj2ThIF-E?​medium}}+{{ youtube>​1hZj2ThIF-E?​medium }}
 ---- ----
 =====Závěr===== =====Závěr=====
-Celkově je možno říci, že zadání se podařilo splnit. Vznikl dvoukanálový vzorkovač, který by teoreticky mohl být schopen vzorkovat signály až do kmitočtu 1MHz (A/D převodníky vzorkují s rychlostí 2,4 milionu vzorků za sekundu). Prakticky bude tato hodnota zřejmě nižší, ale vzhledem k určení vzorkovače by postačovala schopnost vzorkovat signály do kmitočtu 640kHz. Předností vzorkovače je využití periferie DMA, což celý proces přenosu ​zrychluje. Přenos navzorkovaných dat do PC také funguje velmi dobře, ​z tohoto hlediska by však bylo ještě dobré vylepšit některé části programu v MATLABu, které ​se však týkají spíše čistoty kódu než jeho funkčnosti.+Celkově je možno říci, že zadání se podařilo splnit. Vznikl dvoukanálový vzorkovač, který by teoreticky mohl být schopen vzorkovat signály až do kmitočtu 1MHz (A/D převodníky vzorkují s rychlostí 2,4 milionu vzorků za sekundu). Prakticky bude tato hodnota zřejmě nižší, ale vzhledem k určení vzorkovače by postačovala schopnost vzorkovat signály do kmitočtu 640kHz. Předností vzorkovače je využití periferie DMA, což zrychluje ​celý proces přenosu ​dat. Přenos navzorkovaných dat do počítače a jejich vykreslení ​také funguje velmi dobře, ​díky vestavěným funkcím ​MATLABu, které ​např. umožňují ​čtení dat ze sériového portu ve zvoleném formátu, není třeba data nějak výrazněji upravovat nebo přeskládávat,​ což přispívá k přehlednosti kódu.
2014/adc-to-matlab.1421577568.txt.gz · Poslední úprava: 2015/01/18 11:39 autor: Jan Novotný