DigisparkのPLLとlow-pass filterとアンプと [Arduino]
上位のArduino Uno(ATmega328)にはなくて、Digispark(ATtiny85)にはあるものとして、PLL(位相同期回路: phase locked loop)があります。
まず、使用するには、、
PLLCSR(PLL Control and Status Register)
Bit 1 - PLLE: PLL Enable はシステムクロック元としPLLが選択されているので元々1。
Bit 2 - PCKE: PCK Enable を1にすることで、タイマー/カウンタ1のクロック元をPLLにします。
Bit 7 - LSM: Low Speed Mode(32MHz) ですが、そのまま 0 で高速モード(64MHz)。
・注意点
★システムクロック(16/8/1MHz)に関わらず64MHz(LSM: Low Speed Mode時は32MHz)
(ただしOSCCAL (Oscillator Calibration Register)をいじるとシステムクロックと一緒に微調整はできます)
★タイマー/カウンタ1だけ
(ただしDigisparkではボードマネージャでDigistump AVR Boardsの場合でISR(TIMER1_OVF_vect)が使用されてしまっている)
・使用用途
とりあえず、高速PWMによる疑似DACかな。
64MHz / 256(8bit) = 250kHz が、キャリア周波数ということでした。
まあ、Uno(16MHz)で9bitだと 16MHz / 512(9bit) = 31.25kHz だとノイズらしいノイズは分かりませんでしたが、半分の15.625kHzだとノイズが分かりました。
あと、外部出力の際には、low-pass filterがないとアンプが壊れるよっていうのが各所に書いてありました。
low-pass filterの具体的な値の計算式は理解できなかったので、以下のサイトのPLL音声出力時の回路図を参考とさせていただきました。
PB4(OC1B)から1kΩの抵抗と、そこからGNDとの間に0.1μFのコンデンサとなっていました。
Technoblogy - Waveform Generation using an ATtiny85
http://www.technoblogy.com/show?QVN
とか
Technoblogy - Four Sample Player
http://www.technoblogy.com/show?2XJD
また、次のページには、PB4(OC1B)から220μFの電解コンデンサを介してスピーカとつないでありました。
Technoblogy - Tiny Synth
http://www.technoblogy.com/show?Q7H
他では、100μFだったりするのもありました。
Technoblogy - Audio Pitch Shifter
http://www.technoblogy.com/show?1L02
できあいのアンプとつないでみました。
そのままアンプにつなぐと、音が大きすぎて音が割れるので、回路図のとおり10kΩの半固定抵抗をつけました。
まず、使用するには、、
PLLCSR(PLL Control and Status Register)
Bit 1 - PLLE: PLL Enable はシステムクロック元としPLLが選択されているので元々1。
Bit 2 - PCKE: PCK Enable を1にすることで、タイマー/カウンタ1のクロック元をPLLにします。
Bit 7 - LSM: Low Speed Mode(32MHz) ですが、そのまま 0 で高速モード(64MHz)。
・注意点
★システムクロック(16/8/1MHz)に関わらず64MHz(LSM: Low Speed Mode時は32MHz)
(ただしOSCCAL (Oscillator Calibration Register)をいじるとシステムクロックと一緒に微調整はできます)
★タイマー/カウンタ1だけ
(ただしDigisparkではボードマネージャでDigistump AVR Boardsの場合でISR(TIMER1_OVF_vect)が使用されてしまっている)
・使用用途
とりあえず、高速PWMによる疑似DACかな。
64MHz / 256(8bit) = 250kHz が、キャリア周波数ということでした。
まあ、Uno(16MHz)で9bitだと 16MHz / 512(9bit) = 31.25kHz だとノイズらしいノイズは分かりませんでしたが、半分の15.625kHzだとノイズが分かりました。
あと、外部出力の際には、low-pass filterがないとアンプが壊れるよっていうのが各所に書いてありました。
low-pass filterの具体的な値の計算式は理解できなかったので、以下のサイトのPLL音声出力時の回路図を参考とさせていただきました。
PB4(OC1B)から1kΩの抵抗と、そこからGNDとの間に0.1μFのコンデンサとなっていました。
Technoblogy - Waveform Generation using an ATtiny85
http://www.technoblogy.com/show?QVN
とか
Technoblogy - Four Sample Player
http://www.technoblogy.com/show?2XJD
また、次のページには、PB4(OC1B)から220μFの電解コンデンサを介してスピーカとつないでありました。
Technoblogy - Tiny Synth
http://www.technoblogy.com/show?Q7H
他では、100μFだったりするのもありました。
Technoblogy - Audio Pitch Shifter
http://www.technoblogy.com/show?1L02
できあいのアンプとつないでみました。
そのままアンプにつなぐと、音が大きすぎて音が割れるので、回路図のとおり10kΩの半固定抵抗をつけました。
Digispark関連の追加のボードマネージャのURL [Arduino]
Digispark関連の追加のボードマネージャのURL (additonal Boards Manager URLs)
追加したものは、以下に保存されるっぽい。
%appdata%\..\local\Arduino15\packages\
具体的には、、
C:\Users\%USERNAME%\AppData\Local\Arduino15\packages\
追加の.jsonファイルはその一つ上位のフォルダに。
★Digispark関連と、そのほか興味はあるけどまだ試していないボードの追加のボードマネージャのURL★
■ ATTinyCore by Spence Konde
Dr. Azzy's Electronics (作者のページ)
http://drazzy.com/e/
GitHub - SpenceKonde/ATTinyCore: Arduino core for ATtiny 1634, 828, x313, x4, x41, x5, x61, x7 and x8
https://github.com/SpenceKonde/ATTinyCore
ATTinyCore/Installation.md at master · SpenceKonde/ATTinyCore · GitHub
https://github.com/SpenceKonde/ATTinyCore/blob/master/Installation.md
★additonal URL:
http://drazzy.com/package_drazzy.com_index.json
ATtinyで遊ぶときに欠かせない。
これにもDigisparkが含まれている。
デフォルトだと、時間関連に対して、Timer0を使っている。(Digistumpはtimer1を使用)
DigiKeyboard.h などは使えない。
他に megaTinyCore というので tinyAVR 0/1/2-series 用のも作ってみえます。
■ kosakalab
Arduino IDE で ATtiny 他の開発 Make kosakalab
https://make.kosakalab.com/make/electronic-work/arduino-ide-dev/
★additonal URLs:
Arduino IDE に ATtiny10/13 の開発環境を組み込む
https://kimio-kosaka.github.io/bitDuino13/package_bitDuino13_index.json
Arduino IDE に ATmaga88P/328P/644P 他の開発環境を組み込む
https://kimio-kosaka.github.io/ATMegaCore/package_ATMegaCore_index.json
ATTinyCoreで対応していないATtiny13とか、足多めのATmega644Pとか。
■ Digistump AVR Boards
digisparktutorialsconnecting [Digistump Wiki]
http://digistump.com/wiki/digispark/tutorials/connecting
★additonal URL:
http://digistump.com/package_digistump_index.json
Digistump公式のかな。
Timer1を時間関連で使用されている。
DigiKeyboard.h などで簡単にHID (Human Interface Device)を作れる。
■ Improved version of Digistump avr core for Arduino
GitHub - ArminJoDigistumpArduino Improved version of Digistump avr core for Arduino
https://github.com/ArminJo/DigistumpArduino
★additonal URL:
https://raw.githubusercontent.com/ArminJo/DigistumpArduino/master/package_digistump_index.json
Digistump AVR Boardsの代用で、いろいろ改良されているらしい。
今後触ってみたいと思っていた MH-ET LIVE Tiny88 というものも、Version 1.7.4までは対応していた。
■ MH-ET LIVE Boards
GitHub - MHEtLive/MHEtLiveArduino
https://github.com/MHEtLive/MHEtLiveArduino
★additonal URL:
https://raw.githubusercontent.com/MHEtLive/arduino-boards-index/master/package_mhetlive_index.json
MH-ET LIVE Tiny88 だけ、説明なさすぎ。
■ MightyCore
GitHub - MCUdude/MightyCore: Arduino hardware package for ATmega1284, ATmega644, ATmega324, ATmega324PB, ATmega164, ATmega32, ATmega16 and ATmega8535
https://github.com/MCUdude/MightyCore
★additonal URL:
https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json
大きめ、足多めのATmega使いたいとき。
■ esp8266
GitHub - esp8266/Arduino: ESP8266 core for Arduino
https://github.com/esp8266/Arduino
★additonal URL:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
■ esp32
GitHub - espressif/arduino-esp32: Arduino core for the ESP32
https://github.com/espressif/arduino-esp32
★additonal URL:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
■ Seeeduino Xiao
https://wiki.seeedstudio.com/jp/Seeeduino-XIAO/
★additonal URL:
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
■ Raspberry Pi Pico/RP2040
GitHub - earlephilhower/arduino-pico: Raspberry Pi Pico Arduino core, for all RP2040 boards
https://github.com/earlephilhower/arduino-pico
★additonal URL:
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
Raspberry Pi Picoは、Arduino公式版(ボードマネージャ追加不要)とearlephilhower/arduino pico版がある。これは後者。
追加したものは、以下に保存されるっぽい。
%appdata%\..\local\Arduino15\packages\
具体的には、、
C:\Users\%USERNAME%\AppData\Local\Arduino15\packages\
追加の.jsonファイルはその一つ上位のフォルダに。
★Digispark関連と、そのほか興味はあるけどまだ試していないボードの追加のボードマネージャのURL★
■ ATTinyCore by Spence Konde
Dr. Azzy's Electronics (作者のページ)
http://drazzy.com/e/
GitHub - SpenceKonde/ATTinyCore: Arduino core for ATtiny 1634, 828, x313, x4, x41, x5, x61, x7 and x8
https://github.com/SpenceKonde/ATTinyCore
ATTinyCore/Installation.md at master · SpenceKonde/ATTinyCore · GitHub
https://github.com/SpenceKonde/ATTinyCore/blob/master/Installation.md
★additonal URL:
http://drazzy.com/package_drazzy.com_index.json
ATtinyで遊ぶときに欠かせない。
これにもDigisparkが含まれている。
デフォルトだと、時間関連に対して、Timer0を使っている。(Digistumpはtimer1を使用)
DigiKeyboard.h などは使えない。
他に megaTinyCore というので tinyAVR 0/1/2-series 用のも作ってみえます。
■ kosakalab
Arduino IDE で ATtiny 他の開発 Make kosakalab
https://make.kosakalab.com/make/electronic-work/arduino-ide-dev/
★additonal URLs:
Arduino IDE に ATtiny10/13 の開発環境を組み込む
https://kimio-kosaka.github.io/bitDuino13/package_bitDuino13_index.json
Arduino IDE に ATmaga88P/328P/644P 他の開発環境を組み込む
https://kimio-kosaka.github.io/ATMegaCore/package_ATMegaCore_index.json
ATTinyCoreで対応していないATtiny13とか、足多めのATmega644Pとか。
■ Digistump AVR Boards
digisparktutorialsconnecting [Digistump Wiki]
http://digistump.com/wiki/digispark/tutorials/connecting
★additonal URL:
http://digistump.com/package_digistump_index.json
Digistump公式のかな。
Timer1を時間関連で使用されている。
DigiKeyboard.h などで簡単にHID (Human Interface Device)を作れる。
■ Improved version of Digistump avr core for Arduino
GitHub - ArminJoDigistumpArduino Improved version of Digistump avr core for Arduino
https://github.com/ArminJo/DigistumpArduino
★additonal URL:
https://raw.githubusercontent.com/ArminJo/DigistumpArduino/master/package_digistump_index.json
Digistump AVR Boardsの代用で、いろいろ改良されているらしい。
今後触ってみたいと思っていた MH-ET LIVE Tiny88 というものも、Version 1.7.4までは対応していた。
■ MH-ET LIVE Boards
GitHub - MHEtLive/MHEtLiveArduino
https://github.com/MHEtLive/MHEtLiveArduino
★additonal URL:
https://raw.githubusercontent.com/MHEtLive/arduino-boards-index/master/package_mhetlive_index.json
MH-ET LIVE Tiny88 だけ、説明なさすぎ。
■ MightyCore
GitHub - MCUdude/MightyCore: Arduino hardware package for ATmega1284, ATmega644, ATmega324, ATmega324PB, ATmega164, ATmega32, ATmega16 and ATmega8535
https://github.com/MCUdude/MightyCore
★additonal URL:
https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json
大きめ、足多めのATmega使いたいとき。
■ esp8266
GitHub - esp8266/Arduino: ESP8266 core for Arduino
https://github.com/esp8266/Arduino
★additonal URL:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
■ esp32
GitHub - espressif/arduino-esp32: Arduino core for the ESP32
https://github.com/espressif/arduino-esp32
★additonal URL:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
■ Seeeduino Xiao
https://wiki.seeedstudio.com/jp/Seeeduino-XIAO/
★additonal URL:
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
■ Raspberry Pi Pico/RP2040
GitHub - earlephilhower/arduino-pico: Raspberry Pi Pico Arduino core, for all RP2040 boards
https://github.com/earlephilhower/arduino-pico
★additonal URL:
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
Raspberry Pi Picoは、Arduino公式版(ボードマネージャ追加不要)とearlephilhower/arduino pico版がある。これは後者。
タグ:Digispark
Digispark 16.5MHzの謎に迫る [Arduino]
Digispark は V-USBのとき、16MHzではなく16.5MHzと気持ち(3%ほど)速めの設定になっています。
USBの処理のために3%ほど速くしてくれているのだと思います。(たぶん)
そもそもATtiny85は、外部クリスタルなしでは8MHzなのですが、そこからいろいろあって16MHzや16.5MHzを作りだしているようです。
そのあたりを調べてみました。
まずfuse。
工場出荷時と異なるのは、、
・Fuse Extended Byte
Self-programming enabledが、1→0で自己プログラミング機能が許可されています。
USBから書き込めるということでこれは当然。
・Fuse Low Byte
7ビット目のCKDIV8と、3~0ビット目のCKSEL3~CKSEL0が変更されています。
CKDIV8 は、0→1となり、システムクロックの8分周はしないということでこれも当然。
CKSEL3~CKSEL0 を CKSEL[3:0] 0001 に設定することで、
Clock source setting を High Frequency PLL Clock として、divided by four として、16MHz にしているようです。
つづいてRegister。
クロックに関係しそうなのは、CLKPR, PLLCSR, OSCCALです。
手持ちのDigisparkに以下のスケッチを書き込み、LEDの点灯時間を目視で確認することでこれらのレジスタの値を調べました。
・0x26 CLKPR (Clock Prescale Register)
CLKPS[3:0] Clock Division Factor のところで16MHz, 16.5MHz時は、分周なし(1分周), 8MHz時は2分周, 1MHz時は16分周となっていました。
・0x27 PLLCSR (PLL Control and Status Register)
Bit 7 – LSM: Low Speed Mode(32MHz) はそのまま 0 で高速モード(64MHz)。
Bit 2 – PCKE: PCK Enable もそのまま 0で、はタイマ/カウンタ1のクロック元はシステムクロック。
Bit 1 – PLLE: PLL Enable は1に変更されていますが、システムクロック元としてPLLが選択されているので当然。
Bit 0 – PLOCK: PLL Lock Detector も1に変更で、PLLが基準クロックに固定化されている、と。
・0x31 OSCCAL (Oscillator Calibration Register)
あらかじめ工場で設定された値が自動的に入るようにできているようです。
手持ちのDigisparkでは、
16/8/1MHz時は、0x91(10進で145) (おそらく工場での設定値のまま)
16.5MHz時は、0x99(10進で153)
となっていました。
このレジスタで3%のclock upをしていたようです。
USBの処理のために3%ほど速くしてくれているのだと思います。(たぶん)
そもそもATtiny85は、外部クリスタルなしでは8MHzなのですが、そこからいろいろあって16MHzや16.5MHzを作りだしているようです。
そのあたりを調べてみました。
まずfuse。
工場出荷時と異なるのは、、
・Fuse Extended Byte
Self-programming enabledが、1→0で自己プログラミング機能が許可されています。
USBから書き込めるということでこれは当然。
・Fuse Low Byte
7ビット目のCKDIV8と、3~0ビット目のCKSEL3~CKSEL0が変更されています。
CKDIV8 は、0→1となり、システムクロックの8分周はしないということでこれも当然。
CKSEL3~CKSEL0 を CKSEL[3:0] 0001 に設定することで、
Clock source setting を High Frequency PLL Clock として、divided by four として、16MHz にしているようです。
つづいてRegister。
クロックに関係しそうなのは、CLKPR, PLLCSR, OSCCALです。
手持ちのDigisparkに以下のスケッチを書き込み、LEDの点灯時間を目視で確認することでこれらのレジスタの値を調べました。
#define isBitSet(byte, bit) ((byte) & (1 << (bit)))
void setup() {
pinMode( 0, INPUT_PULLUP ); // tactile switch
pinMode( 1, OUTPUT ); // builtin LED
}
void loop() {
uint8_t i;
while( digitalRead(0) );
delay(1000);
//0x31 OSCCAL
for(i=0; i<8; i++) {
digitalWrite( 1, HIGH);
delay( isBitSet( OSCCAL, 7-i) ? 500: 100 );
digitalWrite( 1, LOW );
delay(500);
}
delay(2000);
// 0x27 PLLCSR
for(i=0; i<8; i++) {
digitalWrite( 1, HIGH);
delay( isBitSet( PLLCSR, 7-i) ? 500: 100 );
digitalWrite( 1, LOW );
delay(500);
}
delay(2000);
// 0x26 CLKPR
for(i=0; i<8; i++) {
digitalWrite( 1, HIGH);
delay( isBitSet( CLKPR, 7-i) ? 500: 100 );
digitalWrite( 1, LOW );
delay(500);
}
}
・0x26 CLKPR (Clock Prescale Register)
CLKPS[3:0] Clock Division Factor のところで16MHz, 16.5MHz時は、分周なし(1分周), 8MHz時は2分周, 1MHz時は16分周となっていました。
・0x27 PLLCSR (PLL Control and Status Register)
Bit 7 – LSM: Low Speed Mode(32MHz) はそのまま 0 で高速モード(64MHz)。
Bit 2 – PCKE: PCK Enable もそのまま 0で、はタイマ/カウンタ1のクロック元はシステムクロック。
Bit 1 – PLLE: PLL Enable は1に変更されていますが、システムクロック元としてPLLが選択されているので当然。
Bit 0 – PLOCK: PLL Lock Detector も1に変更で、PLLが基準クロックに固定化されている、と。
・0x31 OSCCAL (Oscillator Calibration Register)
あらかじめ工場で設定された値が自動的に入るようにできているようです。
手持ちのDigisparkでは、
16/8/1MHz時は、0x91(10進で145) (おそらく工場での設定値のまま)
16.5MHz時は、0x99(10進で153)
となっていました。
このレジスタで3%のclock upをしていたようです。
タグ:Digispark