C-SizeDCC 改訂版3
アナログとデジタルの出力を分離
アナログモードのPWM周波数を31KHzにするためC-SizeDCCの回路を再度変更しました。ターンアウトデコーダをドライブ出来ないTB67H450をアナログ出力専用とし、アナログモード時のデジタル出力はアクセサリパケットのみを送出する事にしました。フィーダ線の繋ぎ換えが面倒ですが、価格が高いTB6643KQを一個にして少しだけコストダウンしました。一方、ATMEGA328PのArduino NanoはTCCR2Bをデジタルパケットの生成に使っていてD3,D11が使えませんので、ミント缶と同じくデジタル出力のD9、D10からPWMを送出して、アナログモードの自動運転は諦めます。
ATMEGA4809のPWM
Arduino Nano EveryでPWMを31KHzにする方法が分からなかったので、forum.arduino.cc の書き込みを拝借しました。
#if defined(__AVR_ATmega4809__)
// D3,D6 pwm output
PORTMUX.TCBROUTEA |= PORTMUX_TCB1_bm; // 0:PA3 -> 1:PF5(~D3)
PORTMUX.TCBROUTEA |= PORTMUX_TCB0_bm; // 0:PA2 -> 1:PF4(~D6)
// TCB1 Mode
TCB1.CTRLB = 0 << TCB_ASYNC_bp /* Asynchronous Enable: disabled */
| 1 << TCB_CCMPEN_bp /* Pin Output Enable: enabled */
| 0 << TCB_CCMPINIT_bp /* Pin Initial State: disabled */
| TCB_CNTMODE_PWM8_gc; /* 8-bit PWM */
// TCB1 Clock select
TCB1.CTRLA = TCB_CLKSEL_CLKDIV2_gc; /* CLK_PER (1/2) */
TCB1.CTRLA |= TCB_ENABLE_bm;
// TCB0 Mode
TCB0.CTRLB = 0 << TCB_ASYNC_bp /* Asynchronous Enable: disabled */
| 1 << TCB_CCMPEN_bp /* Pin Output Enable: enabled */
| 0 << TCB_CCMPINIT_bp /* Pin Initial State: disabled */
| TCB_CNTMODE_PWM8_gc; /* 8-bit PWM */
// TCB0 Clock select
TCB0.CTRLA = TCB_CLKSEL_CLKDIV2_gc; /* CLK_PER (1/2) */
TCB0.CTRLA |= TCB_ENABLE_bm;
#endif
I/O Multiplexingを使ってTCB1とTCB0のアサインをD3とD6に切り替えるのが肝です。TCBクロックをシステムタイマーの1/2に設定しています。
« C-SizeDCC 改訂版その2 | トップページ | C-SizeDCC 改訂版4 »
「コントローラ」カテゴリの記事
- wio terminalその4(2022.05.02)
- wio terminalその3(2022.04.22)
- wio terminalその2(2022.04.14)
- ALTOISサイズ缶(2022.04.03)
- Wio Terminal(2022.01.29)
コメント