Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2017:fn-generator

Funkční generátor

Vypracoval: Martin Lelek


Zadání

Na vhodné architektuře (STM32F407) implementujte algoritmus schopný přes DA převodník generovat základní funkční signály v pásmu minimálně do 50kHz (AUDIO). Generátor umožní regulovat kmitočet, amplitudu a stejnosměrný offset výstupního signálu. Dále implementujte vhodné ovládání (LCD, tlačítka, rotační kodér apod.) pro pohodlné řízení generátoru. Pro FW procesoru realizujte vhodnou HW nadstavbu s potřebnými analogovými obvody včetně napájení.


Úvod

Jedná se o prototyp generátoru určeného pro generování signálů sinus, pila a obdélník. Rozlišení použitého DA převodníku činí 16 bitů, komunikace probíhá skrz sběrnici SPI pomocí tří vodičů. Generátor umožňuje regulaci amplitudy a stejnosměrného offsetu. Regulace těchto dvou parametrů je zprostředkována dvojicí digitálních potenciometrů. Potenciometry mají rozlišení 8 bitů, umožňují u obou parametrů regulační krok 2 mV.

Analogový front-end včetně ovládací nadstavby a kompletního napájení byl realizován jako samostatná deska plošných spojů umožňující nasunutí na vývojový kit STM32F407 Discovery.


Hardware

Generátor je realizován s pomocí vývojového kitu STM32F407 Discovery. Kit vyrábí dobře známá firma ST Microelectronics. Jedná se o vývojový kit osazený procesorem STM32F407, jež je založen na jádru ARM Cortex M4. Jádro je schopno běžet na kmitočtu 168 MHz. Procesor disponuje vysokým počtem GPIO a dostatečně velkou pamětí RAM a FLASH.

Ovládání

Rozšiřující modul pro zmíněný vývojový kit je osazen běžným alfanumerickým LCD o rozměrech 2×16 znaků s klasickým řadičem HD44780. Po pravé straně LCD jsou rozmístěny do kříže čtyři tlačítka sloužící pro ovládání. Displej je napojen svými datovými vstupy na prvním osm GPIO portu A, řízení pak probíhá pomocí pinů PC5 (RS), PC6 (RW) a PC7 (EN). Tlačítka jsou napojena na GPIO PD0 - PD3.

Napájení

Napájení modulu je realizováno z 5V a 3V3 sběrnice, které jsou na vývojovém kitu zdvojeně vyvedeny společně s GND na prvních šest pinů lišty P2. Větev 3V3 je využita pro napájení logických sekcí použitých integrovaných obvodů, větev 5V pak přímo pro napájení použité LCD, jež toto napájení vyžaduje, logické hodnoty datových pinů jsou však s větví 3V3 kompatibilní, propojení s MCU na vývojovém kitu tedy nepředstavuje potíže.

Analogová část vyžaduje symetrické napájení +-5V, dále pak referenční napětí +-2,5V. Záporné napájecí napětí -5V je získáváné z kladné větve 5V pomocí známého měniče 34063 fy ON Semi. Měnič invertující topologii umožňuje, pracovní kmitočet měniče se na výstupu celého zařízení nijak neprojevuje, neboť použité obvody mají poměrně vysoký PSRR.

Referenční napětí +-2,5V je ze symetrických 5V větví získáváno pomocí komplementární dvojice lineárních nízkošumových stabilizátorů LM317 a LM337 v pouzdru TO92. Z důvodu nedostatku zbožíčka v obchodu GME na Náměstí svobody v Brně byly však v prototypu pro tato referenční napětí použity obvody TL431, jež bez přidaného děliče slouží jako Zenerovy diody s potřebným napětím. Potřebné předřadné rezistory 82R byly na již vyrobené DPS dobastleny.

D/A

Jako DA převodník byl ze šuplíkových zásob vybrán obvod AD5260 fy Analog Devices. Jedná se o převodník komunikující po sběrnici SPI pomocí tří vodičů (jednosměrná komunikace). Převodník disponuje rozlišením 16b, má vnitřně separovanou digitální a analogovou část. Digitální část je napájena z větvě 3V3, analogová pak z větve 5V. Převodník umožňuje na výstupu dosáhnout napětí až 4V, jako (samostatná) reference byl zvolen obvod TL431 nastavený na 2,5V, což je hodnota udávající peak - peak napětí výstupu AD převodníku. Pin Chip Select je připojen na GPIO PC9, jež je namapovaný na výstup timeru 3. Tento slouží pro generování CS pulzů a pro obsluhu odesílání SPI dat. Pro odesílání dat byla využita sběrnice SPI2 na pinech PB13 (SCK) a PB15 (DATA).

