« 2026年1月 | トップページ | 2026年3月 »

2026年2月

2026年2月22日 (日)

tinyAVRマイコンのタイマーAとtakeOverTCA0()

Arduino IDE環境でのtinyAVRマイコン、
AVR0系、1系、2系とさまざまなのがありますが、
そのタイマーAは、本来16bitのタイマーなのですが、
2つの8bitタイマーで使うように初期化されています。
  PWM操作(8bitのanlogWrite出力)が目的

16bitタイマーで使うときは標準動作、
8bitタイマーだと分割動作と呼ばれています。

標準と分割とでレジスタの機能が異なっている部分が
あるので、実態は同じ制御レジスタなのに
  「TCA0.SINGLE.xxxx」と「TCA0.SPLIT.xxxx」
と名前を変えて呼ばれます。

問題なのが、タイマーAを16bitで使いたいとき。
分割動作で初期設定されたのを標準に戻すわけです。
データシートを見ますと、こんな記述が見つかります。
  (クリックで拡大↓)
Pp11_20260222114501

これ、リセットするのにArduino IDE環境では
takeOverTCA0()」を使うことになっています。
「megaTinyCore」の例題スケッチを探すとsetup()の
中でこの関数を一回だけ呼び、その後16bitの標準
動作の設定を行っているのがわかります。

takeOverTCA0()が何をしているかというと、
こんなソースが"wireing_analog.c"の中に
入っています。

void takeOverTCA0() {
TCA0.SPLIT.CTRLA = 0; // Stop TCA0 (1)
__PeripheralControl &= ~TIMERA0;
// Mark timer as user controlled (2)
TCA0.SPLIT.CTRLESET =
TCA_SPLIT_CMD_RESET_gc | 0x03;
// Reset TCA0 (3)
}

(1)はタイマーAの停止処理
   これは標準でも分割も同じ。
(2)は__PeripheralControlはPWM出力可能か
 どうかを保持している変数。
 タイマーAを止めてたらPWM出力できないぞ
 を返すために使われてる(みたい)
(3)が分割モードでのリセット処理。

一連の流れでタイマーAがリセットされるという
仕掛けです。

私の場合、takeOverTCA0()を知ったのはつい
こないだのこと。
これを使わずにどうしてたかというと、まず参考になるのが
  ・ATtiny1614:タイマレジスタの初期設定を見る
これで、タイマーAを含むタイマー関連の初期状態が
想像できます。

ATtiny402の初期状態をあらためて見ると、

ATtiny402 : timer Disable
TCA0.CTRLA 09
TCA0.CTRLB 00
TCA0.CTRLD 01
TCA0.EVCTRL 00
TCA0.INTCTRL 02
TCA0.PER FEFE
TCA0.PERB FFFF
PORTMUX.CTRLC 01

そして、ATtiny3224で裸の32bit周波数カウンタ #2
では、このようにレジスタ名SPLITは使わず、
SINGLEのまま16bitモードに。

  TCA0.SINGLE.INTCTRL= 0;        // 割り込み禁止
TCA0.SINGLE.CTRLA = 0; // TCA0 停止
TCA0.SINGLE.CTRLD = 0; // TCA0 8bit分割停止 16bitに

16bitモードの設定

ATtiny402マイコン サンプル:RCサーボモータテスター
では、

//  タイマーA0, 分割モードで初期化されるので16bitモードに
TCA0.SPLIT.CTRLA = 0; // タイマー停止
TCA0.SPLIT.INTCTRL = 0; // 割り込みなしに
PORTMUX.CTRLC = 0; // TCAポート多重切り替えなしに
TCA0.SINGLE.CTRLD = 0; // TCA0を16bitモードに

16bitモードの設定

手順はいろいろありますが、
 ・まずタイマーを止めて
 ・リセット
   これがtakeOverTCA0()の手順。
あるいは、
 ・タイマーを止めて
 ・割り込みをなしに
 ・16bitモードに
これでも大丈夫。

で、takeOverTCA0()でちょっと問題か?っと
思ったのが「PORTMUX.CTRLC」の設定。
8bit PWMでの出力を4ch使えるように「ポート多重器」
を使って、WO0をPA7に割り当てています。
これで、
 WO0 PA7 (代替ピン)
 WO1 PA1
 WO2 PA2
 WO3 PA3 (WO0/WO3共用)
と4つのPWM出力が使えるのです。

しかし、16bit PWMモードではWO0、1、2の3つの
出力しか使えません。
その中のWO0が代替ピンのままになっています。
  こうなってると分かっているのであれば
  良いのですが、takeOverTCA0()では
  ほったらかし。
16bit PWMの処理で、PA3がWO0出力になる
つもりのスケッチが、代替ピンのPA7に出て
しまいます。

完全に初期状態にというと、
「 PORTMUX.CTRLC = 0; // TCAポート多重切り替えなしに」
の1行が必要です。

※追記:ATtiny402、レジスタを表示してから
takeOverTCA0()を実行して、もう一度レジスタ表示。

ATtiny402 
 TCA0.CTRLA 09
 TCA0.CTRLB 00
 TCA0.CTRLD 01  ←8bit 分割モード
 TCA0.EVCTRL 00
 TCA0.INTCTRL 02
 TCA0.PER FEFE
 TCA0.PERB FFFF
 PORTMUX.CTRLC 01 ←TCA00代替ポートが有効

takeOverTCA0実行

 TCA0.CTRLA 00  ←初期値に
 TCA0.CTRLB 00
 TCA0.CTRLD 00
 TCA0.EVCTRL 00
 TCA0.INTCTRL 00
 TCA0.PER FFFF
 TCA0.PERB FFFF
 PORTMUX.CTRLC 01 ←代替ポート指定は残る


※追記 analogWriteを実行するとどうなるか
レジスタ値出力後、
 analogWrite(1, 1);     // PA7 3pin
 analogWrite(2, 2);     // PA1 4pin
 
analogWrite(3, 3);     // PA2 5pin
 analogWrite(4, 254);  // PA3 7pin
とanalogWrite で4つのPWMパルスを出力。
その後のレジスタ値の変化です。
 

ATtiny402 : 20MHz
analogWrite 前    後
-------------------------------
TCA0.CTRLA 0B 0B
TCA0.CTRLB 00 17  ←
TCA0.CTRLD 01 01
TCA0.EVCTRL 00 00
TCA0.INTCTRL 02 02
TCA0.PER FEFE FEFE
TCA0.PERB FFFF FFFF
TCA0.CMP0 0000 FE01 ←
TCA0.CMP1 0000 0002 ←
TCA0.CMP2 0000 0003 ←
PORTMUX.CTRLC 01 01

8bit分割モードで処理されたようすが見えてます。
ATtiny402でのanalogWrite、数値範囲は「0~255」。
0で全L。255で全Hなんで、128にしてもデューティ50%ジャスト
にはなりません。
50%よりちょっと大きめのデューティになります。
127だとちょっと小さめになり、analogWriteではジャスト
50%のデューティは出てきません。

Dt11

| | コメント (0)

2026年2月20日 (金)

ATtiny3224で裸の32bit周波数カウンタ #3

ATtiny3224で裸の32bit周波数カウンタ
ATtiny3224で裸の32bit周波数カウンタ #2
ここでは32.768kHzの時計用水晶発振子
基準クロックにして1秒ゲートを作り、
周波数を計れるようにしました。

これとは違うアプローチで、時計用水晶をやめて
マイコンの主クロックを
 TCXO(Temperature Compensated crystal Oscillator)
にして試してみようと、部品を手配。
共立から ECS-TXO-3225MV-100-TR という
10MHzの1.7V~3.6Vで使える「3225」サイズ
のを買ってみました。

とりあえず発振実験なんですが・・・
  ・・・ピッチ変換基板をどうしよう。

手持ちのをあれこれ探して、これで行こうと
なったのが「SOT-23-6」の変換基板。
この2ピンと5ピンのパターンを削ってハンダ付け。

Tcxo

TCXOを2つ買って、出てきた周波数、
うちの周波数カウンタでの計測値は
 10.000005MHz +0.5PPM
 10.000017MHz +1.7PPM
となりました。
TCXOのスペックでは、
 Frequency Tolerance(@+25℃±2℃) ±1.5 PPM
となってますんで、使ってる周波数カウンタの
精度が「どや?!」っとなってしまいます。

これを使っての周波数カウンタ実験はもうちょい先。

| | コメント (0)

2026年2月11日 (水)

アイリスオーヤマ BIGCAPA単3 BCR-R3MH 1200サイクル目

アイリスオーヤマのBIGCAPA 単3 BCR-R3MH(950mAh)
 ・スタートが2025年6月12日
 ・800cyc目が2025年11月28日
Ii11_20250612110501
順調に充放電を続けています。

・50サイクルごとの0.2C放電。
Cap005_20260211090301
・毎サイクルごとの充放電時間と充電停止電圧の変化。
Cap006_20260211090301

■■■ 電池あれこれ ■■■

小容量クラスのニッ水、
  ・eneloop lite BK-3LCC (950mAh)
が、4000サイクル
  ・タミヤ NEO CHAMP (950mAh)
が、4400サイクル
このあたりに追随できるかどうかでしょうなぁ。

※400サイクルごとの休止タイミングで、
電池を電池ホルダーから外して内部抵抗を
計っていましたが、これが接触不良発生の
原因みたいなので、今は、電池には手を
触れずそのままで充放電を続けています。

| | コメント (0)

2026年2月 6日 (金)

トランジスタ技術2026年3月号

ちょっとフライングで。
  トラ技は毎月10日発売。

でも、定期購読や著者献本だとちょいと早めに
送られてきます。
3月号は今朝やってきました。
T232

私の記事も載っているんですが、
 「ロードセルを使ったはかり
の後編を楽しみにしていたのです。
Tr233

前編が先月の2月号で、ブロック図や波形などの
解説だけでした。
今月号が回路図などの解説です。
読み進みますと・・・・
あかんやん!」を発見。
アナログマルチプレクサ「74HC4053」の
電源が「±9V」になっています。
Tr324
HC4053のスペック、電源はGND基準でVDD・VEEが±5V。
最大でも±6Vとか±7V。 (メーカーにより異なる)
記事の部品表を見ますと、

Tr325
TC4053でも可」と注記されているんですが、
回路図のHC4053に±9Vはスペック越えで、へた
したら破損するかもという、怖~い状態になってい
ます。

4000番CMOSの4053、この最大電圧もメーカにより
記述が異なり、VDD ・VEE間18Vとなっていたり
20Vとなっていたりします。
つまり、±9VはCMOSの4053でもギリギリという
電源電圧なんです。

±9Vだと、汎用ロジックICじゃなく、±15Vで
動くオペアンプなどとつなげられるアナログ回路用の
マルチプレクサから選ぶということになるでしょう。

また、記事のHC4053、未使用ピンの処理が気になります。
GNDにつないでおくんだぁ」っと大きな声を上げたいです。
おっと。「INH」オープンはまずい。
これは確実にGNDにしておかないと。

4053の場合、ABC3つあるスイッチを3パラにしてしまうと
いうのが、定石かもしれません。
  入出力容量が増えるけど、
  スイッチ抵抗が小さくなる
  

analog-dialogue:その未使用ピンをどうにかしなさい!

| | コメント (3)

2026年2月 4日 (水)

ダイソー「LOOPER単4」(650mAh) 400サイクル目

ダイソー「LOOPER単4」(650mAh) 充放電実験開始
これが2025年11月15日。
Lp41

昨日、400サイクル目の充放電が終わりました。
まずは、0.2C放電での電圧変化。
Cap003_20260204181501
400サイクルを経て、ちょっとへたっている感じです。

そして、0.5C充放電電圧と充電停止電圧の変化。
Cap002_20260204181501
800サイクルに向け、どこまで耐えてくれるのか、興味津々。

| | コメント (0)

2026年2月 3日 (火)

オムロンのパワーリレー 「G5LE」が終息

製作物で使っているオムロンのパワーリレーG5LEが
「end of life」っとの案内が・・・
G5LE 2026年03月受注終了予定
G5le11

  オムロン自身の代替品案内は
  形状が異なるのでそのままでは
  使えません。
   これは、よくある話。

同一スペックの海外製を探すと、3つ代替候補が
見つかりました。
 ・AZ943 : azettler
 ・PR25 : sameskydevices
 ・J107F : citrelay

G5LE、当面は流通在庫でなんとかなりそうですが、
どうしたものかを客先と相談しなくちゃなりません。


| | コメント (0)

2026年2月 1日 (日)

備忘録:1Hzパルス発生回路

トランジスタ技術2025年10月号
特集 今マイコンはArduinoが最強説』からみの備忘録。

p.121 図8 時計用水晶発振子を使った1Hzパルス発生回路
これの亜種を紹介しておきます。

記事では「HC4060」を2段接続して32.768kHzから
1Hzを得ました。
1hz_osc

これと同じ機能を得ます。
まずは、HC40460と「1G80」の組み合わせ。
1h31

次の2つは12.8MHzの高精度発振器を使って1Hzを得ます。
HC4060と10進カウンタHC393の組み合わせ。
1h32
単純に1Hzを得るためですが、ICの数が多くなります。

最後がマイコン。
1h33
水晶発振モジュールから出てくるのは、アナログ波形
なんで、マイコンのクロックとして使うには信号レベルを
大きくしなければなりません。
「1GU04」で増幅しています。

// ATtiny402で1Hzを作る(Microchip Studio)
#include <avr/io.h>
int main(void) {
PORTA.DIR = 0b11000110; // ポートの入出力
// || |||+---- PA0 6pin in UPDI
// || ||+----- PA1 4pin out 1Hz出力 (CMP1)
// || |+------ PA2 5pin out 1Hz出力 (CMP2)
// || +------- PA3 7pin in CLKin 12.8MHz発振器入力
// |+---------- PA6 2pin out (-)
// +----------- PA7 3pin out (-)
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0); // プリスケーラなし
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, 3); // 外部からクロック
TCA0.SINGLE.CMP0 = 6250 - 1; // CMP0出力 1Hz
TCA0.SINGLE.CMP1 = 0; // PA1 4pin
TCA0.SINGLE.CMP2 = 3125; // PA2 5pin (1/4位相差)
TCA0.SINGLE.CTRLB = 0b01100001;
// ||||+++----- WGM 波形生成FRQ(周波数)
// |||+-------- ALUPD
// ||+--------- CMP0EN
// |+---------- CMP1EN PA1 4pin 出力
// +----------- CMP2EN PA2 5pin 出力
TCA0.SINGLE.CTRLA = 0b00001111;
// |||+----- ENABLE 動作開始
// +++------ CLKSEL プリスケーラ1/1024
while(1){ } // PA1,PA2に1Hzを出力し続ける
}

 

1hz11

配線して組み立てる工数からはマイコンを使うのが
いちばん簡単。
でも「チップにプログラムを書き込む」という壁が
存在します。

| | コメント (0)

« 2026年1月 | トップページ | 2026年3月 »