Obsah:

Trojfázový generátor sínusových vĺn založený na Arduine: 5 krokov
Trojfázový generátor sínusových vĺn založený na Arduine: 5 krokov

Video: Trojfázový generátor sínusových vĺn založený na Arduine: 5 krokov

Video: Trojfázový generátor sínusových vĺn založený na Arduine: 5 krokov
Video: Trojfázový generátor 2024, Júl
Anonim
3 -fázový sínusový generátor založený na termíne Arduino
3 -fázový sínusový generátor založený na termíne Arduino

účelom tohto zdieľania je pomôcť niekomu, kto sa pokúša využiť vyšší výkon Due + nedostatok odkazov + užitočný list s údajmi.

tento projekt je schopný generovať až 3 fázové sínusové vlny pri 256 vzorkách / cyklus pri nízkych frekvenciách (<1 kHz) a 16 vzorkách / cyklus pri vysokých frekvenciách (až 20 kHz), čo je dosť dobré na to, aby sa to dalo vyhladiť jednoduchými LPF a výstup je takmer dokonalý.

priložený súbor nebol mojou konečnou verziou, pretože som pridal ďalšiu funkciu, ale jadro je v tom rovnaké. Všimnite si, že vzorky/cyklus boli nastavené nižšie ako vyššie uvedené tvrdenie.

pretože kapacita procesora je maximalizovaná prístupom zobrazeným v priloženom súbore, ako riadiacu jednotku som použil Arduino Uno, ktorý využíva externé prerušenie Arduino Due na prenos hodnoty frekvencie do Arduino Due. Arduino Uno okrem ovládania frekvencie ovláda aj amplitúdu (prostredníctvom digitálneho potenciometra + OpAmp), ako aj I/O --- bude tu veľa miesta na hranie.

Krok 1: Vytvorte pole sínusových údajov

Pretože výpočet v reálnom čase je náročný na procesor, pre lepší výkon je potrebné sínusové dátové pole

uint32_t sin768 PROGMEM =…. medzitým x = [0: 5375]; y = 127+127*(sin (2*pi/5376/*alebo niektoré # preferujete, závisí od požiadavky*/))

Krok 2: Povolenie paralelného výstupu

Na rozdiel od Uno majú Due iba obmedzenú referenciu. Aby však bolo možné generovať 3 -fázovú sínusovú vlnu na základe Arduino Uno, v prvom rade nie je výkon príťažlivý kvôli nízkemu MCLK (16 MHz, zatiaľ čo Due je 84 MHz), 2) je obmedzený, GPIO dokáže produkovať max. 2 fázový výstup a potrebujete ďalšie analógový obvod na výrobu 3. fázy (C = -AB).

Nasledujúce povolenie GPIO bolo väčšinou založené na pokusoch a pokusoch+nie užitočnom technickom liste SAM3X

PIOC-> PIO_PER = 0xFFFFFFFE; // Povolený register PIO PIO Povoliť register (pozri p656 údajového listu ATMEL SAM3X) a https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due pin 33-41 a 44-51 boli povolené

PIOC-> PIO_OER = 0xFFFFFFFE; // Register povolenia výstupu PIO regulátora, pozrite sa na p657 datasheetu ATMEL SAM3X PIOC-> PIO_OSR = 0xFFFFFFFE; // Register stavu výstupu výstupu radiča PIO, pozri p658 údajového listu ATMEL SAM3X

PIOC-> PIO_OWER = 0xFFFFFFFE; // Register PIO výstupu na zapisovanie, pozri p670 údajového listu ATMEL SAM3X

// PIOA-> PIO_PDR = 0x30000000; // voliteľné ako poistenie, nezdá sa, že by to malo vplyv na výkon, digitálny pin 10 sa pripája k PC29 aj PA28, digitálny pin 4 sa pripája k PC29 aj PA28, tu sa deaktivuje vypnutie PIOA #28 a 29

Krok 3: Povolenie prerušenia

