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:30]
Jan Novotný [Použité periferie mikrokontroléru]
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 29: Řádek 29:
 Program je psán v jazyce C ve vývojovém prostředí [[http://​www.emblocks.org/​web/​77-homepage/​24-emblocks-ide-intro|Em::​Blocks 2.30]], ale protože nastavování všech periferií, systémů atd. mikrokontrolérů s jádrem ARM je již poměrně komplikované,​ je velice výhodné použít program [[http://​www.st.com/​web/​en/​catalog/​tools/​PF259242|STM32CubeMX]],​ který umožňuje jednoduše zvolit a nastavit požadované periferie pouhým výběrem v grafickém rozhraní a následně umožňuje vygenerovat kostru kódu pro zvolené vývojové prostředí na základě knihovny HAL (HAL library), která obsahuje většinu potřebných funkcí. Program je psán v jazyce C ve vývojovém prostředí [[http://​www.emblocks.org/​web/​77-homepage/​24-emblocks-ide-intro|Em::​Blocks 2.30]], ale protože nastavování všech periferií, systémů atd. mikrokontrolérů s jádrem ARM je již poměrně komplikované,​ je velice výhodné použít program [[http://​www.st.com/​web/​en/​catalog/​tools/​PF259242|STM32CubeMX]],​ který umožňuje jednoduše zvolit a nastavit požadované periferie pouhým výběrem v grafickém rozhraní a následně umožňuje vygenerovat kostru kódu pro zvolené vývojové prostředí na základě knihovny HAL (HAL library), která obsahuje většinu potřebných funkcí.
  
-Jádro programu tvoří funkce ''​main()'',​ ve které je nejprve inicializována knihovna HAL, hodiny a všechny potřebné periferie. Následně se v nekonečné smyčce testuje, zda došlo k externímu přerušení od stisku tlačítka. Pokud ano, spustí se A/D převod a čeká se, až je nastaven příznak indikující konec převodu. Pokud je nastavený odešlou se získaná data přes USB, ale nejprve jsou poslány ​bajty udávající délku vysílaných dat, což lze s výhodou využít při příjmu dat v programu MATLAB. Následně se vynulují příznaky dokončení převodu a stisku tlačítka. A/D převodníky je pak třeba vypnout, což je nutné pro vynulování všech příznaků v registrech převodníků,​ které by mohly bránit opětovnému spuštění převodu. Program se pak vrací opět na čekání na stisk tlačítka a celý cyklus se opakuje. Jednotlivé příznaky indikující stisk tlačítka dokončení A/D převodu atd. se nastavují v rámci tzv. callback funkcí. Protože knihovna HAL je postavena tak, že každé přerušení volá svou vlastní callback funkci, kterou si uživatel může editovat dle svých potřeb. Pro vyslání dat přes USB je vytvořena funkce ''​VCP_write()'',​ která musí data vysílat po úsecích maximální délky 64 bajtů, což je dáno maximální velikostí paketu endpointu USB. Vývojový diagram programu pro mikrokontrolér a zdrojové kódy klíčových funkcí ''​main()''​ a ''​VCP_write()''​ jsou uvedeny níže.+Jádro programu tvoří funkce ''​main()'',​ ve které je nejprve inicializována knihovna HAL, hodiny a všechny potřebné periferie. Následně se v nekonečné smyčce testuje, zda došlo k externímu přerušení od stisku tlačítka. Pokud ano, spustí se A/D převod a čeká se, až je nastaven příznak indikující konec převodu. Pokud je nastavenýodešlou se získaná data přes USB, ale nejprve jsou poslány ​čtyři ​bajty udávající délku vysílaných dat v bajtech, což lze s výhodou využít při příjmu dat v programu MATLAB. Následně se vynulují příznaky dokončení převodu a stisku tlačítka. A/D převodníky je pak třeba vypnout, což je nutné pro vynulování všech příznaků v registrech převodníků,​ které by mohly bránit opětovnému spuštění převodu. Program se pak vrací opět na čekání na stisk tlačítka a celý cyklus se opakuje. Jednotlivé příznaky indikující stisk tlačítka dokončení A/D převodu atd. se nastavují v rámci tzv. callback funkcí. Protože knihovna HAL je postavena tak, že každé přerušení volá svou vlastní callback funkci, kterou si uživatel může editovat dle svých potřeb. Pro vyslání dat přes USB je vytvořena funkce ''​VCP_write()'',​ která musí data vysílat po úsecích maximální délky 64 bajtů, což je dáno maximální velikostí paketu endpointu USB. Vývojový diagram programu pro mikrokontrolér a zdrojové kódy klíčových funkcí ''​main()''​ a ''​VCP_write()''​ jsou uvedeny níže.
 {{ :​2014:​adc-to-matlab:​vyvojak.png?​450 |Blokové schéma programu pro MCU}} {{ :​2014:​adc-to-matlab:​vyvojak.png?​450 |Blokové schéma programu pro MCU}}
 <code c> <code c>
Řá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.1421577012.txt.gz · Poslední úprava: 2015/01/18 11:30 autor: Jan Novotný