Regulace amplitudy a DC offsetu

Výstup AD převodníku je bufferován pomocí precizního superrychlého RRIO operačního zesilovače ADA4807 též fy Analog Devices. Operační zesilovač má nastavený zisk x2, čímž se dosáhne napětí peak - peak signálu 5V. Zesílený signál je veden na první digitální potenciometr AD5260, též od zmíněné společnosti. Digitální potenciometr AD5260 má opět separovanou digitální a analogovou část, umožňuje symetrické napájení. Digitální část je napájena z větve 3V3, analogová z větve 5V.

Signál z prvního digitálního potenciometru je přes vazební kondenzátor 10uF sloučen s výstupem druhého digitálního potenciometru přes rezistor 10k. Druhý potenciometr má analogovou část napojenou na symetrické větve +-5V, kraje dráhy potenciometru pak vedou na symetrické referenční napětí +-2,5V. Potenciometr v rozsahu referenčního napětí na výstupu reguluje stejnosměrný offset, jež je přičítán k signálu z prvního potenciometru.

Tento sloučený výstup je poté bufferován opět operačním zesilovačem ADA4807, jež je napájen ze symetrických větví +-5V. Operační zesilovač je na výstupu schopen dodat proud až 50mA. Výstup je realizován pomocí reverzního SMA koaxiálního konektoru.

Zmíněný digitální potenciometr AD5260 komunikuje po sběrnici SPI. Disponuje vstupem DI a výstupem DO, potenciometry a jiná zařízení lze na tuto sběrnici serializovat a sloučit tak vstupy Chip Select. Jinak tomu není ani zde - první digitální potenciometr je svým datovým vstupem připojen na SPI sběrnici stejně, jako použitý DA převodník. Na výstup DO tohoto potenciometru je připojen potenciometr druhý, Chip Select piny jsou pak spojeny a ovládány skrz pin PD7.

Kompletní schema zapojení:


Firmware

Firmware generátoru byl psán v Open Source prostředí EmBitz, kostra programu s nastavením periferií byla vytvořena pomocí programu STM32 CubeMX. V tomto programu bylo provedeno nastavení periferie SPI a čítače TIM3 sloužícího pro generování vzorkovacího kmitočtu. Dále byly nastaveny potřebné GPIO piny pro alfanumerickou LCD, čtveřici tlačítek a Chip Select signály digitálních potenciometrů a DA převodníku.

Popis jednotlivých proměnných a maker:

#define SAMps   100000			//definice vzorkovacího kmitočtu
#define N       10000			//počet vzorků na periodu sinusového signálu
static volatile uint8_t necessary = 1;	//flag potřeby aktualizace hodnot digitálních potenciometrů
char buffer[10];			//buffer funkce sprintf()
uint16_t sine_buff[N];			//buffer sinusové funkce
uint16_t frequency = 1000;		//proměnná kmitočtu
uint8_t  pot_buff[2] = {125, 250};   	//proměnné DC offsetu a amplitudy	
uint8_t  func = 1;			//proměnná definující zvolenou funkci
uint8_t  cursor = 0;			//proměnná definující pozici kurzoru
Inicializace

Po spuštění hlavní funkce MAIN dojde k inicializaci veškerých potřebných periferií pomocí funkcí HAL_Init(), SystemClock_Config(), MX_GPIO_Init(), MX_SPI2_Init() a MX_TIM3_Init(). Dále se provede inicializace alfanumerického LCD pomocí uzemnění pinu R/W. Po vypsání uvítací obrazovky „STM32F4“ spolu s „Initialize“ se aktivuje blikající kurzor LCD. Následuje zavolání funkce sine_calc(), která do pole sine_buff() uloží N vzorků jedné periody sinusové funkce:

void sine_calc(void)
{
    uint16_t i = 0;
    float FI = 0;
 
    for(i = 0; i < N; i++)
    {
        FI = (( M_PI* 2)/ N)* i;
 
        sine_buff[i] = ( 16383 *sin( FI)) + 16383;
    }
}

Procesor STM32F407 má dostatek paměti RAM pro pojmutí tohoto pole.

Po vypočtení pole hodnot sinusové funkce se po návratu spustí čítač TIM3 pomocí funkcí HAL_TIM_Base_Start_IT(&htim3) a HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4). Vzorkovací kmitočet činí 100 kHz, je generován jako invertovaný signál PWM se střídou přibližně 3%, po která je tento signál v log. 1. Tímto krátkým pulzem dojde k zapsání dat do vnitřního 24b registru, do kterého byla po SPI tato data předtím vyslána. Sestupnou hranou pulzu je generováno přerušení – volání CallBack funkce pro jeho obsluhu.

