
Orodha ya maudhui:
2025 Mwandishi: John Day | [email protected]. Mwisho uliobadilishwa: 2025-01-23 15:11

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:
Inverter safi ya Mganda wa Sine: Hatua 8

Inverter safi ya Sine Wave: Utafiti wangu
Uzalishaji wa Bodi ya Udhibiti wa Mganda wa Sine: Hatua 5

Uzalishaji wa Bodi ya Udhibiti wa Mganda wa Sine: Wakati huu ni bodi ya udhibiti wa gridi ya sine ya awamu moja, ikifuatiwa na bodi ya udhibiti wa gridi ya sine ya awamu moja, kisha bodi ya kudhibiti sine ya awamu ya tatu, na mwishowe bodi ya kudhibiti sine ya awamu ya tatu kutoka kwa gridi ya kudhibiti. Tunatumahi
Jenereta ya Muziki inayotegemea hali ya hewa (ESP8266 Kulingana na Jenereta ya Midi): Hatua 4 (na Picha)

Jenereta ya Muziki ya Hali ya Hewa (ESP8266 Based Midi Generator): Halo, leo nitaelezea jinsi ya kutengeneza jenereta yako ndogo ya Muziki inayotegemea hali ya hewa. Inategemea ESP8266, ambayo ni kama Arduino, na inajibu kwa hali ya joto, mvua na nguvu ndogo. Usitarajie itengeneze nyimbo nzima au programu ya gumzo
DIY Mzunguko wa NE555 Kuzalisha Mganda wa Sine: Hatua 6

DIY Mzunguko wa NE555 Kuzalisha Mganda wa Sine: Mafunzo haya yanakufundisha juu ya jinsi ya kutengeneza mzunguko wa NE555 ili kutengeneza wimbi la sine. Vifaa hivi vya bei rahisi vya DIY husaidia sana wewe kuelewa ni jinsi gani capacitors wanaweza kufanya kazi na vipinga kudhibiti kudhibiti na kuchaji wakati wa jeni
Jenereta ya Mganda wa Haraka wa Edge: Hatua 4

Jenereta ya Mganda wa Pembe ya Haraka: Ikiwa unataka kupima inductance, uwezo wa sehemu yoyote basi unahitaji wimbi la mraba wa makali haraka katika nakala hii tunajifunza juu ya hii