Aby sa maximalizoval jeho výkon, zaťaženie procesora by malo byť čo najnižšie. Avšak vzhľadom na korešpondenciu medzi pinom CPU a pinom non-1to1 je bitová operácia potrebná.

Algoritmus môžete ďalej optimalizovať, ale miestnosť je veľmi obmedzená.

neplatný TC7_Handler (prázdny) {TC_GetStatus (TC2, 1);

t = t%vzoriek; // namiesto „if“použite t%vzoriek, aby ste predišli pretečeniu t

phaseAInc = (prednastavené*t)%5376; // použite %5376, aby ste sa vyhli pretečeniu indexu poľa

fázaBInc = (fázaAInc+1792)%5376;

phaseCInc = (phaseAInc+3584)%5376;

p_A = sin768 [phaseAInc] << 1; // pozri PIOC: PC1 až PC8, zodpovedajúci pin Arduino Due: pin 33-40, preto posun vľavo o 1 číslicu

p_B = sin768 [phaseBInc] << 12; // pozri PIOC: PC12 až PC19, zodpovedajúci pin Arduino Due: pin 51-44, preto posun vľavo o 12 číslic

p_C = sin768 [phaseCInc]; // výstup fázy C zamestnanci PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 a PC29, zodpovedajúci Arduino Due pin: digitálny pin: 9, 8, 7, 6, 5, 4, 3, 10, resp.

p_C2 = (p_C & B11000000) << 22; // toto generuje PC28 a PC29

p_C3 = (p_C & B00111111) << 21; // toto generuje PC21-PC26

p_C = p_C2 | p_C3; // toto generuje paralelný výstup fázy C

p_A = p_A | p_B | p_C; // 32 bitový výstup = fáza A (8bit) | fáza B | fáza C

PIOC-> PIO_ODSR = p_A; // výstupný register = p_A

t ++; }

Krok 4: R/2R DAC

stavať 3x8bit R/2R DAC, veľa odkazov na google.

Krok 5: Úplný kód

#define _BV (x) (1 << (x)); uint32_t sin768 PROGMEM = /* x = [0: 5375]; y = 127+127*(hriech (2*pi/5376))*/

uint32_t p_A, p_B, p_C, p_C2, p_C3; // hodnota fázy F fázy B-aj keď je výstup iba 8 bitov, hodnota p_A a p_B bude prevádzkovaná na generovanie novej 32 bitovej hodnoty, aby bolo možné kopírovať s 32 bitovým výstupom PIOC

uint16_t phaseAInc, phaseBInc, phaseCInc, freq, freqNew; uint32_t interval; uint16_t vzorky, prednastavené; uint32_t t = 0;

