CANの例 - ATmega32M1 - STK600

作成者:Scott Schmit、最終修正者:Robert Nelson、日時:2016年04月05日

image

目的

このページでは、ATmegaxxM1ファミリのマイクロコントローラに内蔵されているCANコントローラの使用方法を紹介します。このプロジェクトは、STK600開発ボードを使用して、複数のATmega32M1デバイス間のCAN通信を実現します。Studio 6のATmegaxxM1デバイス用CANライブラリも提供されています。

CANの背景

CAN(Controller Area Network)プロトコルは、自動車や産業用アプリケーションで一般的に使用されている堅牢なシリアル通信プロトコルです。CANネットワークは、ネットワーク内のすべてのノードを接続するために共有バスを使用します。CANプロトコルには、マスターとスレーブの関係はありません。その代わり、すべてのノードが同じバスにアクセスし、各メッセージのビット単位のアービトレーションによって優先順位を決定し、バスの衝突を回避することができます。各メッセージには、一意の識別子と優先順位が含まれています。2つのノードが同時にバスを使用しようとした場合、優先度の高いメッセージがバスアクセスを「獲得」し、優先度の低いメッセージは中止されます。CAN通信は、比較的低いデータレート(1Mbps以下)でありながら、EMIや温度の影響に対して非常に高い耐性を必要とするネットワークに適用可能です。下図は、CANネットワークにおいて、複数のノードが共有バスに接続される様子を示しています。

image

バスと各CANコントローラの間にCANトランシーバがあることに注目してください。CANバスは、2本の差動信号線CANHとCANLで構成されています。CANトランシーバは、コントローラのシングルエンドのTx、Rxラインを差動信号CANH、CANLに変換するために必要です。次の画像は、CANトランザクション中のCANHとCANLラインのスコープキャプチャーを表示します。

image

参考

CAN通信に初めて触れる読者は、ハードウェアでCANネットワークを実現する前に、CAN通信プロトコルについて調べておくことを強く推奨します。

プロジェクトの概要

このプロジェクトでは、ATmega32M1デバイスの内蔵CANコントローラを設定する方法を紹介します。必要なハードウェアの接続を網羅し、2種類のノードのアプリケーションコードを説明します。また、ATmega32M1コントローラと実際のCANバスの接続方法についても説明します。

このプロジェクトは、3ノードのCANネットワークを実装しています。2つのノードは、ローカルな情報を収集するセンサノードとして動作します。3番目のノードはハブノードとして動作し、センサノードからセンサデータを受け取り、ユーザーに情報を提示します。

このプロジェクトでは、STK600を開発プラットフォームとして使用しました。STK600は、ソケットとルーティングカードシステムを使用して、任意のAVRマイクロコントローラを評価することができます。マイクロコントローラの各ポートを取り出し、8個のユーザーLEDと8個の汎用ボタンを搭載しています。STK600は、ATmega32M1をCANバスに接続するための、オンボードCANトランシーバー(ATA6660)も提供します。

Atmelは、AT90CANデバイスファミリのCAN ソフトウェアライブラリをAtmel Studio 4で提供しました。このプロジェクトでも同じCANライブラリが使用されましたが、それはAtmel Studio 6の新しいATmega32M1デバイス用に修正されています。

プロジェクト要件

  • ATmega32M1 - CANコントローラを内蔵した8 ビットAVRマイクロコントローラ。各ノードに 1 つ必要です。
  • ATSTK600 - すべての8 ビットおよび32ビットAVRマイクロコントローラ用の完全な評価ボード。各ノードに1 つ必要です。
  • ATSTK600-SC10 - STK600用32ピンTQFPソケットカード。各ノードに1枚必要です。
  • ATSTK600-RC22 - ATmega32M1マイコン用STK600ルーティングカード。各ノードに1枚必要です。
  • 30-9506-77 - CANバス接続用のDB9シリアルケーブル。STK600キットに付属の10ピンリボンケーブルは、2つのノードを接続するためにも使用できます。このデモでは2つのセンサノードを使用したため、2つのケーブルが必要でした。
  • Atmel Studio 6 - Atmelの無償ファームウェア開発ソフトウェア

システムクロック

STK600は評価中のAVRのクロックソースを選択するためのスライドスイッチを提供しています。STK600では、AVRの内部RC発振器、外部クロック源、または外部水晶発振器をシステムクロック源として使用するオプションがあります。STK600には、水晶振動子を挿入するためのソケットが用意されています。また、プログラマブル発振器も内蔵しており、これをクロックソースとして使用しました。スライドスイッチのクロックソース設定は、EXTに設定しました。CANプロトコルのビット同期処理のため、システムクロックは希望するCANボーレートの少なくとも8倍以上でなければなりません。今回使用したCANライブラリは、100、125、200、250、500、および1000kbpsのボーレートをサポートしています。 これらのボーレートをすべて完全にサポートするために、AVRの最小システムクロックは8MHzが必要です。プログラマブルオシレータは、Studio 6 Device Programmingインターフェースを通じて8MHzに設定されました。ユーザーはDevice Programmingを通してATmega32M1内のCLK_DIV8 fuseもクリアしなければなりません。

STK600プログラマブル・オシレータの設定

image

  1. 適切なソケットとルーティングカードを使用してAVRをSTK600に取り付けてください(STK600 Socket Guide)。
  2. 適切なリボンケーブルを使って、オンボードプログラマ/デバッガをAVRデバイスに接続します。このプロジェクトでは、ATmega32M1デバイスをプログラムするためにISPヘッダを使用しました。VTargetとResetヘッダがそれぞれジャンパで短絡されていることを確認してください。
  3. 付属のUSB ケーブルでSTK600をPCに接続します。STK600の電源がオンになっていることを確認します。
  4. Atmel Studio 6で、Tools → Device Programmingに移動します。
  5. ツールにSTK600を選択します。
  6. デバイスとしてATmega32M1を選択します。
  7. インターフェースとしてISPを選択し、「Apply」をクリックします。
  8. Device Programmingダイアログの上部にあるDevice Signatureの「Read」をクリックします。デバイスのシリアルナンバーが表示されるはずです。表示されない場合は、Interface SettingsタブのISPクロックを調整してください(200 kHzが効果的です)。
  9. Board Settingsタブを選択します。
  10. まだ行っていない場合は、スライダを使用するか、テキストボックスにおいて、Target Voltageに3.3Vを入力します(ARef0とARef1はそのままで大丈夫です)。
  11. Clock Generatorを8MHzに設定し、「Write」をクリックします(生成される値は若干ずれることがあります)。
  12. Fusesタブを選択します。
  13. SUT_CKSEL fuseを「EXTCLK_6CK_14CK_65MS」に設定します(fuseを表示するためにスクロールが必要な場合があります)。
  14. CKDIV8 fuseの選択を解除します。
  15. Programをクリックします。
  16. Device Programmingのダイアログを閉じます。
  17. STK600ボードの電源を落とします。
  18. クロックソーススライドスイッチを「EXT」に設定します。
  19. 電源を再接続すると、AVRはシステムクロック源としてプログラマブルオシレータを使用して8MHzで動作します。

image

image

CANプロトコルのタイミング要件が厳しいため、AVRデバイス内の内部RCオシレータをシステムクロック源として使用することは推奨されません。 内部RC発振器の精度は温度と電源電圧に大きく依存します。したがって、実際には、CANノードのシステムクロック源として、外部水晶発振器を使用することをお勧めします。

ハードウェアの接続

ATmega32M1はソケットカード(ATSTK600-SC10)とルーティングカード(ATSTK600-RC22)を使ってSTK600に実装されています。

image

ATmega32M1のPORTC[3:2]はCAN[Rx:Tx]ピンです。STK600は、シングルエンドのRx、Txラインを実際のCANバスで必要な差動信号に変換するためのCANトランシーバ(ATA6660)をオンボードで搭載しています。ただし、CANコントローラとCANトランシーバは、ユーザーがジャンパ線で物理的に接続する必要があります。PORTC[3:2]ピンは、STK600キットに含まれる2線式ジャンパのいずれかを使用して、STK600のCAN Rx/Txヘッダに接続しました。

ATmega32M1のPORTBを8bitのLED制御ポートとして使用しました。PORTBヘッダとSTK600のLEDヘッダは、STK600のキットに含まれる10ピンのリボンケーブルの1つを使用して接続しました。

ハブノードでは、汎用ボタンの1つ(SW0)を使って、センサノードからのデータ要求のトリガとしました。PORTC[7]はSW0の状態を読み出すためのデジタル入力(プルアップ有効)として構成しました。SW0はSTK600の10ピンヘッダとジャンパ線1本でPORTC[7]に接続しました。

image

STK600は、CANバス用の標準10ピンヘッダと、CANバス用のDB9コネクタを付属しています。どちらか(または両方)を使用して、異なるCANノード同士を接続することができます。センサノード1とハブノードの接続にはDB9ケーブルを使用し、センサノード2とハブノードの接続にはSTK600キットに含まれる10ピンリボンケーブルを1本使用しました。

image

image

image

