2013年10月15日火曜日

STM32F1 CANの速度

STM32F1のリファレンスマニュアル RM0008 Rev5 日本語版によるとCANの速度は以下のように説明されています


Rev14でも同じ内容です

実際にBaudRateを計算してみましょう
まずAPBクロックの周期とは
CAN1が接続されているAPB1のMax36MHzです
これでtPCLK = 36MHzの周期 = 0.027778マイクロ秒となります

次にtqですが ここにはBRP[9:0]というのが出てきます
これはCAN_BTRレジスタの中にあり
標準ペリフェラルライブラリ CAN_Initでは
((uint32_t)CAN_InitStruct->CAN_Prescaler - 1)
が他のレジスタとORで代入されています
つまりCAN_InitTypeDef.CAN_Prescalerに入れた値から1を引いた数が入ります
しかし計算時には1を足しているのでCAN_Prescaler*tPCLKとすることができます

Prescalerを6と仮定した場合
tq = Prescaler * tPCLK = 6 * 0.027778 = 0.166668
となります

tBS1とtBS1もTS1とTS2がありますが、これもCAN_BTRの中にあります
それぞれCAN_BS1_xtqとCAN_BS2_xtqという定数で設定し、1tqは0が 2tqは1が 3tqは2が~ という関係です
しかしこのレジスタも計算時に1を足しているので1tqが1 2tqが2として計算できます
CAN_StructInitではCAN_BS1_4tqおよびCAN_BS2_3tqが代入されるため
tBS1 = tq * BS1 = 0.166668 * 4 = 0.666672
tBS2 = tq * BS2 = 0.166668 * 3 = 0.500004
となります

NominalBitTimeはそれぞれを足し算しているだけですので
NominalBitTime = 1 * tq + tBS1 + tBS2 = 0.166668 + 0.666672 + 0.500004 = 1.333344
となります

BaudRateは1をこの数で割っているだけなので
1 / NominalBitTime = 1 / 1.333344 = 0.75
となり、ビットレートは0.75となります
しかし最初にtPCLKをマイクロ秒としているため、ビットレートの単位を合わせると0.75Mで、750kBit/secとなります
この結果はオシロスコープで実測した値とおおよそ一致します

実際にCANbusを使う場合はプリスケーラ10で450kbpsとなり、東陽テクニカのWebページを参考にした場合で100mほど距離の通信ができます
AWG23-24の線材を使った場合のノード数は100で、これは1m間隔に1ノード程度となります

一旦機器を設置してしまうとビットレートの変更は容易では無いため、実際にビットレートを設定する場合は設置する環境を十分に見積もった上で もしくは簡単にビットレートを変更できるように工夫するべきです
同一のCANバス内で複数のビットレートが混在することは許可されていないため、ビットレートの設定は十分に注意する必要があります

0 件のコメント:

コメントを投稿