無料ブログはココログ

« C-SizeDCC 改訂版その2 | トップページ | C-SizeDCC 改訂版4 »

2020年9月22日 (火)

C-SizeDCC 改訂版3

アナログとデジタルの出力を分離

アナログモードのPWM周波数を31KHzにするためC-SizeDCCの回路を再度変更しました。ターンアウトデコーダをドライブ出来ないTB67H450をアナログ出力専用とし、アナログモード時のデジタル出力はアクセサリパケットのみを送出する事にしました。フィーダ線の繋ぎ換えが面倒ですが、価格が高いTB6643KQを一個にして少しだけコストダウンしました。一方、ATMEGA328PのArduino NanoはTCCR2Bをデジタルパケットの生成に使っていてD3,D11が使えませんので、ミント缶と同じくデジタル出力のD9、D10からPWMを送出して、アナログモードの自動運転は諦めます。

Csizedccb_sch

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に設定しています。

ProbePwm_dcc

« C-SizeDCC 改訂版その2 | トップページ | C-SizeDCC 改訂版4 »

コントローラ」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« C-SizeDCC 改訂版その2 | トップページ | C-SizeDCC 改訂版4 »