3種類あるtinyAVR系統、その中でtinyAVR1系統だけに
入っている「12bitタイマ TCD0」。
この波形出力機能を使って2相パルスを出してみました。
利用するのは「1傾斜動作」。
データシートにはこのような例が記されています。

カウントアップされる12bitカウンタと
CMPASET、CMPACLR
CMPBSET、CMPBCLR
4つの比較レジスタとの一致で2つの出力波形が生成
されます。
CMPASET、CMPACLR、CMPBSET、CMPBCLRの順番を
うまくセットすれば2相パルス出力が得られます。

実験した回路。
使ったのは14ピンのATtiny1614。
「0~F」を設定できるデジタル・スイッチで16種の
出力周波数を得ました。
試した最高周波数が1MHz。
EXTCLKに入れたパルスを元に、ハードウェアが
2相パルスを出してくれます。
16bitタイマのTCA0を使って
EXTCLKを発生させてます。
ですので、Arduino UNO R3で苦労したコンペアマッチ
割り込みの遅れ、これは気にしなくてかまいません。
10kHzの2相パルス(割り込み周期25us)が
限度でした
1MHzの2相パルス出力をオシロで見た波形

「何発出したらストップ!」をしたいのですが、
それはまた今度。
バックアップがわりのスケッチ
ダウンロード - quad_pls01.txt
.inoじゃなく.txtにしてます
Arduino IDEの設定

16種の周波数(1Hz~1MHz)を設定するための分周比テーブル。
/***** TCA分周データテーブル *****/
// 周波数発生モードなので8MHzを1/2した
// 4MHzを原発振周波数と考える
// 2相パルスを出すTCDでさらに1/4される
const struct{
const word cmp0; // TCA0 CMP0データ 1/(n-1)
const byte clksel; // プリスケーラ設定値 + ENABLE(b0)
// 1/1,2,4,8,16,64,256,1024
}frq_tbl[] = {
{ 15625, 0b00001010 }, // 0 1Hz 1/64
{ 31250, 0b00001000 }, // 1 2Hz 1/16
{ 12500, 0b00001000 }, // 2 5Hz 1/16
{ 6250, 0b00001000 }, // 3 10Hz 1/16
{ 3125, 0b00001000 }, // 4 20Hz 1/16
{ 2500, 0b00000110 }, // 5 50Hz 1/8
{ 1250, 0b00000110 }, // 6 100Hz 1/8
{ 625, 0b00000110 }, // 7 200Hz 1/8
{ 1000, 0b00000010 }, // 8 500Hz 1/2
{ 500, 0b00000010 }, // 9 1kHz 1/2
{ 250, 0b00000010 }, // A 2kHz 1/2
{ 100, 0b00000010 }, // B 5kHz 1/2
{ 100, 0b00000000 }, // C 10kHz 1/1
{ 50, 0b00000000 }, // D 20kHz 1/1
{ 10, 0b00000000 }, // E 100kHz 1/1
{ 1, 0b00000000 }, // F 1MHz 1/1
}; // |||+--- ENABLE
// +++---- プリスケーラ
2相パルス出力関連の過去記事
・2024年10月13日:1/nカウント方式とDDS方式の2相パルス発生回路
・2024年9月27日:1クロックでも速くしたい DDS方式の2相パルス発生器
・2018年5月25日:アナログ入力で2相パルスの周波数と正転逆転を制御する発振器
↑
ここあれこれ過去記事へのリンク
・手組み基板のようす

※追記
せっかく出力できた2相パルスをカウントするには、
tinyAVR1系内蔵のカウンタシステムはチカラ不足
でした。
・TCD(12bit)で2相パルス出力
これはうまいこといきました
・TCA(16bit)でメインクロックを分周して
TCDのクロック入力に入れ、2相パルスの
周波数を可変。
これも成功
・残るは2つのTCB(16bit)
これでパルス数を数えられないか?
ところが・・・
TCBは内蔵クロックの他はCLK_TCAしか
カウントできないのです。
イベント(事象)をカウントできればTCBの応用
範囲が広がるんですが・・・
上の表、事象入力がありますがこれをクロックには
できません。
キャプチャなどのカウント制御用です。
さらにTCBにはプリスケーラが無いのでTCAの
代わりはできません。
そして、TCAは1つしかないし・・・
・TCAの入力部
計数器(CNT)の左上右矢印、クロック入力として
CLK_TCAがあります。
これがTCBのクロック入力として使えます。
これを利用してイベント信号をTCBのクロックにする
ことは可能です。
しかし、そうすると、TCAを別の用途で使うということ
ができなくなってしまいます。
ということで、
何発出したかを数えてパルスを停止
という機能、ATtiny1614ではあきらめました。
さらに・・・
tinyAVR2のATtiny3224はTCDを持ってません。
日本語データシート(2021年)で
「TCD 1つ」と表にしてありますが
英文のを見ると「0」。日本語でも
TCDの説明はありません。
TCAかTCBで2相パルスを出す方法を模索!
でしょうか。
※ATtiny3224ならなんとかなるか
16bitタイマのTCAを1つとTCBを2つ持っていて
12bitのTCDがないATtiny3224。
これだと、なんとかなりそうです。
まず、ATtiny3224のTCB、そのクロック入力は
こんな具合にイベントが使えます。
TCAを横取りせずにカウントできるわけです。
そしてTCAでは、「周波数波形生成モード」を使えば
こんなふうに2相パルスが出力できます。
「何発出したかを数えてパルスを停止 」機能が
実現できそうな感じです。
最近のコメント