xmega32D4には4つの16bitタイマーが搭載されている。
うち3つは4つの比較チャネルを持っていて、残りの1つは2つの比較チャネルを持っている。
TCxx.CCA, TCxx.CCB, TCxx.CCC, TCxx.CCDで比較対象となる値を設定する。
これらを使って4通りの周波数で14本のPWMを出力できる。
xmegaは入出力ポートがとても高機能になっていて、ピン再割当機能を使ってPWM出力をOR変調できたり、ピンn形態設定レジスタ(PORTx.PINnCTRL)を使ってIOピンの出力形態をデフォルトのコンプリメンタリからワイヤードOR、ANDに切り替えれたりもする。これは2和音矩形波出力を行う時に便利に使えそう(๑╹ڡ╹๑)
以下ソースコード
/* * ATxmega32D4_test.c * * Created: 2013/10/13 14:06:52 * Author: kingyo * * ライタの接続 * Vcc: Vcc * GND: GND * MISO: PDI_DATA(34pin) * RESET: PDI_CLK(35pin) * */ #include <avr/io.h> #define F_CPU 32000000UL // 32 MHz #include <util/delay.h> int main(void) { /* IOポート設定 */ PORTC.DIR = 0xff; // ポートCを出力に PORTD.DIR = 0xff; // ポートDを出力に PORTE.DIR = 0x0f; // ポートEを出力に /* クロック設定 内蔵CR32MHz */ OSC.CTRL |= OSC_RC32MEN_bm; // 32MHz内部発振を許可 while(!(OSC.STATUS & 0b00000010)); // 安定化待ち CPU_CCP = CCP_IOREG_gc; // 設定変更許可 CLK.CTRL = CLK_SCLKSEL_RC32M_gc; // 32MHzに設定 //DFLLRC32M.CALA = 0xff; // DFLL校正レジスタ弄り //DFLLRC32M.CALB = 0xff; /* 16bitタイマC0 (CCA, CCB, CCC, CCDの4本) */ TCC0.PER = 10000; // カウンタ上限値 TCC0.CCA = 5000; // (出力はPORTC.0) TCC0.CTRLB = 0b00010011; // CCAEN, 単一傾斜PWM TCC0.CTRLA = 0b00000001; // 前置分周器: clkPER /* 16bitタイマC1 (CCA, CCBの2本) */ TCC1.PER = 500; // カウンタ上限値 TCC1.CCA = 200; // (出力はPORTC.4) TCC1.CTRLB = 0b00010011; // CCAEN, 単一傾斜PWM TCC1.CTRLA = 0b00000001; // 前置分周器: clkPER /* 16bitタイマD0 (CCA, CCB, CCC, CCDの4本) */ TCD0.PER = 500; // カウンタ上限値 TCD0.CCA = 200; // (出力はPORTD.0) TCD0.CTRLB = 0b00010011; // CCAEN, 単一傾斜PWM TCD0.CTRLA = 0b00000001; // 前置分周器: clkPER /* 16bitタイマE0 (CCA, CCB, CCC, CCDの4本) */ TCE0.PER = 10001; // カウンタ上限値 TCE0.CCA = 5000; // (出力はPORTE.0) TCE0.CTRLB = 0b00010011; // CCAEN, 単一傾斜PWM TCE0.CTRLA = 0b00000001; // 前置分周器: clkPER }今回はじめてソースコードをハイライト表示するSyntaxHighlighterってのを使ってみた。
割と良さげ。
~ おわり ~
0 件のコメント:
コメントを投稿