neplatné nastavenie () {

// Nastavenie PIOC paralelného výstupu: Arduino Due pin33-40 sa používa ako výstup fázy A, zatiaľ čo pin 44-51 pracuje pre výstup fázy B

PIOC-> PIO_PER = 0xFFFFFFFE; // Povolený register PIO PIO Povoliť register (pozri p656 údajového listu ATMEL SAM3X) a https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due pin 33-41 a 44-51 boli povolené

PIOC-> PIO_OER = 0xFFFFFFFE; // Zaregistrujte výstup PIO radiča, pozrite si p657 z technického listu ATMEL SAM3X

PIOC-> PIO_OSR = 0xFFFFFFFE; // Register stavu výstupu výstupu radiča PIO, pozri p658 údajového listu ATMEL SAM3X

PIOC-> PIO_OWER = 0xFFFFFFFE; // Register PIO výstupu na zapisovanie, pozri p670 údajového listu ATMEL SAM3X

// PIOA-> PIO_PDR = 0x30000000; // voliteľné ako poistenie, nezdá sa, že by to malo vplyv na výkon, digitálny pin 10 sa pripája k PC29 aj PA28, digitálny pin 4 sa pripája k PC29 aj PA28, tu sa deaktivuje vypnutie PIOA #28 & 29 // nastavenie časovača, pozrite sa na https://arduino.cc/en/Hacking/PinMappingSAM3X, pmc_set_writeprotect (false); // vypnite ochranu proti zápisu registrov Power Management Control

pmc_enable_periph_clk (ID_TC7); // povolenie počítadla času periférnych hodín 7

TC_Configure (/ * hodiny */TC2,/ * kanál */1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); // TC hodiny 42MHz (hodiny, kanál, nastavenie režimu porovnávania) TC_SetRC (TC2, 1, interval); TC_Start (TC2, 1);

// povoliť prerušenia časovača na časovači TC2-> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS; // IER = povolenie prerušenia register TC2-> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; // IDR = prerušenie vypnutia registra

NVIC_EnableIRQ (TC7_IRQn); // Povolenie prerušenia vo vnorenom vektorovom radiči prerušenia freq = 60; // inicializácia frekvencie ako prednastavená 60 Hz = 21; // zvýšenie indexu poľa o 21 vzoriek = 256; // výstupné vzorky 256/interval cyklu = 42000000/(frekv*vzorky); // počet prerušení TC_SetRC (TC2, 1, interval); // spustenie TC Serial.begin (9600); // na testovacie účely}

neplatný checkFreq ()

{freqNew = 20 000;

if (freq == freqNew) {} else

{freq = freqNew;

if (freq> 20000) {freq = 20000; /*max. frekvencia 20kHz*/};

if (freq <1) {freq = 1; /*min. frekvencia 1 Hz*/};

if (freq> 999) {preset = 384; vzorky = 14;} // pre frekvenciu> = 1 kHz, 14 vzoriek pre každý cyklus

else if (freq> 499) {preset = 84; vzorky = 64;} // pre 500 <= frekvencia99) {prednastaveno = 42; vzorky = 128;} // pre 100 Hz <= frekvencia <500 Hz, 128 vzoriek/cyklus

else {preset = 21; vzorky = 256;}; // pre frekvenciu <100 Hz, 256 vzoriek pre každý cyklus

interval = 42000000/(frekv*vzorky); t = 0; TC_SetRC (TC2, 1, interval); }}

prázdna slučka () {

checkFreq (); oneskorenie (100); }

neplatné TC7_Handler (prázdne)

{TC_GetStatus (TC2, 1);

t = t%vzoriek; // pomocou t%vzoriek sa vyhnete pretečeniu t phaseAInc = (prednastavené*t)%5376; // použite %5376, aby ste sa vyhli pretečeniu indexu poľa

fázaBInc = (fázaAInc+1792)%5376;

phaseCInc = (phaseAInc+3584)%5376;

p_A = sin768 [phaseAInc] << 1; // pozri PIOC: PC1 až PC8, zodpovedajúci pin Arduino Due: pin 33-40, preto posun vľavo o 1 číslicu

p_B = sin768 [phaseBInc] << 12; // pozri PIOC: PC12 až PC19, zodpovedajúci pin Arduino Due: pin 51-44, preto posun vľavo o 12 číslic

p_C = sin768 [phaseCInc]; // výstup fázy C zamestnanci PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 a PC29, zodpovedajúci Arduino Due pin: digitálny pin: 9, 8, 7, 6, 5, 4, 3, 10, resp.

p_C2 = (p_C & B11000000) << 22; // toto generuje PC28 a PC29

p_C3 = (p_C & B00111111) << 21; // toto generuje PC21-PC26 //Serial.println(p_C3, BIN); p_C = p_C2 | p_C3; // toto generuje paralelný výstup fázy C

p_A = p_A | p_B | p_C; // 32 bitový výstup = fáza A (8bit) | fáza B | fáza C //Serial.println(p_A>>21, BIN); // PIOC-> PIO_ODSR = 0x37E00000;

PIOC-> PIO_ODSR = p_A; // výstupný register = p_A t ++; }

Odporúča: