■更新情報・雑記

第6回エフェクタービルダーズ・コンテストに向けて揺れ系エフェクターを開発中です。



■ATtiny85 タップテンポ付LFO その2

14_229_1atLFO2.png
前回のLFOをさらに発展させました。主な変更点は下記の通りです。考え方は前回と同じで、一定間隔でPWMのデューティ比を変更します。
・1周期126分割→510分割(PWMの分解能8ビット分をフルに生かせる)
・PWM周波数31.25kHz→250kHz(出力ピンPB0→PB1)
・タイマー割り込みを使ってPWMデューティ比を変更、タップ時間計測

タイマー・割り込みに関する詳細説明は省きます。ATtiny85(日本語データシートpdf)は2つのタイマーがあり、Timer0でデューティ比変更時間の管理とタップテンポの時間計測をし、Timer1でPWMを使います。該当レジスタを変更することにより様々な設定を行うわけですが、見慣れないビット演算が出てくるので最初は戸惑うかもしれません。
参考ページ→C言語入門::付録 ビット演算びんずめ堂)・AVRでのタイマとPWMの使い方うしこlog)・AVRでの割り込みの使い方うしこlog

今回のスケッチでは三角波を生成しています。ATtiny85のPWMを最高速で動作させるため、Arduino IDEのツールメニューから「Timer1 Clock: "64MHz"」を選択し「ブートローダを書き込む」という操作を行っておく必要があります。

▽Arduinoスケッチ
表示/非表示切替(94行)



<タップ時間計測について>
Timer0に比較A割り込みを設定している関係で、millis関数で時刻を取得しようとしてもうまくいきません。タップ時間の測定は割り込み回数をカウントすることにより行います。Timer0はクロック8MHz、8分周なので最小時間単位は1usです。OCR0Aを200にすると200usごとに割り込みが発生します。

【例】0.2msごとに割り込みが発生(OCR0A=200)→割り込みが50回発生(timeCount=50)→経過時間10ms(0.2ms×50)

OCR0Aを更新する時に、更新前の時間(timeTemp)を計算しておく必要があります(スケッチ最下部)。TCNT0も加味した方がより正確ですが、そこまでの精度は必要ないでしょう。タップについては1回目と2回目の区別はなく、毎回前回タップからの経過時間を計算します。経過時間が設定可能なLFO周期内であるときだけ、実際に周期を変更することになります。



<デューティ比変更間隔時間の計算処理について>
OCR0Aを200とし、割り込みが発生する度にデューティ比を変更すると、周期は102ms(0.2ms×510)です。OCR0Aは255まで(8ビット)なので、このままでは周期を長く設定できません。分周比を変えることも考えましたが時間分解能が悪くなります。そこで長い周期を得るために、何回か割り込みが発生した時にデューティ比を変更するようにします。

【例】0.2msごとに割り込みが発生(OCR0A=200)→割り込みが10回発生(rateCountNum=10)するごとにデューティ比変更→周期1020ms(0.2ms×10×510)

次は逆に周期から割り込み間隔と回数を計算します(上記スケッチのrateCalc関数)。ちょっと無理やり感がありますが、100~255usの割り込み間隔で割った商(=割り込み回数)と余り(=誤差)を全て計算し、余りが最小になる時を採用します。割り込み間隔はあまりに狭いと問題がありそうなので、100us以上としました。

【例】最適値計算:周期1030ms(1030000us)→デューティ比変更間隔時間2019us(1030000÷510切捨)→224us(割り込み間隔)×9(回数)+3us(誤差)
計算値設定後:0.224msごとに割り込みが発生(OCR0A=224)→割り込みが9回発生(rateCountNum=9)するごとにデューティ比変更→周期1028ms(0.224ms×9×510)


ほとんどの場合で周期の誤差は2ms以内に収まります。実は上記例では2019usを+1usして再計算したほうが誤差が減るのですが、そこまでの計算はしないことにします。

■タグ : マイコン

■ATtiny85 タップテンポ付LFO その1

14_228_1atLFO.jpg
モジュレーション系のエフェクターを作る場合Low Frequency Oscillator(LFO)は必須となりますが、タップテンポ機能をつけたかったのでマイコンを利用しました。2ループスイッチャーのときと同じATtiny85で、接続は上図右です。参考サイト→Arduino: LFO Generator
上記サイトのスケッチもなんとなく理解したつもりですが、初心者(私)向けに自分でプログラミングしてみることにしました。※あまり高品質ではないと思います。

下図は周期126msの三角波の例です。PWMについての詳細説明は省略します。analogWrite関数でPWM出力のデューティ比を変更することにより、256段階の電圧が出力できると大雑把に考えておけばよいかと思います。
14_228_2atLFOs.png
1周期を126分割して考え、1ms経過するごとに4ずつデューティ比を変化させます。1msではなく1.024ms間隔にしたときは、1.024×126で周期129msです。このようにデューティ比変更間隔時間を変えることで周期を変化させます。実測では少しずれるので補正を入れます。

下記スケッチでは予め計算した配列を用意し、正弦波を生成しています。ATtiny85を8MHzで動作させるため、Arduino IDEのツールメニューから「Clock: "8 MHz (internal)"」を選択し「ブートローダを書き込む」という操作を行っておく必要があります。

