VVVFをBEMFスケッチにつなげるその3 [ds-DCCデコーダ]
さて、前回、Yaasan様にTimer2とTimer1交換しないといい音が鳴りません!とコメントしたら、デコーダ開発ボードの基板をいただきました。というわけで、Timer2とTimer1の入れかえ実験のスタートです。
一応おさらいですが、ATMEGA328の制約で、
・Timer1は周波数(音の高さ)とDuty(音の大きさやモーターの速さ)をTimer1ライブラリを使用して連続的に同時に変更ができます。またカウンタは16ビットで細かく制御可能です。
・Timer2では周波数(音の高さ)またはDuty(音の大きさやモーターの速さ)のどちらかしか連続的に変更できません。カウンタは8ビットで255段階しか制御できません。
ですので、モーターを回すだけならTimer1、Timer2のどっちでも可能です。
また、音を出すだけならこちらもTimer1,Timer2のどっちでも可能です。
しかし、音の変化をつけるために、音の高さをいじりつつDutyもいじるとなると、Timer1しかできません。
ということで、贅沢を言うならTimer1とTimer2を変えてくれと言っておりました。
(もう一つ、Timer2を使うとうまく割り込みがかけられずに音の変化をつけにくいという、たんなる力不足な事情のあったのだが)
そして、いただいた基板を早速配線を切って貼ってです。
Timer1はD9、D10でこれがモータードライバのBD6231F につながっているのですが、ここをTimer2のD3とD11に変更します。D3はもともとSoundOption出力として、D11はISP出力で出ていますので、ここを流用します。
Timer1はD9からPAM8012の+出力にジャンパを飛ばしてつなぎます。(もちろんD3からのつなぎは直前でジャンパカットします)
完成です。(ただし、100kΩがなかったから100kΩ→47kΩにしている)
そしてPAM8012をのせたら、近所迷惑な感じでうるさかったので、アンプ386基板につなげてスピーカーに出力しています。こっちだと、一応ボリュームがついていますので、音を小さくすることが可能です(微妙ですが)。あとは、LPFをつけています。計算はこちらのページを使わさせていただいており、1uFと22Ωが付けたので、7KHzぐらいまで通るそうです(コンデンサを0.1uFにしときゃよかった・・・。)
そして、スケッチの改造です。
まずはモーターをD9,D10→D3、D11へ移動です。と言っても、ピンを変えてやって、あとはTimer1の31kHzの宣言である
TCCR1B &= B11111000;
TCCR1B |= B00000001;
をTimer2のほうに持っていくだけです。
上記で何をやっているかというと、私家版データシートを参考に確認すると、
分周のCS12~CS10を001に設定してやって「clkI/O (前置分周なし)」に設定しています。
これと同様のことをTimer2でやろうとすると、目的のビットはTimer1と同じ場所にありました。
ですので、
TCCR2B &= B11111000;
TCCR2B |= B00000001;
です。
ビットによっては、なんかずいぶん場所が違うのですが、分周関連は一緒みたいですね。
で、これだけで動きました。(BEMFは未確認)
次に、VVVFですが、こちらは、いろいろとごにょごにょとやって、まあ、動きました。
スケッチはこちらです。Timer1はGPLじゃないやつでの動作確認しかしていません。
CV47を2にして吊りかけ音風にして、
で、いろいろとCV48で音の出し方(繰り返し)を変えてみました。
VVVFの配列(Kasoku配列という名前)は音を出すために周波数1、周波数2を持っていて、大体周波数2は周波数1の倍音にしています。
(CV48)
0:周波数1だけを鳴らす
1:周波数1を1回、周波数2を1回鳴らす
2:周波数1を1回、周波数2を2回鳴らす
3:周波数1を1回、周波数2を3回鳴らす
4:周波数1だけを鳴らす。
5:周波数1を1回、周波数1の倍音を1回鳴らす。
6:周波数1を1回、周波数1の倍音を1回、周波数1の3倍音を1回鳴らす。
7:周波数1を1回、周波数1の倍音を1回、周波数1の3倍音を1回、周波数1の4倍音を1回鳴らす。
としています。毎回割り込みは入れていますが、ちゃんと割り込んでくれているかどうかは確認していません。
また、Dutyは今回はいじっていません。
Dutyを0にすると無音になりますので、それを使用してCV47のVVVF配列の切り替えは0番を無音にしています。(周波数自体はE231用が入っている)
微妙にDutyはボリューム替わりに使えるようです。ただし、線形に大きくなるわけでもなく、微妙にです。
で、動画です。CV48の0、4にあたるものがTimer2同等です。
DSMainR5の箱をエンクロージャ替わりに使っていたりします。
CV48を順に再生していますが、字幕をOnにすると、今、どのモードかを説明しています。
一応おさらいですが、ATMEGA328の制約で、
・Timer1は周波数(音の高さ)とDuty(音の大きさやモーターの速さ)をTimer1ライブラリを使用して連続的に同時に変更ができます。またカウンタは16ビットで細かく制御可能です。
・Timer2では周波数(音の高さ)またはDuty(音の大きさやモーターの速さ)のどちらかしか連続的に変更できません。カウンタは8ビットで255段階しか制御できません。
ですので、モーターを回すだけならTimer1、Timer2のどっちでも可能です。
また、音を出すだけならこちらもTimer1,Timer2のどっちでも可能です。
しかし、音の変化をつけるために、音の高さをいじりつつDutyもいじるとなると、Timer1しかできません。
ということで、贅沢を言うならTimer1とTimer2を変えてくれと言っておりました。
(もう一つ、Timer2を使うとうまく割り込みがかけられずに音の変化をつけにくいという、たんなる力不足な事情のあったのだが)
そして、いただいた基板を早速配線を切って貼ってです。
Timer1はD9、D10でこれがモータードライバのBD6231F につながっているのですが、ここをTimer2のD3とD11に変更します。D3はもともとSoundOption出力として、D11はISP出力で出ていますので、ここを流用します。
Timer1はD9からPAM8012の+出力にジャンパを飛ばしてつなぎます。(もちろんD3からのつなぎは直前でジャンパカットします)
完成です。(ただし、100kΩがなかったから100kΩ→47kΩにしている)
そしてPAM8012をのせたら、近所迷惑な感じでうるさかったので、アンプ386基板につなげてスピーカーに出力しています。こっちだと、一応ボリュームがついていますので、音を小さくすることが可能です(微妙ですが)。あとは、LPFをつけています。計算はこちらのページを使わさせていただいており、1uFと22Ωが付けたので、7KHzぐらいまで通るそうです(コンデンサを0.1uFにしときゃよかった・・・。)
そして、スケッチの改造です。
まずはモーターをD9,D10→D3、D11へ移動です。と言っても、ピンを変えてやって、あとはTimer1の31kHzの宣言である
TCCR1B &= B11111000;
TCCR1B |= B00000001;
をTimer2のほうに持っていくだけです。
上記で何をやっているかというと、私家版データシートを参考に確認すると、
分周のCS12~CS10を001に設定してやって「clkI/O (前置分周なし)」に設定しています。
これと同様のことをTimer2でやろうとすると、目的のビットはTimer1と同じ場所にありました。
ですので、
TCCR2B &= B11111000;
TCCR2B |= B00000001;
です。
ビットによっては、なんかずいぶん場所が違うのですが、分周関連は一緒みたいですね。
で、これだけで動きました。(BEMFは未確認)
次に、VVVFですが、こちらは、いろいろとごにょごにょとやって、まあ、動きました。
スケッチはこちらです。Timer1はGPLじゃないやつでの動作確認しかしていません。
CV47を2にして吊りかけ音風にして、
で、いろいろとCV48で音の出し方(繰り返し)を変えてみました。
VVVFの配列(Kasoku配列という名前)は音を出すために周波数1、周波数2を持っていて、大体周波数2は周波数1の倍音にしています。
(CV48)
0:周波数1だけを鳴らす
1:周波数1を1回、周波数2を1回鳴らす
2:周波数1を1回、周波数2を2回鳴らす
3:周波数1を1回、周波数2を3回鳴らす
4:周波数1だけを鳴らす。
5:周波数1を1回、周波数1の倍音を1回鳴らす。
6:周波数1を1回、周波数1の倍音を1回、周波数1の3倍音を1回鳴らす。
7:周波数1を1回、周波数1の倍音を1回、周波数1の3倍音を1回、周波数1の4倍音を1回鳴らす。
としています。毎回割り込みは入れていますが、ちゃんと割り込んでくれているかどうかは確認していません。
また、Dutyは今回はいじっていません。
Dutyを0にすると無音になりますので、それを使用してCV47のVVVF配列の切り替えは0番を無音にしています。(周波数自体はE231用が入っている)
微妙にDutyはボリューム替わりに使えるようです。ただし、線形に大きくなるわけでもなく、微妙にです。
で、動画です。CV48の0、4にあたるものがTimer2同等です。
DSMainR5の箱をエンクロージャ替わりに使っていたりします。
CV48を順に再生していますが、字幕をOnにすると、今、どのモードかを説明しています。
2016-10-08 22:18
コメント(0)
トラックバック(0)
コメント 0