CANバスは、差動信号CANHとCANLが正しい電圧特性を示すように適切に終端する必要があります(「CANの背景」セクションの図1に示すRL)。

ノード間を接続するケーブルの長さによって、CANバスの電圧特性は変化します。これらの影響を補うため、STK600ではDB9コネクタの横に「Term」ヘッダを設け、これを短絡してバスライン間に抵抗を追加することができます。

「Split」ヘッダを使用すると、ユーザーはフィルタリングコンデンサを挿入して、CANHおよびCANLラインのコモンモードノイズを除去できます。

また、「Slope Control」ヘッダを使用してEMIによるバスラインへの影響を防いでいます。これは、CANトランシーバのスタンバイピンに接続されています(詳細はATA6660のデータシートを参照)。したがって、トランシーバをアクティブモードに保つには、「Slope Control」ヘッダのどちらかの側にジャンパする必要があります。

ユーザーは、「Term」ヘッダや「Split」ヘッダをショートする必要がある場合とない場合があります。それはすべて、CANバスの長さとボーレートの設定に依存します。このプロジェクトでは、「Term」ヘッダをショートさせる必要がありましたが、「Split」はオープンのままでもバスのインテグリティを維持することができました。ノイズの多い環境では、必要なノイズイミュニティを得るために「Split」ヘッダが必要な場合があります。ユーザーは、そのノードのバストランザクションを有効にするために、常に「Slope Control」ヘッダの片側をショートさせる必要があります。

アプリケーションコード

ATmegaxxM1 CANライブラリ

Atmelから提供されたStudio 4のAT90CANソフトウェアライブラリは修正されており、このプロジェクトでは、Studio 6を使用しました。そのライブラリは、いくつかの低レベルのCANマクロと、メインアプリケーションで実装される高次の関数を提供します。ATmegaxxM1用の修正されたCANライブラリを以下に提示します。

すべてのファイルを含むZip:

個別ファイル:

アプリケーション例

このプロジェクトでは、センサノードとハブノードの2種類のノードがあります。センサノードはローカルデータを収集し、その結果をハブノードに送信し、ハブノードはその情報をユーザーに表示します。CANLIB zipフォルダ内のコレクタ/センサのサンプルアプリケーションは、このプロジェクトで使用するために変更されました。このデモに使用したサンプルプロジェクトは、以下のとおりです。

サンプルコードの検証

  1. 「ハードウェアの接続」セクションの説明に基づいて、ハブノードを設定します。
  2. 付属のUSBケーブルでハブノードとPCを接続します。
  3. 「システムクロック」のセクションの説明に基づいて、システムクロックを設定します。
  4. 上記で提供されたHub_CAN_Exプロジェクトを使って、ハブノードをプログラムしてください。
  5. 「ハードウェア接続」のセクションの説明に基づいて、センサノードを設定します。
  6. センサノードとPCを付属のUSBケーブルで接続します。
  7. 「システムクロック」のセクションの説明に基づいて、システムクロックを設定します。
  8. DB9ケーブルまたは10ピンリボンケーブルを使用して、2つのノードを接続します。
  9. 両ノードの電源が投入されていることを確認します(各STK600のリセットボタンを押し、プログラムの起動を確認します)。
  10. ハブノードのSW0を押します。センサノードのIDタグとテストバイトがハブノードのLEDに表示されます。
    ハブノードからメッセージの応答が要求されると、センサノードのLED0が点滅するのがわかります。
  11. 2番目のセンサノードの設定、接続、プログラミングを行います。
  12. ハブノードのSW0をもう一度押してください。ハブノードのLEDに各センサノードのIDタグとテストバイトが表示されます(IDタグ間で1秒のポーズがあります)。

筆者からのコメント

CAN通信プロトコルは、その高い信頼性から、多くのアプリケーションで使用されていますが、提供されているサンプルコードに飛びつく前に、CANプロトコルについて十分に研究することを強くお勧めします。このプロジェクトで提供されるCANライブラリは、AT90CANデバイス用に書かれたCANライブラリから変更されたものです。このプロジェクトが皆様のお役に立てれば幸いです。提供されているCANライブラリ内のすべての機能を十分に検討することをお勧めします。ぜひサンプルプロジェクトに機能を追加してみてください。ある種のエラー報告や追加のメッセージタイプを追加してはいかがでしょうか。何か面白いブレイクスルーがあれば、ぜひ教えてください。AtmelのAVR CAN コントローラで作業することを楽しんでください!

  • Scott

このページや他のページの情報についてのご質問やご意見は、TechForumまでお願いします。 TechForum




オリジナル・ソース(English)