ዝርዝር ሁኔታ:

በአርዱዲኖ ምክንያት ላይ የተመሠረተ 3 ደረጃ ሳይን ሞገድ ጄኔሬተር - 5 ደረጃዎች
በአርዱዲኖ ምክንያት ላይ የተመሠረተ 3 ደረጃ ሳይን ሞገድ ጄኔሬተር - 5 ደረጃዎች

ቪዲዮ: በአርዱዲኖ ምክንያት ላይ የተመሠረተ 3 ደረጃ ሳይን ሞገድ ጄኔሬተር - 5 ደረጃዎች

ቪዲዮ: በአርዱዲኖ ምክንያት ላይ የተመሠረተ 3 ደረጃ ሳይን ሞገድ ጄኔሬተር - 5 ደረጃዎች
ቪዲዮ: On/OFF LED using Arduino Programming Full Video Basic To Advanced Languages #onoffledusingarduino 2024, ህዳር
Anonim
በአርዱዲኖ ክፍያ ላይ የተመሠረተ 3 ደረጃ ሳይን ሞገድ ጄኔሬተር
በአርዱዲኖ ክፍያ ላይ የተመሠረተ 3 ደረጃ ሳይን ሞገድ ጄኔሬተር

የዚህ ድርሻ ዓላማ የላልትን የላቀ አፈፃፀም + የማጣቀሻ እጥረት + አጋዥ ያልሆነ የውሂብ ሉህ ለመጠቀም የሚሞክርን ሰው መርዳት ነው።

ይህ ፕሮጀክት በዝቅተኛ ፍሪፍ (<1kHz) እና 16 ናሙናዎች / ዑደት @ ከፍተኛ ፍሪክ (እስከ 20kHz) ድረስ እስከ 3 ደረጃ ሳይን ሞገድ @ 256 ናሙናዎችን / ዑደትን ማመንጨት የሚችል ሲሆን ይህም በቀላል LPFs እና በጥሩ ሁኔታ ለማለስለስ በቂ ነው። ውፅዓት ማለት ይቻላል ፍጹም ነው።

እኔ የተያያዘው ፋይል የእኔ ተጨማሪ ስሪት አልነበረም። አንዳንድ ተጨማሪ ባህሪያትን ጨምሬ ነበር ፣ ግን ዋናው ለዚያ ተመሳሳይ ነው። ናሙናዎች/ዑደት ከላይ ከተጠቀሰው መግለጫ በታች እንደተቀናበሩ ልብ ይበሉ።

በአባሪው ፋይል ውስጥ በሚታየው አቀራረብ የሲፒዩ አቅም ከፍ ስለሚል ፣ የአርዲኖኖን የውጭ መቋረጫ የሚጠቀምበትን የአርዲኖኖን የውጭ መቋረጫ ተጠቅሞ የተደጋጋሚነት እሴቱን ለአርዱዲኖ ፋንታ ለማስተላለፍ እጠቀም ነበር። ከድግግሞሽ ቁጥጥር በተጨማሪ አርዱዲኖ ኡኖ እንዲሁ ስፋት (በዲጂታል እምቅ-ሜትር + OpAmp በኩል) እንዲሁም እኔ/ኦ --- ለመጫወት ብዙ ቦታ ይኖራል።

ደረጃ 1 የሲን ውሂብ ድርድርን ይፍጠሩ

የእውነተኛ-ጊዜ ስሌት ሲፒዩ የሚጠይቅ ስለሆነ ለተሻለ አፈፃፀም የሳይን ውሂብ ድርድር ያስፈልጋል

uint32_t sin768 PROGMEM =….እስከ x = [0: 5375]; y = 127+127*(ኃጢአት (2*pi/5376/*ወይም አንዳንድ # እርስዎ በሚፈልጉት መስፈርት*/) ላይ የተመሠረተ ነው)

ደረጃ 2 - ትይዩ ውፅዓት ማንቃት

ከኡኖ በተቃራኒ ፣ ፋው ውስን ማጣቀሻ አላቸው። ሆኖም በአርዱዲኖ ኡኖ ላይ የተመሠረተ የ 3 ደረጃ ሳይን ሞገድ ለማመንጨት ፣ በመጀመሪያ ደረጃ ፣ በዝቅተኛ MCLK (16 ሜኸዝ ሳለ 84 ሜኸዝ ነው) ፣ 2 ኛ ፣ ውስን ጂፒኦ ከፍተኛውን የ 2 ደረጃ ውፅዓት ማምረት ይችላል እና ተጨማሪ ያስፈልግዎታል 3 ኛ ደረጃ (C = -AB) ለማምረት የአናሎግ ወረዳ።

