202duinoで正弦波 → ノイズがのる → ATtiny412でDAC使用 [Arduino]
ATtiny202で正弦波をつくってみたんだけど、おそらく慣れないPWMの操作に問題があると思われ、ノイズがのってしまいました。
そこで、tinyAVR 1-Series の ATtiny412 を使用した「202duino w/ ATtiny412」でDACを使ってみることにしました。
せっかくなので正弦波のサンプリングも4倍にしたりしてみました。
(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
// 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倍にしたりしてみました。
// 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
2023-06-10 20:52
nice!(0)
コメント(0)
コメント 0