▽Arduinoスケッチ
表示/非表示切替(69行)
タップテンポについては、単純にスイッチを押した間隔を計算します(間隔が長すぎる場合は設定変更されません)。delayMicrosecondsはPWM高速化の影響なのか実測すると待機時間が1.6倍程度になっていました。割り込み機能も考えたのですが、いろいろと制約があるので今回は使いませんでした。

PWM出力に2.2kΩ抵抗器と1μFコンデンサのローパスフィルター(カットオフ周波数72Hz)を通し、オシロスコープで波形を確認しました。
14_228_3atLFOw.png
遠目に見るとよさそうなのですが、拡大すると結構ギザギザです。このままエフェクターに利用できるのかどうかは不明です。

<時間分解能を上げるには>
micros関数での時刻取得には0.01ms程度時間がかかってしまうため、 これが時間計測の最小単位となります。やはり参考サイトにあるようにタイマー割り込みを使うべきでしょう。さらにできれば8ビットではなく16ビットタイマー付きのマイコンを使いたいところです。

---以下2018年8月25日追記---

途中で(おそらくオーバーフロー時)止まる不具合がありましたが、LFO部分の条件式を以下のように修正したところ解決したようです。参考ページ→millis()のオーバーフローの実験
micros() / 64 > preTime + rate - 300

micros() / 64 - preTime > rate - 300

■タグ : マイコン

■MOOER Micro Preamp 006 分解

14_227_1mp006p.jpg
前回特性測定したMOOER Micro Preamp 006ですが、ろくに弾きもせずに分解してしまいました。中身がどんなものか記録しておきます。

フットスイッチはバネで基板上のスイッチを押すタイプです。長押し機能が実装されている関係で、オンオフ切替やチャンネル切替はフットスイッチを押した時ではなく離した時になっています。DCジャックは基板直付けではなくコネクタが使われていました。ケースのみの大きさは縦91mm横37mm高さ31mmで、縦横はHAMMOND 1590Aより1.5mmほど小さいです。基板は2枚重ねで、はんだ付けされたピンヘッダを取り除かないと分解できません。無事に元に戻せましたが、結構大変でリスクが高いと思います。

▽基板写真
14_227_2mp006p.jpg 14_227_4mp006p.jpg
左側基板には黒いゴムの円柱があり、基板同士の隙間を保つために取り付けてあるようです。ジャック上側にはバイパス用と思われるリレー(HFD4/3)があります。定電圧レギュレータはμPC29M08とAMS1117です。

▽IC類写真
14_227_3mp006p.jpg 14_227_5mp006p.jpg
左写真右上のIC(印字「415 XTFM」)は415の左隣の文字がかすれていて役割がわかりませんでした。その他のICは下記の通りです。
・MC33078 → オペアンプ
・TLC2262 → オペアンプ
・CS4272 → オーディオコーデック(ADC/DAC)
・GD25Q41BT → フラッシュメモリ
・ADSP-21477 → DSP
・STM32F030F4P6 → マイコン

■MOOER Micro Preamp 006 特性測定

14_226_1mp006p.jpg
MOOER Micro Preampは小型デジタルプリアンプということで、中身が気になり購入してみました。元になったモデルはぼかしてあることが多いですが、006の場合「Based on Fender blues deluxe」と公式動画に記載があります。とりあえずろくに弾きもせずに特性を測定しました。以下オーバードライブチャンネル(LEDが赤に点灯)をAch、クリーンチャネル(LEDが青に点灯)をBchと表記しています。

▽波形・倍音(Ach)
14_226_2mp006g.png
真空管の歪みのはずですが、特に偶数次倍音が出やすいというわけではありませんでした。

▽周波数特性
<ゲイン変更・キャビネットシミュレータ>
AchとBchで1kHz時同じ音量になるように調整しています。BASS、MID、TRE全て5(12時の位置)です。
14_226_3mp006g.png
AchではBchより高域と低域が削られていることがわかります。ゲインを上げた時の特性変化はほとんどなく、わずかに高域が落ちる程度です。キャビネットシミュレータをオンにした時の変化幅はAchとBchで変わりません。

<Ach>
14_226_4mp006g.png
<Bch>
14_226_5mp006g.png
トーンコントロールの効き方はAchとBchで変わりません。あまり変化幅は大きくなく、BASSとMIDはグラフィックイコライザの変化のような感じに見えます。マニュアルには下記のように記載があるので、コントロールの変化の仕方は元になったモデルと同じではないということがわかります。
3つのノブを全て12時の位置にするとプリアンプはMooerにてアナライズした時のサウンドになります。時計回りで周波数をブーストし、反時計回りでカットします。各ノブの帯域はモデルごとに最適に調整されています。

▽レイテンシー→測定方法はこちら
14_226_6mp006w.png
約0.6msです。1ms以下というのがもはや当たり前になっているのかもしれません。

ノイズも測定しようとしましたが、私の環境では測定限界以下だったので特に問題ないでしょう。ハードウェアについては別記事にしました。→MOOER Micro Preamp 006 分解

管理人

ブログ内検索

メールフォーム

当ブログに関するお問い合わせはこちらからお願いします。 ※FAQ(よくある質問)もお読みください。

お名前
メールアドレス
件名
本文

アクセスカウンター