Ovládání

Po spuštění čítače je zinicializována obrazovka LCD a vypsány primární hodnoty. Program dále skočí do hlavní smyčky programu, ve které testuje čtyři tlačítka.

Tlačítka doprava a doleva (GPIO_PIN_0 a GPIO_PIN_1) slouží pro posuv kurzoru po LCD, v jejich podmínkách se pouze inkrementuje a dekrementuje hodnota proměnné cursor. Podmínky též obsahují jednoduché odrušení řešené pomocí zpoždění.

Další dvě tlačítka (GPIO_PIN_2 a GPIO_PIN_3) slouží pro nastavení aktuálně zvolené pozice kurzoru. Nastavování na dané pozici je řešeno pomocí funkce switch, jež má jako parametr proměnnou cursor. V první části funkce switch je nastavován kmitočet s ohledem na možné meze, v druhé části je měněna hodnota proměnné func, jež určuje svojí hodnotou typ funkce průběhu (SINE, SAW, SQUARE, ZERO).

Ve třetí a čtvrté části funkce switch je podobným způsobem nastavována hodnota amplitudy a stejnosměrného offsetu. Při změně těchto hodnot dojde k nastavení flagu necessary, jež je zahrnut při odesílání dat v CallBack funkci přerušení čítače TIM3.

CallBack timeru a odesílání dat

Ve funkci CallBack je na základě hodnoty proměnné func rozhodnuto, který daný vzorek bude po sběrnici vyslán ven. Odpovídá-li hodnota proměnné funkci SINE, odesílají se periodicky vzorky z tabulky sine_buff do DA převodníku.

Ten který vzorek má být odeslán, je určeno pomocí jednoduchého výpočtu z vzorkovacího kmitočtu, nastaveného kmitočtu a celkového počtu vzorků na periodu:

case 1:     //SINE
    if( sam_num < ( ( N* 10) - frequency - 10))
    {
        sam_num = sam_num + frequency;
    }
    else
    {
        sam_num = frequency - (( N* 10) - sam_num - 10);
    }
 
    buff[2] = sine_buff[ sam_num/ 10] >> 0;    //LOWER  bits
    buff[1] = sine_buff[ sam_num/ 10] >> 8;    //HIGHER bits
    //buff[0] = 0;
break;

Pro generování funkcí SAW a SQUARE je pro jednoduchost využit výpočet v reálném čase. Na závěr CallBack funkce jsou odesílána data po SPI – buď vzorek do DA převodníku, nebo v případě nastavení flagu necessary pouze data do digitálních potenciometrů.

Funkce out_freq, out_amp a out_dc jsou využity pouze pro vypisování proměnných odpovídajících těmto třem parametrům, podobně funkce set_cursor a put_func.


Závěr

Vynaloženým úsilím se podařilo vytvořit funkční prototyp generátoru sinusového, pilovitého a obdélníkového signálu. Ve firmwaru kontroléru nebyla využita sběrnice DMA pro odesílání SPI dat, byl využit přímo dostupný HAL driver. Toto řešení se ne příliš později projevilo jako fatální v omezení schopností celého zařízení při použitém vzorkovacím kmitočtu a požadovaného kmitočtu signálu na výstupu. Měřením na datových a CS vodičích bylo zjištěno, že tento přístup k SPI periferii zanáší mezi zavoláním funkce pro odeslání dat a samotným odesláním dat z periferie zpoždění přibližně třetinu periody vzorkovacího kmitočtu. Důsledkem tohoto, jelikož jsou odesílány tři bajty dat za sebou, nelze vzorkovací kmitočet již dále zvyšovat. Řešením by bylo použití sběrnice DMA, popřípadě emulované sběrnice SPI.

Dalším opomenutým nešvarem budiž absence rekonstrukčního filtru. Podvědomí autora si nejspíše naivně myslelo, že se sinusovka o kmitočtu 50kHz bude při vzorkovacím kmitočtu 100kHz jevit plynule jako vycházející a zapadající slunce.. Leč byl to omyl a to více než krutý. Tímto opomenutím je relativně dobrá použitelnost prototypu omezena na pásmo do 20kHz, což však pro použití v audio pásmu v podstatě stačí.

Fotografie nasazeného modulu je zde:

ZIP archiv se schematem a PCB v SW Eagle a zdrojovými kódy:

xlelek02_2017_project_mpoa.zip

Krátké video demonstrující funkci:

https://youtu.be/UYy0PPRKk28

2017/fn-generator.txt · Poslední úprava: 2018/01/14 23:56 autor: Martin Lelek