2392112_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2392112_ja-JP

2392112_ja-JP

S32K344 - EMIOS - IPM(入力周期測定)データ取得エラー

こんにちは、

私はS32K3X4EVB-T172評価ボードのEMIOSモジュール用のベアメタルドライバーを書いています。


現在、EMIOS_0設定済みで、256倍グローバルプリスケーラーを使い、チャネルは以下の通りです:

CH_23 -> MCアップカウンター(EmiosカウンターバスAのタイムベース)@ 625 kHz

CH_17 -> OPWMBモードで動作中(カウンタバスAを使用)

CH_22 -> MCアップカウンター(EmiosカウンターバスFのタイムベース)@ 156.25 kHz

CH_9 -> IPMモードで動作中(カウンタバスFを使用)


オシロスコープで検証された16.18Hzの信号を生成し、50%のデューティサイクルで、OPWMBチャネル(PTA0)からIPWMBチャネル(PTA1)へルーティングしています。

10msごとにIPMサンプルを取得しており、常に9657/9658が返されるため、測定された周期は9657 * 0.0000064 = 0.0618048となり、結果として周波数は1/0.0618048 = 16.18Hzとなります。

私が抱えている問題は、ほぼ周期的に誤った値が取得されることに関連しています(以下に示すとおり)。

期間[0] UINT16 40017
期間[1] UINT16 9658
期間[2] UINT16 9657
期間[3] UINT16 9658
期間[4] UINT16 40017
期間[5] UINT16 9658
期間[6] UINT16 9657
期間[7] UINT16 9658
期間[8] UINT16 40017
期間[9] UINT16 9658
期間[10] UINT16 9657
期間[11] UINT16 40018
期間[12] UINT16 9657
期間[13] UINT16 9658
期間[14] UINT16 9657
期間[15] UINT16 40018

こちらは、現在のポーリングベースの取得ロジック(DMAなし、割り込みなし)を説明するコードスニペットです:

もし(((EMIOS0->UC[9].S & 1u) != 0u)

{

UINT16 a1 = (UINT16)EMIOS0->UC[9]。A:

UINT16 b1 = (UINT16)EMIOS0->UC[9]。B;

UINT16 a2 = (UINT16)EMIOS0->UC[9]。A:

UINT16 b2 = (UINT16)EMIOS0->UC[9]。B;

if ( a1 != a2 )

{

if ( b1 != b2 )

{

期間[インデックス] = ( UINT16 )( a2 - b2 ) ;

}

そうでない場合、

{

期間[インデックス] = ( UINT16 )( a1 - b1 ) ;

}

}

そうでない場合、

{

期間[インデックス] = ( UINT16 )( a2 - b2 ) ;

}

インデックス++;

if ( Index > 99 u )

インデックス= 0 u ;

EMIOS0->UC[9]。S = EMIOS_UC_CLEAR_STATUS_FLG; /* 80008001u */

}


異なる周波数でテストを行った場合、外れ値の出現は大幅に減少するものの、依然として存在する。303Hzの例を以下に示します。

期間[0] UINT16 519
期間[1] UINT16 519
期間[2] UINT16 519
期間[3] UINT16 519
期間[4] UINT16 519
期間[5] UINT16 519
期間[6] UINT16 519
期間[7] UINT16 519
期間[8] UINT16 519
期間[9] UINT16 519
期間[10] UINT16 519
期間[11] UINT16 519
期間[12] UINT16 519
期間[13] UINT16 30879
期間[14] UINT16 519
期間[15] UINT16 519
期間[16] UINT16 519
期間[17] UINT16 519
期間[18] UINT16 519
期間[19] UINT16 519
期間[20] UINT16 519
期間[21] UINT16 519
期間[22] UINT16 519
期間[23] UINT16 519
期間[24] UINT16 519
期間[25] UINT16 519
期間[26] UINT16 519
期間[27] UINT16 519
期間[28] UINT16 519
期間[29] UINT16 519
期間[30] UINT16 519
期間[31] UINT16 519
期間[32] UINT16 519
期間[33] UINT16 519
期間[34] UINT16 519
期間[35] UINT16 519
期間[36] UINT16 519
期間[37] UINT16 519
期間[38] UINT16 519
期間[39] UINT16 519
期間[40] UINT16 519
期間[41] UINT16 519
期間[42] UINT16 519
期間[43] UINT16 519
期間[44] UINT16 519
期間[45] UINT16 519
期間[46] UINT16 519
期間[47] UINT16 519
期間[48] UINT16 519
期間[49] UINT16 519
期間[50] UINT16 519
期間[51] UINT16 519
期間[52] UINT16 519
期間[53] UINT16 519
期間[54] UINT16 519
期間[55] UINT16 519
期間[56] UINT16 519
期間[57] UINT16 519
期間[58] UINT16 30879
期間[59] UINT16 519


何かお役に立てることはありますか?

Re: S32K344 - EMIOS - IPM (Input Period Measurement) erroneous data acquisition

こんにちは、 @fede_ls さん

おそらく、あなたの投票ロジックは、観測された異常値の主な原因ではないでしょう。これらの値は、周期計算が選択されたカウンタバスのオーバーフローを正しく処理していないことを強く示唆している。現在の式(uint16_t)(A - B)は、16 ビットカウンタが 65536 で完全にロールオーバーすることを想定していますが、カウンタバス F は約 35176 ティックでロールオーバーするようです。したがって、キャプチャされた期間がカウンターのロールオーバーをまたぐたびに、観測された外れ値と正確に一致する65536 - 35176 = 30360ティックの追加オフセットが追加されます。
 
IPMチャネルのカウンターバスFとして使われるCH22の周期/モジュラスをご確認ください。周期は、暗黙的な16ビット符号なし減算ではなく、この実際のカウンタバスの剰余値を使用して計算する必要があります。
 

よろしくお願いいたします。

パベル

Tags (1)
No ratings
Version history
Last update:
Thursday
Updated by: