SSブログ

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のコンデンサとなっていました。

waveformgenerator.png
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

できあいのアンプとつないでみました。
sp_amp.jpg
そのままアンプにつなぐと、音が大きすぎて音が割れるので、回路図のとおり10kΩの半固定抵抗をつけました。



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

Digispark関連の追加のボードマネージャのURL [Arduino]

Digispark関連の追加のボードマネージャのURL (additonal Boards Manager URLs)
addboards.png

追加したものは、以下に保存されるっぽい。

%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
nice!(0)  コメント(0) 

Digispark 16.5MHzの謎に迫る [Arduino]

Digispark は V-USBのとき、16MHzではなく16.5MHzと気持ち(3%ほど)速めの設定になっています。
USBの処理のために3%ほど速くしてくれているのだと思います。(たぶん)

そもそもATtiny85は、外部クリスタルなしでは8MHzなのですが、そこからいろいろあって16MHzや16.5MHzを作りだしているようです。
そのあたりを調べてみました。

まずfuse。
ds_fuse.png
工場出荷時と異なるのは、、

・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);
    }
}

ds_reg.png
・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
nice!(0)  コメント(0)