GPIO ን ማንቃት መከተል በአብዛኛው በሙከራ እና በሙከራ+በ SAM3X አጋዥ የውሂብ ስብስብ ላይ የተመሠረተ ነበር

PIOC-> PIO_PER = 0xFFFFFFFE; // PIO መቆጣጠሪያ PIO ምዝገባን ያንቁ (የኤቲኤምኤል SAM3X የውሂብ ሉህ p656 ይመልከቱ) እና https://arduino.cc/en/Hacking/PinMappingSAM3X ፣ Arduino Due pin 33-41 እና 44-51 ነቅተዋል

PIOC-> PIO_OER = 0xFFFFFFFE; // የ PIO ተቆጣጣሪ ውፅዓት ምዝገባን ያንቁ ፣ የ ATMEL SAM3X የውሂብ ሉህ PIOC-> PIO_OSR = 0xFFFFFFFE p657 ን ይመልከቱ ፤ // የ PIO ተቆጣጣሪ የውጤት ሁኔታ ምዝገባ ፣ ከ ATMEL SAM3X የውሂብ ሉህ p658 ይመልከቱ

PIOC-> PIO_OWER = 0xFFFFFFFE; // የፒዮ ውፅዓት መጻፍ ምዝገባን ያንቁ ፣ ከ ATMEL SAM3X የውሂብ ሉህ p670 ይመልከቱ

// PIOA-> PIO_PDR = 0x30000000; // እንደ ኢንሹራንስ አማራጭ ፣ በአፈፃፀም ላይ ተጽዕኖ የሚያሳድር አይመስልም ፣ ዲጂታል ፒን 10 ከሁለቱም PC29 እና PA28 ጋር ይገናኛል ፣ ዲጂታል ፒን 4 ከሁለቱም PC29 እና PA28 ጋር ይገናኛል ፣ እዚህ ፒአይኤ #28 & 29 ን ለማሰናከል

ደረጃ 3 መቋረጥን ማንቃት

አፈፃፀሙን ከፍ ለማድረግ የሲፒዩ ጭነት በተቻለ መጠን ዝቅተኛ መሆን አለበት። ሆኖም በሲፒዩ ፒን እና በተገቢው ፒን መካከል ባለው 1to1 ባልሆነ ግንኙነት ምክንያት የቢት አሠራር አስፈላጊ ነው።

ስልተ ቀመሩን የበለጠ ማመቻቸት ይችላሉ ነገር ግን ክፍሉ በጣም ውስን ነው።

ባዶ TC7_Handler (ባዶ) {TC_GetStatus (TC2, 1);

t = t%ናሙናዎች; // የ t ን ከመጠን በላይ መብዛትን ለማስወገድ ‹ከሆነ› ይልቅ የ t%ናሙናዎችን ይጠቀሙ

phaseAInc = (ቅድመ -ቅምጥ*t)%5376; // የድርድር መረጃ ጠቋሚን ከመጠን በላይ ለማስወገድ %5376 ን ይጠቀሙ

phaseBInc = (phaseAInc+1792)%5376;

phaseCInc = (phaseAInc+3584)%5376;

p_A = sin768 [phaseAInc] << 1; // ያመልክቱ PIOC: PC1 ወደ PC8 ፣ ተጓዳኝ አርዱዲኖ የመድረሻ ፒን-ፒን 33-40 ፣ ስለዚህ ለ 1 አሃዝ ወደ ግራ ይቀይሩ

p_B = sin768 [phaseBInc] << 12; // PIOC ን ይመልከቱ-PC12 ወደ PC19 ፣ ተጓዳኝ አርዱinoኖ ምክንያት ፒን-ፒን 51-44 ፣ ስለዚህ ወደ ግራ 12 አሃዝ ይቀይሩ

p_C = sin768 [phaseCInc]; // የደረጃ ሐ ውፅዓት ሠራተኛ PIOC: PC21 ፣ PC22 ፣ PC23 ፣ PC24 ፣ PC25 ፣ PC26 ፣ PC28 እና PC29 ፣ ተጓዳኝ አርዱinoኖ የገባበት ፒን - ዲጂታል ፒን 9 ፣ 8 ፣ 7 ፣ 6 ፣ 5 ፣ 4 ፣ 3 ፣ 10 ፣ በቅደም ተከተል

p_C2 = (p_C & B11000000) << 22; // ይህ PC28 እና PC29 ያመነጫል

p_C3 = (p_C & B00111111) << 21; // ይህ PC21-PC26 ያመነጫል

p_C = p_C2 | p_C3; // ይህ የደረጃ ሐ ትይዩ ውፅዓት ይፈጥራል

p_A = p_A | p_B | p_C; // 32 ቢት ውፅዓት = ደረጃ ሀ (8 ቢት) | ደረጃ ለ | ደረጃ ሐ

PIOC-> PIO_ODSR = p_A; // የውጤት መመዝገቢያ = p_A

t ++; }

ደረጃ 4: R/2R DAC

በ google ላይ 3x8bit R/2R DAC ፣ የጭነት ጭነቶች ይገንቡ።

ደረጃ 5 - ሙሉ ኮድ

#መለየት _BV (x) (1 << (x)); uint32_t sin768 PROGMEM = /* x = [0: 5375]; y = 127+127*(ኃጢአት (2*pi/5376))*/

uint32_t p_A ፣ p_B ፣ p_C ፣ p_C2 ፣ p_C3; // ደረጃ A ደረጃ ቢ ደረጃ ሐ እሴት-ምንም እንኳን ውፅዓት 8 ቢት ብቻ ቢሆንም ፣ በ 32 ቢት ፒኦክ ውፅዓት ለመቅዳት p_A እና p_B እሴት አዲስ 32 ቢት እሴት ለማመንጨት ይሠራል።

uint16_t phaseAInc, phaseBInc, phaseCInc, freq, freqNew; uint32_t ክፍተት; uint16_t ናሙናዎች ፣ ቅድመ -ቅምጥ; uint32_t t = 0;

ባዶነት ማዋቀር () {

// ትይዩ ውፅዓት PIOC ቅንብር-አርዱinoኖ ምክንያት ፒን 33-40 እንደ ደረጃ ሀ ውፅዓት ተቀጥረው ሲሰሩ ፒን 44-51 ደግሞ ለ “B” ውጤት ይሠራል

PIOC-> PIO_PER = 0xFFFFFFFE; // PIO መቆጣጠሪያ PIO ምዝገባን ያንቁ (የኤቲኤምኤል SAM3X የውሂብ ሉህ p656 ይመልከቱ) እና https://arduino.cc/en/Hacking/PinMappingSAM3X ፣ Arduino Due pin 33-41 እና 44-51 ነቅተዋል

PIOC-> PIO_OER = 0xFFFFFFFE; // የ PIO ተቆጣጣሪ ውፅዓት ምዝገባን ያንቁ ፣ ከ ATMEL SAM3X የውሂብ ሉህ p657 ይመልከቱ

PIOC-> PIO_OSR = 0xFFFFFFFE; // የ PIO ተቆጣጣሪ የውጤት ሁኔታ ምዝገባ ፣ ከ ATMEL SAM3X የውሂብ ሉህ p658 ይመልከቱ

PIOC-> PIO_OWER = 0xFFFFFFFE; // የፒዮ ውፅዓት መጻፍ ምዝገባን ያንቁ ፣ ከ ATMEL SAM3X የውሂብ ሉህ p670 ይመልከቱ

// PIOA-> PIO_PDR = 0x30000000; // እንደ ኢንሹራንስ አማራጭ ፣ በአፈጻጸም ላይ ተጽዕኖ ያለው አይመስልም ፣ ዲጂታል ፒን 10 ከሁለቱም PC29 እና PA28 ጋር ይገናኛል ፣ ዲጂታል ፒን 4 ከሁለቱም PC29 እና PA28 ጋር ይገናኛል ፣ እዚህ PIOA #28 & 29 // ሰዓት ቆጣሪን ማዋቀር ለማሰናከል ፣ http ን ይመልከቱ: //arduino.cc/en/Hacking/PinMappingSAM3X ፣

pmc_set_writeprotect (ሐሰት); // የኃይል አስተዳደር ቁጥጥር መዝገቦችን የመፃፍ ጥበቃን ያሰናክሉ

pmc_enable_periph_clk (ID_TC7); // የአከባቢ ሰዓት ሰዓት ቆጣሪን ያንቁ 7

TC_Configure (/ * ሰዓት */TC2 ፣/ * ሰርጥ */1 ፣ TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); // TC ሰዓት 42 ሜኸ (ሰዓት ፣ ሰርጥ ፣ የሞድ ቅንብርን ያወዳድሩ) TC_SetRC (TC2 ፣ 1 ፣ ክፍተት); TC_Start (TC2 ፣ 1);

// በሰዓት ቆጣሪ TC2-> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS ላይ የሰዓት ቆጣሪዎችን ማንቃት ፤ // IER = መቋረጥ ምዝገባን ያንቁ TC2-> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; // IDR = መዝገቡን ያሰናክሉ

NVIC_EnableIRQ (TC7_IRQn); // በተቆራኘው የቬክተር ማቋረጫ ተቆጣጣሪ ፍሪ = 60 ውስጥ ያለውን መቋረጥ ያንቁ። // ድግግሞሽ እንደ 60Hz ቅድመ -ቅምጥ = 21; // የድርድር መረጃ ጠቋሚ በ 21 ናሙናዎች = 256; // የውጤት ናሙናዎች 256/የዑደት ክፍተት = 42000000/(ፍሬክ*ናሙናዎች); // ማቋረጥ TC_SetRC (TC2 ፣ 1 ፣ ክፍተት) ይቆጥራል ፤ // TC Serial.begin ን ይጀምሩ (9600); // ለሙከራ ዓላማ}

ባዶ ቼክ ፍሬክ ()

{freqNew = 20000;

ከሆነ (freq == freqNew) {} ሌላ

{freq = freqNew;

ከሆነ (freq> 20000) {freq = 20000; /*ከፍተኛ ድግግሞሽ 20kHz*/};

ከሆነ (freq <1) {freq = 1; /*ደቂቃ ድግግሞሽ 1Hz*/};

ከሆነ (freq> 999) {ቅድመ -ቅምጥ = 384; ናሙናዎች = 14;} // ለድግግሞሽ> = 1kHz ፣ ለእያንዳንዱ ዑደት 14 ናሙናዎች

ሌላ ከሆነ (freq> 499) {ቅድመ -ቅምጥ = 84; ናሙናዎች = 64;} // ለ 500 <= frequency99) {preset = 42; ናሙናዎች = 128;} // ለ 100Hz <= ድግግሞሽ <500Hz ፣ 128 ናሙናዎች/ዑደት

ሌላ {ቅድመ -ቅምጥ = 21; ናሙናዎች = 256;}; // ለተደጋጋሚ <100hz ፣ ለእያንዳንዱ ናሙና 256 ናሙናዎች

ክፍተት = 42000000/(freq*ናሙናዎች); t = 0; TC_SetRC (TC2 ፣ 1 ፣ ክፍተት); }}

ባዶነት loop () {

checkFreq (); መዘግየት (100); }

ባዶ TC7_Handler (ባዶ)

{TC_GetStatus (TC2 ፣ 1) ፤

t = t%ናሙናዎች; // የ t phase ናሙናዎችን ከመጠን በላይ ለማስወገድ t%ናሙናዎችን ይጠቀሙ (= ቅድመ -ቅምጥ*t)%5376; // የድርድር መረጃ ጠቋሚን ከመጠን በላይ ለማስወገድ %5376 ን ይጠቀሙ

phaseBInc = (phaseAInc+1792)%5376;

phaseCInc = (phaseAInc+3584)%5376;

p_A = sin768 [phaseAInc] << 1; // PIOC ን ይመልከቱ-PC1 ወደ PC8 ፣ ተጓዳኝ አርዱinoኖ የመድረሻ ፒን-ፒን 33-40 ፣ ስለዚህ ለ 1 አሃዝ ወደ ግራ ይቀይሩ

p_B = sin768 [phaseBInc] << 12; // PIOC ን ይመልከቱ-PC12 ወደ PC19 ፣ ተጓዳኝ አርዱinoኖ ምክንያት ፒን-ፒን 51-44 ፣ ስለዚህ ወደ ግራ 12 አሃዝ ይቀይሩ

p_C = sin768 [phaseCInc]; // የደረጃ ሐ ውፅዓት ሠራተኛ PIOC: PC21 ፣ PC22 ፣ PC23 ፣ PC24 ፣ PC25 ፣ PC26 ፣ PC28 እና PC29 ፣ ተጓዳኝ አርዱinoኖ የገባበት ፒን - ዲጂታል ፒን 9 ፣ 8 ፣ 7 ፣ 6 ፣ 5 ፣ 4 ፣ 3 ፣ 10 ፣ በቅደም ተከተል

p_C2 = (p_C & B11000000) << 22; // ይህ PC28 እና PC29 ያመነጫል

p_C3 = (p_C & B00111111) << 21; // ይህ PC21-PC26 //Serial.println(p_C3 ፣ BIN) ያመነጫል ፤ p_C = p_C2 | p_C3; // ይህ የደረጃ ሐ ትይዩ ውፅዓት ይፈጥራል

p_A = p_A | p_B | p_C; // 32 ቢት ውፅዓት = ደረጃ ሀ (8 ቢት) | ደረጃ ለ | ደረጃ ሐ //Serial.println(p_A>>21 ፣ BIN); // PIOC-> PIO_ODSR = 0x37E00000;

PIOC-> PIO_ODSR = p_A; // የውጤት መመዝገቢያ = p_A t ++; }

የሚመከር: