SSブログ

202duinoで正弦波 → ノイズがのる → ATtiny412でDAC使用 [Arduino]

ATtiny202で正弦波をつくってみたんだけど、おそらく慣れないPWMの操作に問題があると思われ、ノイズがのってしまいました。

//  megaTinyCore ATtiny202/212/402/412 Sine Wave
static const uint16_t OCTAVE9[] = { 7023, 7441, 7883, 8352, 8848, 9375, 9932, 10523,11148,11811,12513,13258 };
static const uint8_t  SINE256[] = {
    0,  0,  0,  0,  1,  1,  1,  2,  2,  3,  4,  5,  5,  6,  7,  9,  10, 11, 12, 14, 15, 17, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35,
   37, 40, 42, 44, 47, 49, 52, 54, 57, 59, 62, 65, 67, 70, 73, 76,  79, 82, 85, 88, 90, 93, 97,100,103,106,109,112,115,118,121,124,
  128,131,134,137,140,143,146,149,152,155,158,162,165,167,170,173, 176,179,182,185,188,190,193,196,198,201,203,206,208,211,213,215,
  218,220,222,224,226,228,230,232,234,235,237,238,240,241,243,244, 245,246,248,249,250,250,251,252,253,253,254,254,254,255,255,255,
  255,255,255,255,254,254,254,253,253,252,251,250,250,249,248,246, 245,244,243,241,240,238,237,235,234,232,230,228,226,224,222,220,
  218,215,213,211,208,206,203,201,198,196,193,190,188,185,182,179, 176,173,170,167,165,162,158,155,152,149,146,143,140,137,134,131,
  128,124,121,118,115,112,109,106,103,100, 97, 93, 90, 88, 85, 82,  79, 76, 73, 70, 67, 65, 62, 59, 57, 54, 52, 49, 47, 44, 42, 40,
   37, 35, 33, 31, 29, 27, 25, 23, 21, 20, 18, 17, 15, 14, 12, 11,  10,  9,  7,  6,  5,  5,  4,  3,  2,  2,  1,  1,  1,  0,  0,  0 };

void setup(){                   // Register Settings
  TCB0.CTRLA = TCB_CLKSEL_CLKDIV1_gc | TCB_ENABLE_bm;   // 20MHz / 1 / 256 -> 78,125Hz
  TCB0.CTRLB = TCB_CNTMODE_PWM8_gc   | TCB_CCMPEN_bm;   // 8-Bit PWM mode, Output Enable (WO,PA6,megaTinyCore:P0)
  TCB0.CCMPL = 0xff;                                    // top value = 255
  TCB0.CCMPH = 0;                                       // output value
}

void loop(){
  sineWave( 60,  500);          // C4
  sineWave( 64,  500);          // E4
  sineWave( 67,  500);          // G4
  sineWave( 72, 2000);          // C5
  delay(1000);
}

void sineWave(uint8_t midiNum, uint16_t msDuration) {
  uint16_t i, di = OCTAVE9[ midiNum % 12 ] >> (10 - midiNum / 12);  // 256 times the Wave Table subscript to advance in one cycle
  uint32_t cycDuration = F_CPU / 256 / 1000 * msDuration;           // Convert duration to number of cycles
  do {
    TCB0.CCMPH = SINE256[ ( (i += di) >> 8 ) ];         // 8bit PWM (78,125Hz)
    while( !TCB0.INTFLAGS );                            // Waiting for TCB0 overflow (every 12.8usec(78,125Hz))
    TCB0.INTFLAGS = TCB_CAPT_bm;                        // cleared by writing a '1'
  } while( --cycDuration );                             // Exit if note data is 0
  TCB0.CCMPH = 0;                                       // Set output to 0
}

そこで、tinyAVR 1-Series の ATtiny412 を使用した「202duino w/ ATtiny412」でDACを使ってみることにしました。
せっかくなので正弦波のサンプリングも4倍にしたりしてみました。
sine1024.png
//  megaTinyCore ATtiny202/212/402/412 Sine Wave
static const uint32_t OCTAVE9[] = { 460256562,487624841,516620523,547340378,579886931,614368802,650901072,689605664,730611750,774056186,820083962,868848692 };
static const uint8_t SINE1024[] = {
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,7,8,8,8,8,9,9,
  9,10,10,10,10,11,11,11,12,12,12,13,13,14,14,14,15,15,15,16,16,17,17,17,18,18,19,19,19,20,20,21,21,22,22,22,23,23,24,24,25,25,26,
  26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,48,48,49,49,
  50,51,51,52,53,53,54,54,55,56,56,57,58,58,59,60,60,61,62,62,63,64,64,65,66,66,67,68,69,69,70,71,71,72,73,73,74,75,76,76,77,78,79,
  79,80,81,81,82,83,84,84,85,86,87,87,88,89,90,90,91,92,93,93,94,95,96,96,97,98,99,99,100,101,102,103,103,104,105,106,106,107,108,
  109,109,110,111,112,113,113,114,115,116,117,117,118,119,120,120,121,122,123,124,124,125,126,127,128,128,129,130,131,131,132,133,
  134,135,135,136,137,138,138,139,140,141,142,142,143,144,145,146,146,147,148,149,149,150,151,152,152,153,154,155,156,156,157,158,
  159,159,160,161,162,162,163,164,165,165,166,167,168,168,169,170,171,171,172,173,174,174,175,176,176,177,178,179,179,180,181,182,
  182,183,184,184,185,186,186,187,188,189,189,190,191,191,192,193,193,194,195,195,196,197,197,198,199,199,200,201,201,202,202,203,
  204,204,205,206,206,207,207,208,209,209,210,211,211,212,212,213,213,214,215,215,216,216,217,217,218,219,219,220,220,221,221,222,
  222,223,223,224,224,225,225,226,226,227,227,228,228,229,229,230,230,231,231,232,232,233,233,233,234,234,235,235,236,236,236,237,
  237,238,238,238,239,239,240,240,240,241,241,241,242,242,243,243,243,244,244,244,245,245,245,245,246,246,246,247,247,247,247,248,
  248,248,249,249,249,249,250,250,250,250,250,251,251,251,251,251,252,252,252,252,252,253,253,253,253,253,253,253,254,254,254,254,
  254,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,254,254,254,254,254,253,253,253,253,253,253,253,252,252,252,252,
  252,251,251,251,251,251,250,250,250,250,250,249,249,249,249,248,248,248,247,247,247,247,246,246,246,245,245,245,245,244,244,244,
  243,243,243,242,242,241,241,241,240,240,240,239,239,238,238,238,237,237,236,236,236,235,235,234,234,233,233,233,232,232,231,231,
  230,230,229,229,228,228,227,227,226,226,225,225,224,224,223,223,222,222,221,221,220,220,219,219,218,217,217,216,216,215,215,214,
  213,213,212,212,211,211,210,209,209,208,207,207,206,206,205,204,204,203,202,202,201,201,200,199,199,198,197,197,196,195,195,194,
  193,193,192,191,191,190,189,189,188,187,186,186,185,184,184,183,182,182,181,180,179,179,178,177,176,176,175,174,174,173,172,171,
  171,170,169,168,168,167,166,165,165,164,163,162,162,161,160,159,159,158,157,156,156,155,154,153,152,152,151,150,149,149,148,147,
  146,146,145,144,143,142,142,141,140,139,138,138,137,136,135,135,134,133,132,131,131,130,129,128,128,127,126,125,124,124,123,122,
  121,120,120,119,118,117,117,116,115,114,113,113,112,111,110,109,109,108,107,106,106,105,104,103,103,102,101,100,99,99,98,97,96,96,
  95,94,93,93,92,91,90,90,89,88,87,87,86,85,84,84,83,82,81,81,80,79,79,78,77,76,76,75,74,73,73,72,71,71,70,69,69,68,67,66,66,65,64,
  64,63,62,62,61,60,60,59,58,58,57,56,56,55,54,54,53,53,52,51,51,50,49,49,48,48,47,46,46,45,44,44,43,43,42,42,41,40,40,39,39,38,38,
  37,36,36,35,35,34,34,33,33,32,32,31,31,30,30,29,29,28,28,27,27,26,26,25,25,24,24,23,23,22,22,22,21,21,20,20,19,19,19,18,18,17,17,
  17,16,16,15,15,15,14,14,14,13,13,12,12,12,11,11,11,10,10,10,10,9,9,9,8,8,8,8,7,7,7,6,6,6,6,5,5,5,5,5,4,4,4,4,4,3,3,3,3,3,2,2,2,2,
  2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };

void setup(){                   // Register Settings
  TCB0.CTRLA = TCB_CLKSEL_CLKDIV1_gc | TCB_ENABLE_bm;   // 20MHz / 1 / 256 -> 78,125Hz
  TCB0.CTRLB = TCB_CNTMODE_PWM8_gc   | TCB_CCMPEN_bm;   // 8-Bit PWM mode, Output Enable (WO,PA6,megaTinyCore:P0)
  TCB0.CCMPL = 0xff;                                    // top value = 255
  TCB0.CCMPH = 0;                                       // output value
  #ifdef DAC0
  VREF.CTRLA |= VREF_DAC0REFSEL_4V34_gc;                // Voltage reference at 4.34V
  VREF.CTRLB |= VREF_DAC0REFEN_bm;                      // DAC0/AC0 reference enable: enabled
  delayMicroseconds(25);                                // Wait VREF start-up time
  PORTA.PIN6CTRL &= ~PORT_ISC_gm;                       // Disable digital input buffer
  PORTA.PIN6CTRL |=  PORT_ISC_INPUT_DISABLE_gc;          
  PORTA.PIN6CTRL &= ~PORT_PULLUPEN_bm;                  // Disable pull-up resistor
  DAC0.CTRLA = DAC_ENABLE_bm | DAC_OUTEN_bm;            // Enable DAC, Output Buffer
  #endif
  }

void loop(){
  sineWave( 60,  500);          // C4
  sineWave( 64,  500);          // E4
  sineWave( 67,  500);          // G4
  sineWave( 72, 2000);          // C5
  delay(1000);
}

void sineWave(uint8_t midiNum, uint16_t msDuration){
  uint32_t i, di, cycDuration;
  di = OCTAVE9[ midiNum % 12 ] >> (10 - midiNum / 12);  // 2^22 times the Wave Table subscript to advance in one cycle
  cycDuration = F_CPU / 256 / 1000 * msDuration;        // Convert duration to number of cycles
  do {
    #ifdef DAC0
    DAC0.DATA  = SINE1024[ ( (i += di) >> 22 ) ];       // 8bit DAC
    #else
    TCB0.CCMPH = SINE1024[ ( (i += di) >> 22 ) ];       // 8bit PWM (78,125Hz)
    #endif
    while( !TCB0.INTFLAGS );                            // Waiting for TCB0 overflow (every 12.8usec(78,125Hz))
    TCB0.INTFLAGS = TCB_CAPT_bm;                        // cleared by writing a '1'
  } while( --cycDuration );                             // Exit if data is 0
  #ifdef DAC0
  DAC0.DATA  = 0;                                       // Set output to 0
  #endif
  TCB0.CCMPH = 0;                                       // Set output to 0
}

(DACについての参考)
Getting Started with Digital-to-Analog Converter (DAC) - TB3210
http://ww1.microchip.com/downloads/en/Appnotes/TB3210-Getting-Started-with-DAC-DS-90003210.pdf

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。