Orodha ya maudhui:

Jenereta ya Mganda wa Sine ya Awamu ya 3 Kulingana na Arduino Kutokana: Hatua 5
Jenereta ya Mganda wa Sine ya Awamu ya 3 Kulingana na Arduino Kutokana: Hatua 5

Video: Jenereta ya Mganda wa Sine ya Awamu ya 3 Kulingana na Arduino Kutokana: Hatua 5

Video: Jenereta ya Mganda wa Sine ya Awamu ya 3 Kulingana na Arduino Kutokana: Hatua 5
Video: GENERADOR AR del año 1940 Dynamotor Generator 2024, Julai
Anonim
Jenereta ya Mganda wa Sine ya Awamu ya 3 Kulingana na Arduino Kutokana
Jenereta ya Mganda wa Sine ya Awamu ya 3 Kulingana na Arduino Kutokana

Kusudi la sehemu hii ni kusaidia mtu anayejaribu kutumia utendaji bora wa Kutokana + ukosefu wa rejeleo + la data isiyosaidia.

mradi huu una uwezo wa kuzalisha hadi wimbi 3 la sine wimbi @ 256 sampuli / mzunguko kwa freq ya chini (<1kHz) na sampuli 16 / mzunguko @ high freq (hadi 20kHz), ambayo ni nzuri ya kutosha kusawazishwa na LPFs rahisi na pato ni karibu kamili.

faili iliyoambatanishwa haikuwa toleo langu la mwisho kwa kuwa niliongeza huduma nyingine lakini msingi ni sawa na hiyo. Kumbuka sampuli / mzunguko uliwekwa chini kuliko taarifa hapo juu.

kwa kuwa uwezo wa CPU umeongezwa kupitia njia iliyoonyeshwa kwenye faili iliyoambatishwa, nilitumia Arduino Uno kama kitengo cha kudhibiti, ambao hutumia usumbufu wa nje wa Arduino Kutokana kupitisha thamani ya masafa kwa Arduino Ngenxa. Mbali na udhibiti wa masafa, Arduino Uno pia inadhibiti ukubwa (kupitia mita-uwezo ya dijiti + OpAmp) na I / O --- kutakuwa na nafasi nyingi ya kucheza nayo.

Hatua ya 1: Tengeneza Mpangilio wa Takwimu za Sine

Kwa kuwa hesabu ya wakati halisi inahitaji CPU, safu ya data ya sine inahitajika kwa utendaji bora

uint32_t sin768 PROGMEM =… wakati x = [0: 5375]; y = 127 + 127 * (dhambi (2 * pi / 5376 / * au zingine # unazopendelea inategemea mahitaji * /))

Hatua ya 2: Kuwezesha Pato Sambamba

Tofauti na Uno, Kutokana ina kumbukumbu ndogo. Walakini ili kutoa wimbi la sine ya awamu ya 3 kulingana na Arduino Uno, 1 ya yote, utendaji haufurahii kwa sababu ya MCLK yake ya chini (16MHz wakati wa sababu ni 84MHz), 2, ni mdogo GPIO inaweza kutoa kiwango cha juu cha awamu ya 2 na unahitaji ziada mzunguko wa analogi kutoa awamu ya 3 (C = -AB).

Kufuatia kuwezeshwa kwa GPIO ilitokana zaidi na jaribio na jaribio + la data ya SAM3X isiyosaidia

PIOC-> PIO_PER = 0xFFFFFFFE; // Mdhibiti wa PIO PIO Wezesha rejista (rejelea p656 ya data ya ATMEL SAM3X) na https://arduino.cc/en/Hacking/PinMappingSAM3X, pini ya Arduino Ngenxa ya 33-41 na 44-51 ziliwezeshwa

PIOC-> PIO_OER = 0xFFFFFFFE; // Pato la mtawala wa PIO kuwezesha rejista, rejea p657 ya ATMEL SAM3X dataasheet PIOC-> PIO_OSR = 0xFFFFFFFE; // Sajili ya hadhi ya mtawala wa PIO, rejelea p658 ya data ya ATMEL SAM3X

PIOC-> PIO_OWER = 0xFFFFFFFE; // Kuandika kwa pato la PIO kuwezesha rejista, rejea p670 ya data ya ATMEL SAM3X

// PIOA-> PIO_PDR = 0x30000000; // hiari kama bima, haionekani kuathiri utendaji, pini ya dijiti 10 unganisha kwa PC29 na PA28, pini ya dijiti 4 unganisha kwa PC29 na PA28, hapa kuzima PIOA # 28 & 29

Hatua ya 3: Kuwezesha Usumbufu

Ili kuongeza utendaji wake, mzigo wa CPU unapaswa kuwa chini iwezekanavyo. Walakini kwa sababu ya mawasiliano yasiyo ya 1to1 kati ya pini ya CPU na pini inayotakiwa, operesheni kidogo ni muhimu.

Unaweza kuongeza zaidi algorithm lakini chumba ni chache sana.

utupu TC7_Handler (utupu) {TC_GetStatus (TC2, 1);

sampuli t = t%; // tumia sampuli t% badala ya 'ikiwa' ili kuzuia kufurika kwa t

phaseAInc = (preset * t)% 5376; // tumia% 5376 kuzuia kufurika kwa faharisi ya safu

awamuBInc = (phaseAInc + 1792)% 5376;

phaseCInc = (phaseAInc + 3584)% 5376;

p_A = dhambi768 [phaseAInc] << 1; // rejea PIOC: PC1 hadi PC8, pini inayolingana ya Arduino: pini 33-40, kwa hivyo songa kushoto kwa nambari 1

p_B = dhambi768 [phaseBInc] << 12; // rejea PIOC: PC12 hadi PC19, pini inayolingana ya Arduino: pini 51-44, kwa hivyo kuhama kushoto nambari 12

p_C = sin768 [phaseCInc]; // awamu ya C ya mfanyikazi wa pato PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 na PC29, inayolingana na pini inayolingana ya Arduino: pini ya dijiti: 9, 8, 7, 6, 5, 4, 3, 10, mtawaliwa.

p_C2 = (p_C & B11000000) << 22; // hii inazalisha PC28 na PC29

p_C3 = (p_C & B00111111) << 21; // hii inazalisha PC21-PC26

p_C = p_C2 | p_C3; // hii inazalisha pato linalofanana la awamu C

p_A = p_A | p_B | p_C; // 32 pato kidogo = awamu A (8bit) | awamu B | awamu C

PIOC-> PIO_ODSR = p_A; // rejista ya pato = p_A

t ++; }

Hatua ya 4: R / 2R DAC

jenga 3x8bit R / 2R DAC, mizigo mingi ya rejea kwenye google.

Hatua ya 5: Kanuni kamili

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

uint32_t p_A, p_B, p_C, p_C2, p_C3; // awamu A awamu ya B ya thamani ya C - ingawa pato ni 8bits tu, p_A na p_B thamani itatumika ili kutoa dhamana mpya ya 32 ili kukabiliana na pato la 32bit PIOC

uint16_t phaseAInc, phaseBInc, phaseCInc, freq, freq Mpya; muda wa uint32_t; sampuli za uint16_t, zilizowekwa mapema; uint32_t t = 0;

usanidi batili () {

// usanifu wa pato sambamba PIOC: Arduino Ngenxa pin33-40 wameajiriwa kama pato la awamu wakati pini 44-51 inafanya kazi kwa pato la awamu B

PIOC-> PIO_PER = 0xFFFFFFFE; // Mdhibiti wa PIO PIO Wezesha rejista (rejelea p656 ya data ya ATMEL SAM3X) na https://arduino.cc/en/Hacking/PinMappingSAM3X, pini ya Arduino Ngenxa ya 33-41 na 44-51 ziliwezeshwa

PIOC-> PIO_OER = 0xFFFFFFFE; // Pato la mtawala wa PIO kuwezesha rejista, rejelea p657 ya data ya ATMEL SAM3X

PIOC-> PIO_OSR = 0xFFFFFFFE; // Sajili ya hadhi ya mtawala wa PIO, rejelea p658 ya data ya ATMEL SAM3X

PIOC-> PIO_OWER = 0xFFFFFFFE; // Kuandika kwa pato la PIO kuwezesha rejista, rejea p670 ya data ya ATMEL SAM3X

// PIOA-> PIO_PDR = 0x30000000; // hiari kama bima, haionekani kuathiri utendaji, pini ya dijiti 10 unganisha kwa PC29 na PA28, pini ya dijiti 4 unganisha kwa PC29 na PA28, hapa ili kuzima usanidi wa kipima muda wa PIOA # 28 & 29 //, rejea kwa https://arduino.cc/en/Hacking/PinMappingSAM3X, pmc_set_writeprotect (uwongo); // kulemaza uandishi wa daftari za Udhibiti wa Usimamizi wa Nguvu

pmc_nable_periph_clk (ID_TC7); // kuwezesha saa ya pembeni saa ya kukabiliana na 7

TC_Configure (/ * saa * / TC2, / * kituo * / 1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); // saa ya TC 42MHz (saa, kituo, linganisha mipangilio ya hali) TC_SetRC (TC2, 1, muda); TC_Start (TC2, 1);

// kuwezesha kukatika kwa kipima muda kwenye kipima muda TC2-> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS; // IER = kukatiza kuwezesha usajili TC2-> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; // IDR = kukataza afya ya rejista

NVIC_InawezeshwaIRQ (TC7_IRQn); // Wezesha usumbufu katika kidhibiti cha usumbufu cha kukataza vector freq = 60; // anzisha masafa kama kuweka 60Hz = 21; // index kuongezeka kwa sampuli 21 = 256; // sampuli za pato 256 / muda wa mzunguko = 42000000 / (sampuli za freq *); // kukatiza hesabu TC_SetRC (TC2, 1, muda); // kuanza TC Serial. kuanza (9600); // kwa kusudi la mtihani}

batili checkFreq ()

{freqNew = 20000;

ikiwa (freq == freqNew) {} mwingine

{freq = freq Mpya;

ikiwa (freq> 20000) {freq = 20000; / * masafa ya juu 20kHz * /};

ikiwa (freq <1) {freq = 1; / * min frequency 1Hz * /};

ikiwa (freq> 999) {preset = 384; sampuli = 14;} // kwa masafa> = 1kHz, sampuli 14 kwa kila mzunguko

vinginevyo ikiwa (freq> 499) {preset = 84; sampuli = 64;} // kwa 500 <= frequency99) {preset = 42; sampuli = 128;} // kwa 100Hz <= frequency <500Hz, 128 sampuli / mzunguko

kingine {preset = 21; sampuli = 256;}; // kwa masafa <100hz, sampuli 256 kwa kila mzunguko

muda = 42000000 / (sampuli za freq *); t = 0; TC_SetRC (TC2, 1, muda); }}

kitanzi batili () {

kuangaliaFreq (); kuchelewesha (100); }

utupu TC7_Handler (utupu)

{TC_GetStatus (TC2, 1);

sampuli t = t%; // tumia sampuli t% kuepusha kufurika kwa t phaseAInc = (preset * t)% 5376; // tumia% 5376 kuzuia kufurika kwa faharisi ya safu

awamuBInc = (phaseAInc + 1792)% 5376;

phaseCInc = (phaseAInc + 3584)% 5376;

p_A = dhambi768 [phaseAInc] << 1; // rejea PIOC: PC1 hadi PC8, pini inayolingana ya Arduino: pini 33-40, kwa hivyo songa kushoto kwa nambari 1

p_B = dhambi768 [phaseBInc] << 12; // rejea PIOC: PC12 hadi PC19, pini inayolingana ya Arduino: pini 51-44, kwa hivyo kuhama kushoto nambari 12

p_C = sin768 [phaseCInc]; // awamu ya C ya mfanyikazi wa pato PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 na PC29, inayofanana na pini ya Arduino kutokana: pini ya dijiti: 9, 8, 7, 6, 5, 4, 3, 10, mtawaliwa.

p_C2 = (p_C & B11000000) << 22; // hii inazalisha PC28 na PC29

p_C3 = (p_C & B00111111) << 21; // hii inazalisha PC21-PC26 //Serial.println (p_C3, BIN); p_C = p_C2 | p_C3; // hii inazalisha pato linalofanana la awamu C

p_A = p_A | p_B | p_C; // 32 pato kidogo = awamu A (8bit) | awamu B | awamu C //Serial.println (p_A>>21, BIN); // PIOC-> PIO_ODSR = 0x37E00000;

PIOC-> PIO_ODSR = p_A; // rejista ya pato = p_A t ++; }

Ilipendekeza: