前回はSAMD21で吉例Lチカだったですが、書きながら気になったことがありました。GPIOのピンコンフィギュレーションの中にDRVSTRというビットがあるのに気づいたからです。調べたら同じものがSAMD51にもありました。GPIO分かったような気でいて、ついつい見逃していたのね。
※「AT SAMの部屋」 投稿順indexはこちら
見逃していたビットは、PORTのPin Configurationレジスタの中にある
Output Driver Strength Selection
というビットです。Pin Configuationレジスタは各ポート(A, B, …)毎にグループ分けされ、さらに各ピン毎に8ビットのレジスタが割り当てられてます。プルアップとか、入力許可などのビットがある他、ペリフェラルをポートに直接接続するときに使う、ペリフェラル・マルチプレクサ・イネーブルもここに入っています。
実は手元には2種類のデータシートがあり、1つがATMEL発行の2016年版、1つがMicrochip社の名のもとに発行されている2020年版です。SAMD51についてはMicrochip版使っていたのですが、SAMD21については「成り行き」でATMEL版を見てしまったので実はそっち見て書いています。多分内容は変わらん筈ですが。念のため、より新しいMicrochip版をダウンロードできるページへのリンクを貼っておきます。
実端子で2種類のドライブ強度を比較
今回、使用しているボードはSeeed社のSeeduino XIAOボードです。SAMD21G18A搭載。開発環境は、VSCode + PlatformIO上の Seeeduinoプラットフォーム(Arduinoと互換)を使っています。
実験は、Xiaoボードの10番ピンに、0.1uFのキャパシタをつけて、LOWからHIGH(3.3V)出力への遷移をオシロで観察する、これだけです。
弱いドライバビリティの時はゆっくり、強くすれば早く立ち上がるだろ~という目論見です。当たり前か。
Arduino式に正当に該当のビットにアクセスするには、直接ハードウエアのレジスタのアドレスなどを指定せず、Arduino式のピン番号を以下の構造体配列使って変換して実際のポートの番号やら、ピン番号やらを引き出す方が正しいと思います。
g_APinDescription[]
しかしま、ここでは、直接指定でやっつけます。その方がお手軽で確実だし。その代り、他のボードへの移植性などは損なわれます。
該当のArduino式のA10/D10端子は、実はPortA(Port Group[0])の0から数えて6番の端子なので、直接では、以下のようにしてアクセスできます。
PORT->Group[0].PINCFG[6].bit.DRVSTR
まず、普通に pinmodeを OUTPUT にしたときにこのビットの設定がどうなっているのかを確認してみました。
NORMAL(弱い方)
でした。ソースも見てみましたがこのビットには何も操作していないみたいなので、デフォルトそのままで使っているみたいです。
観察結果
まず、デフォルトのNORMAL。0.1uFついているので、かなりゆっくり立ち上がってます。ザックリした見積りだとオン抵抗250Ωといった感じですかね(ホントか、計算間違えてないだろうな?)
続いて、STRONGGERに変更してみました。かなり急峻。確かにこのビットの値を変更するとドライバビリティが強くなってますな。ここでは大きなオーバーシュートやリンギングは見えないですが、雰囲気が少しあり。強ければ良いというわけでもないし。まあ、こういうビットはイザというとき(何?)に設定する感じですかね。ざっくりオン抵抗は75Ωくらいか(計算間違えてないか。)
別々のグラフだとイマイチ感覚的に分からないのでデータを落として重ねてみましたぜ。冒頭のアイキャッチ画像をご覧くだされ。