スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ArduinoでCAN通信(その9:CCP通信・再テスト)

前回までのccp通信テストでは、CANツールである07E2アドレスへのECUからの応答があったので、「テストOK」としていたのですが、返ってくるデータを実数変換してみると、変な値になっています。特にATM(大気圧)の値が99hPa程度であるはずが、変な値を示す場合があることに気が付きました。

【前出の記事での値】 (?は実数値の表示変換ミスで解決済み)
NE   :   0
VS   :?
Q    :?
ATM  :  32
THEX1:  31
THEX2:  96
QP   :?
MOD  : 90


色々と考えた末、もしかしたらECU側に問題が無いかをチェックするため、以前プロに作ってもらったツールを引っ張り出して通信テストを試みました。

【プロ仕様のCPP通信器】
Arduino_CAN_ccp6.jpg

ECUと銘打ったDsub9コネクタに電源とCAN信号が入ります。
本論とは関係ありませんが、GPSと書かれた端子が外部GPSアンテナを接続するもので、車がどこを走行したかを記録できます。

計測した結果がこれです(csvファイルの部分)

日時 時刻 NE VS PATM THAEX1 THAEX2 QFIN
2016/6/13 20:46:56 0 0 0 0 0 0
2016/6/13 20:46:56 0 0 98.47772 -20 -20 -50
2016/6/13 20:46:56 0 0 98.47772 -20 -20 -50
2016/6/13 20:46:57 0 0 98.47772 -20 -20 -50
2016/6/13 20:46:57 0 0 98.47772 -20 -20 -50
2016/6/13 20:46:58 0 0 98.5184 -20 -20 -50
2016/6/13 20:46:58 0 0 98.52095 -20 -20 -50
2016/6/13 20:46:58 0 0 98.48788 -20 -20 -50
2016/6/13 20:46:59 0 0 98.47958 -20 -20 -50
2016/6/13 20:46:59 0 0 98.47802 -20 -20 -50
2016/6/13 20:47:00 0 0 98.47774 -20 -20 -50
2016/6/13 20:47:00 0 0 98.47772 -20 -20 -50

PATMと書かれた列が大気圧で正常に受信できています。

即ち、うまくCPP通信ができていないのは、私が作ったArduino_CANに問題があります。

・・・何日もその原因を考え、
CCP通信をしているArduino_CANの通信状態を、もう一台のArduino_CANで横から覗いてみました。

すると、プログラム通りにCCP起動の送信しているはずの送信文に欠けが多々生じてます。
これは変です。Arduinoの受信処理スピードに問題は無いので、これは送信に問題がありそうです。

送信手順のプログラムを辿りました。

   CAN.sendMsgBuf(0x0000****, 0, 8, stmp);

これはstmpに格納された8Byteデータを0000****というIDで送信する部分です。
本プログラムでは次のコードの中で70回以上連続して送信しています。

    //ccp通信設定
    transmitDataFirst();
    transmitData(0x0C, cID, 0x80, 0, 0, 0, 0, 0, 0xFE, 0x39);
    transmitData(0x14, cID, 0, 0, 0, 0, 0x07, 0xE2, 7, 0);

    transmitFloat32(0, cID, lAddress[0]);
    transmitFloat32(1, cID, lAddress[1]);
    transmitFloat32(2, cID, lAddress[2]);
    transmitFloat32(3, cID, lAddress[3]);
    transmitFloat32(4, cID, lAddress[4]);
    transmitFloat32(5, cID, lAddress[5]);
    transmitFloat32(6, cID, lAddress[6]);

    transmitUbyte(6, cID, lAddress[7]);

    transmitData(0x0C, cID, 0x81, 0, 0, 0, 0, 0, 7, 0);
    transmitData(0x06, cID, 2, 0, 6, 0, 0, 1, 7, 0);
    transmitData(0x08, cID, 1, 0, 0, 0, 0, 0, 7, 0);

この処理がうまくできていないということは「送信タイムアウト」が考えられます。
mcp_can.cppを見てみると、送信バッファが空くのを50サイクルまで待ち、それでも空かなかったらタイムアウトとしています。即ち、CANコントローラMCP2515の送信処理があるサイクル内で終わらなかったらタイムアウトするようです。

//--- 抜粋
INT8U MCP_CAN::sendMsg()
{
    INT8U res, res1, txbuf_n;
    uint16_t uiTimeOut = 0;

    do {
        res = mcp2515_getNextFreeTXBuf(&txbuf_n);                       /* info = addr.                 */
        uiTimeOut++;
    } while (res == MCP_ALLTXBUSY && (uiTimeOut < TIMEOUTVALUE));

    if(uiTimeOut == TIMEOUTVALUE)
    {  
        return CAN_GETTXBFTIMEOUT;                                      /* get tx buff time out         */
    }
//--- 抜粋終わり

そこで少々手荒なのですが、送信する部分の間に delay(10) を挿入してみました。

・・・はい、やっとうまく動作しました。

NE   :    0
VS   : 0.0
Q    :3276754.3
ATM :99.0
THEX1:1310702
THEX2:1310702
QP   : 0.0
MOD: 90

ATMがECU内蔵センサで計測している気圧です。
その他はセンサ類を付けていないので正常な値ではありません。


やれやれ、やっとのことで正常動作したようです。

実はテストに使ったECUは大分古いバージョンなので、最近のECUでも通信が可能かをテストするようです。






コメントの投稿

非公開コメント

プロフィール

haiga

Author:haiga
私のブログへようこそ!
電気オンチが始めた自作オーディオです
2010/3/17 電子工作をプラスしました。

自作オーディオの楽しみ共有のため、私が作ったパーツ提供をしてます。質問や要望を遠慮なくコメント欄に書き込んでください。

FC2カウンター
その日1回目にアクセスいただいた方の総カウントです
最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。