CH32V003で和音
GPIOの扱いが面倒
リポジトリの構成をどうするのが良いのか・・
platformioでうまいことlibを使って何とかなるものなのか?
- ちょっとうまくいかない
- この辺を真似させてもらおう
- ch32v003funはMITライセンスなので難しいことはない
和音を鳴らす
加算合成してもうまくいかない
- →凡ミスだった、うまくいった
PWMのキャリア周波数はどうなっている?
- 10MHzっぽい十分そう
- ノコギリ波より矩形波の方が聞き取りやすかった
- メロディっぽいのもできた
- 容量
> pre
RAM: = 7.4% (used 152 bytes from 2048 bytes) Flash: == 18.1% (used 2968 bytes from 16384 bytes) <<
まだまだ容量がある
ここまで来たら楽器が作れるぞ
音階を鳴らす
- ドレミを鳴らしたい
- 11kHz前提で音程のテーブルを作るかな
- ラ
- {{calc 256/(11000/440)*8}}
- {{calc 256/(11000/493.883)*8}}
- {{calc 256/(11000/523.251)*8}}
- {{calc 256/(11000/587.330)*8}}
- {{calc 256/(11000/659.225)*8}}
- {{calc 256/(11000/698.456)*8}}
- {{calc 256/(11000/783.991)*8}}
- {{calc 256/(11000/880.000)*8}}
- こういう計算で良いのかな?
- 値が小さすぎるのでオシレータの量子化ビットは256より大きくして、出力時に丸めるとかがよさそう
動いたっぽい
音を鳴らす
systick_irqの割込みで可聴域の音を鳴らしてみたい
オシレータのようなものを作ってPWMに引き渡せば良さそう
- {{calc 48*1000*1000/(11*1000)}}サイクル毎に割り込むとかでいいか
- {{calc 48*1000*1000/(4363)}}Hz
- そうね11kHz
- このサイクルで440Hz出す場合
- {{calc 11000/440}}
- で1周するようなオシレータを作れば良さそう
- {{calc 256/25}}くらいを足していけばよい
できたぞ
11kHzの割込み(割込み処理でずれると思うので、概算だけど)で音を鳴らすことが出来た
スピーカーを直接駆動してもOKだった
シリアルコンソール?
funconfig.hにフラグを設定すると良い
> code
#define FUNCONF_UART_PRINTF_BAUD 115200 <<
これを書き換えた後はビルドキャッシュを消さないと反映されないので注意
普通にシリアルモニタで見える
tim2 + systick_irq
- tim2_pwmをもとにしてsistick_irqを混ぜていく
- なんかおかしい
- 起動時に変な待ち時間があるし、その後のPWMのループが妙に早い
- Delay_Msの実装が気になる
- でもsistick_irqでもDelay_Msを使っているな
- tim2_init -> systick_initになっているのが良くない?
- UARTデバッグしたい
- systickでPWMを制御できた
- 1000カウントくらいでPWM制御ができれば良さそう
- なんで以下で早くなったか不明
sistick_irq
- pwmのオーバーフローの割込みでもよいのだが、記載が見当たらない
- ということでシステムクロックによる割込みでも良いか、、という気持ち
- FUNCONF_SYSTEM_CORE_CLOCK/1000 clock間隔という指定になっている
- コメントには1msと書いてある
- FUNCONF_SYSTEM_CORE_CLOCK は Computed Clock in Hz とのこと
- 1clockあたりの時間 = 1/FUNCONF_SYSTEM_CORE_CLOCK s
- 1ms / 1clockあたりの時間 = 1ms *FUNCONF_SYSTEM_CORE_CLOCK = FUNCONF_SYSTEM_CORE_CLOCK * 1/1000s = FUNCONF_SYSTEM_CORE_CLOCK/1000
- こういうことね
- RakuChordのときは
- 16MHz/0xFFの周期で割り込んでいたはず
- {{calc 16*1000*1000/256}}Hz
- {{calc 16*1000*1000/256/1000/2}}kHz
- CDが44.1kHz
- 妥当そう
- で、この時は{{calc 1/(44.1*1000)}}s
- FUNCONF_SYSTEM_CORE_CLOCK / (44.1k)
- FUNCONF_SYSTEM_CORE_CLOCK が48MHzとすると
- {{calc 48*1000*1000/(44.1*1000)}}
- くらい
- 1000クロック間隔くらいで割込みを入れるということ
tim2_pwm
- ポート
- PD04, PD3
- オンボードのLED(PD04)はこっちだ!
- 開発ボードに書き込んだら動いた!
- メインループで5msのウェイトをかけてゆっくり明るくしている
- {{calc 255*5/1000}}sで1周
tim1_pwm
ただ開発ボードに入れただけだと光らなかった
ポートが違う?
- PD0、PC4と書かれている
CH32V003fun 環境構築
platformioでやりたい
特別なGCC10が必要っぽい
今更VS Code用のPlatformioを入れる
サンプルプロジェクトはビルドが通った
普通にCLIでも通ったわ、同じplatformioが使われている模様
書き込みはplatformioでできるか?
実行しようとするとtool-wch-ispのダウンロードが始まる
しかしうまくいかない
WCH-LinkUtilityの公式インストーラを一度実行するとドライバが入る
これ以降platformioでも書き込みできるようになった
WCH-LinkEはPCに直挿しなので扱いにくい、特に開発ボードの向きがノートパソコンに対して下の方向に出っ張っているのでやりにくい
まぁ取り敢えずLチカできた
Blinkは D0, D4, D6, C0を点滅させている?
オンボードのLEDはD4とつながっていた
まずやること
ch32v003funの環境構築
- PWMのコードでLEDをfadeさせる
参考
- システムのタイマー割込み
- PWM出力
- 10MHz
- 10MHz
PWMでオーディオ出力をしつつ、システムタイマーで波形を計算すると良い?
- MIDI音源を作る例