Arduino UNO R4 minima 電源供給方法でクロックが変わる#2
・2025年5月5日:Arduino UNO R4互換:RA4M1コアボードのクロック
この続きです。
UNO R4(互換機)、初めての通電がこれ。
・2025年5月2日:Arduino UNO R4互換品:RA4M1コアボード
D5ピンに1MHzの方形波を出してあれこれしてて、ムムムっと
なったのです。
これはまだPLLを試す前
結局、Arduino UNO R4 minimaの純正品を買っちゃいました。
純正品には水晶発振子は付いていません。
内蔵クロックの話、純正品でも同じでした。
・USBで通信+電源供給したら周波数精度が良。
ジッターはあるけど、水晶発振と見間違えるくらい。
・USBを外し、外部電源で動かすと周波数が0.2%ほど下がる。
こんな不可思議現象が起こったのです。
この電源供給の方法、新たにこんなことを試してみました。
(1)USBはつながず外部電源で運転開始。
リセット起動で、周波数は下がったまま。
(2)外部電源につないだままUSBコネクタ(PCからの)を挿す。
すると、周波数精度良に。
D8のloopパルスがずっと見えているので
リセットはかかっていない。
(3)外部電源につないだままUSBコネクタを抜く。
すると、周波数が下がる。
リセットはかかっていない。
ブートローダーが走るのは(1)のときだけ。
(2)と(3)でリセットがかかっていないということは、
この発振周波数変化の原因、
ブートローダーが何かをしているのか?
は、除外できるでしょう。
そして、マイコンに入っているUSBの信号をオシロで見れるよう
にしてみました。
USB+とUSB-、それにloopパルスと+5V電源を見ます。
USBのケーブルをつなぐタイミングでこんな波形が得られました。
USBケーブルをつなぐと、1ms間隔で何かし始めます。
そして30ms後に何かゴニョゴニョ。
その後50msほどは静かで、ふたたび1ms間隔の通信に
なります。
これがUSBケーブルをつないでいる間、続きます。
ゴニョゴニョ部を拡大すると、loopパルスが途切れて
いるのが見えました。
割り込みで何かしているのだと推測できます。
USBの割り込み処理がどうなっているのかを追いかければ、
この周波数変化の原因と周波数精度アップの手法が見えて
くるかも・・・でっす。
しかし、(1)→(2)の変化はわかるんですが、(2)で安定した
のに(3)で元に戻ってしまうというのも、なんか不思議です。
1ms周期では割り込みはかかっていません。
(3)で抜いた瞬間のloopパルスを見れるようにかな。
※USBコネクタを抜いた瞬間
記録するにはトリガ源が難しい。
こんな波形が得られました。
loopパルスが消えているということは、なんらかの
割り込み処理が行われたという判断になるでしょう。
しかし、ここでクロックを元に戻しているのかどうかは
判断できません。
どこで周波数が変わるのかを調べるのは、ちょいとハードルが
高い。
メインクロックを外に出して、微妙な周波数差を見つけな
ければなりません。
周波数差が大きければなんとかなるんですが。
「ブートローダーが何かをしているのか?
は、除外できるでしょう。」
と記しましたが、USBの抜き差しを検出して何かの
処理をするよう仕掛けたのはブートローダーに
なるのか、それともUNO R4のsetup()を実行する前の
初期化ルーチンなのか。
| 固定リンク
「Arduino UNO R4」カテゴリの記事
- Arduino UNO R4の割り込み処理・・・まだまだ勉強不足(2025.06.26)
- Arduino UNO R4 minimaに12MHz水晶を(2025.06.09)
- Arduino UNO R4で2つの1Hz信号の位相変化を見る(2025.06.06)
- UNO R4はanalogWrite(n,128)でデュティー50%の方形波が出るぞ(2025.06.03)
- Arduino UNO R4 minima 電源供給方法でクロックが変わる#6(2025.06.02)


コメント
USBの1ms周期をリファレンスクロックにしてハード的に補正しているのではないかと思います。そういうふうにしているマイコンは他にもあります。
投稿: ochiai | 2025年5月10日 (土) 02時09分
USB接続で高精度クロックに補正した後、USBを抜いたからと元の雑クロックに戻すのは、ちょっともったいないような。
そのままにしてたらエエやん。っと。
単純な電源通電とUSBからの電源供給で内蔵クロック周波数が変化する。
これって広く一般に知られているマイコン活用の知識なのでしょか?
私の場合、今回が初体験。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2025年5月10日 (土) 08時33分
USBマウスのような超低コスト製品の場合、低精度の内蔵オシレータだとUSBとの同期がずれてきてしまう可能性があるので、USBのクロックに同期して内蔵発振を補正すればいいという初期のUSB内蔵マイコンの設計だったと思います。
USBマウスの場合はUSBに接続している間しか動作しないのでUSBが断たれたときは想定していないと思います。汎用のマイコンでも名残でそうなっているのでしょう。外付け水晶をケチったことによるデメリットですね。シリコン内蔵でもSiTimeのように高精度のものもあるようですが。
投稿: ochiai | 2025年5月10日 (土) 12時47分
USB接続をしている間の「高精度クロック」はパソコンのクロックではないでしょうか。
それゆえ、抜いてしまえば維持できなくなります。
投稿: 水魚堂 岡田 | 2025年5月10日 (土) 16時46分
メインクロックの周波数は「HOCOUTCR」トリミングレジスタで調整できます。
これで、どのくらい変えられるかはラジオペンチさんが調査されています。
Arduino UNO R4 の内蔵クロック周波数をトリムレジスタで調整
http://radiopench.blog96.fc2.com/blog-entry-1275.html
で、ここで疑問。
※自分で試せば良いのですが、どうなるのかな?っということで。
・USBの通信には高精度クロックが必要とのこと
・USBでの電源供給のとき周波数を合わせ込んでいるように見えるが、このトリミングレジスタを操作しているのか?
・そして、USBでの通信中にメインクロック周波数を触って大丈夫なのか?
いずれにせよ、
・PCとUSBをつないでデバッグ中
・UNO R4を別電源にして単独で運転
この二つでクロック周波数が変わるというのはイヤでっせ。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2025年5月11日 (日) 09時25分
UNO R4、最初から水晶(メイン用の12MHz(16MHzじゃなく)とRTC用の32768Hz)を付けといてくれたら、全部解決。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2025年5月11日 (日) 09時27分
HOCOUTCRの値をシリアル出力してみました。
・USBへ出力するSerialとD1端子へ出力するSerial1のどちらか片方を使うように。
・USB接続での電源供給、USBなしで別電源供給ともHOCOUTCRの値は変化せず。
・初期値0なら0のまま。setupでHOCOUTCRをちょっと変えればその値のまま。
・HOCOUTCRを変えたスケッチだとUSB接続しても正確な周波数(1MHzになるようにしてる)にならない。
・HOCOUTCR=4にしたとき、別電源なら999.7xkHzだったのがUSB接続すると981.6xkHzに落ちる。
動作、なんかよくわかりません。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2025年5月11日 (日) 10時30分
内部クロック(HOCO)使用時にUSB接続を行った場合は、
CACを使い、CACREFにUSBのクロック、被測定側はHOCOにして周波数の誤差を検出。その結果で割り込みを掛けてHOCOUTCRの値をダイナミックに修正しているような気がするのですが、決定的な証拠が見付からないです。
とりあえずジッタの量が気になるのでオシロで測定した結果をまと中です。整理出来たら記事で公開予定ですが、その際にはこちらの記事にもリンク貼らせてください。
投稿: ラジオペンチ | 2025年5月11日 (日) 10時58分
USB接続で周波数が調整される現象、HOCOUTCR値の変化は見られませんでした。
初期値0なら0のまま。
そして、スケッチ内でHOCOUTCR値を触ると、USB接続したときの周波数調整をスカタンするようなのです。
・外部電源運転のときの周波数を合わし込みたくてHOCOUTCR値を触る。
・これで、外部電源運転の周波数精度は良。
・しかし、USB接続だとアカン。
どっちでも安定した周波数を得ようとすると、外部水晶発振を使うしかないゾ。てなところ。
なにかヒミツの機能があるのか、さて、どうしたものか。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2025年5月12日 (月) 08時45分