« 盛る中華電線 | トップページ | 360g級 鉄の文鎮:ハンダ付け補助ツール »

2026年6月 3日 (水)

tinyAVR1の12bitタイマTCD0で2相パルス出力

3種類あるtinyAVR系統、その中でtinyAVR1系統だけに
入っている「12bitタイマ TCD0」。
この波形出力機能を使って2相パルスを出してみました。

利用するのは「1傾斜動作」。
データシートにはこのような例が記されています。
1slope11

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

実験した回路。
使ったのは14ピンのATtiny1614
「0~F」を設定できるデジタル・スイッチで16種の
出力周波数を得ました。
2pg11
試した最高周波数が1MHz。
EXTCLKに入れたパルスを元に、ハードウェアが
2相パルスを出してくれます。
  16bitタイマのTCA0を使って
  EXTCLKを発生させてます。

ですので、Arduino UNO R3で苦労したコンペアマッチ
割り込みの遅れ、これは気にしなくてかまいません。
  10kHzの2相パルス(割り込み周期25us)が
  限度でした

1MHzの2相パルス出力をオシロで見た波形
2pg21

「何発出したらストップ!」をしたいのですが、
それはまた今度。

バックアップがわりのスケッチ
  ダウンロード - quad_pls01.txt
    .inoじゃなく.txtにしてます

Arduino IDEの設定
Bdmngr21

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相パルスの周波数と正転逆転を制御する発振器
    ↑
   ここあれこれ過去記事へのリンク


・手組み基板のようす
Tn41

※追記

せっかく出力できた2相パルスをカウントするには、
tinyAVR1系内蔵のカウンタシステムはチカラ不足
でした。

・TCD(12bit)で2相パルス出力
  これはうまいこといきました

・TCA(16bit)でメインクロックを分周して
 TCDのクロック入力に入れ、2相パルスの
 周波数を可変。
  これも成功

・残るは2つのTCB(16bit)
  これでパルス数を数えられないか?

ところが・・・
TCBは内蔵クロックの他はCLK_TCAしか
カウントできないのです。

Tc11_20260604090901
イベント(事象)をカウントできればTCBの応用
範囲が広がるんですが・・・
上の表、事象入力がありますがこれをクロックには
できません。
キャプチャなどのカウント制御用です。

さらにTCBにはプリスケーラが無いのでTCAの
代わりはできません。
そして、TCAは1つしかないし・・・

・TCAの入力部
Tc12_20260604093101
計数器(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、そのクロック入力は
こんな具合にイベントが使えます。
Wg23
TCAを横取りせずにカウントできるわけです。

そしてTCAでは、「周波数波形生成モード」を使えば
こんなふうに2相パルスが出力できます。
Wg21


Wg22
何発出したかを数えてパルスを停止 」機能が
実現できそうな感じです。


|

« 盛る中華電線 | トップページ | 360g級 鉄の文鎮:ハンダ付け補助ツール »

ATtiny」カテゴリの記事

コメント

コメントを書く



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




« 盛る中華電線 | トップページ | 360g級 鉄の文鎮:ハンダ付け補助ツール »