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 件のコメント:
コメントを投稿