こんにちは、
私は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となります。
私が抱えている問題は、ほぼ周期的に誤った値が取得されることに関連しています(以下に示すとおり)。
こちらは、現在のポーリングベースの取得ロジック(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
何かお役に立てることはありますか?
こんにちは、 @fede_ls さん、
(uint16_t)(A - B)は、16 ビットカウンタが 65536 で完全にロールオーバーすることを想定していますが、カウンタバス F は約 35176 ティックでロールオーバーするようです。したがって、キャプチャされた期間がカウンターのロールオーバーをまたぐたびに、観測された外れ値と正確に一致する65536 - 35176 = 30360ティックの追加オフセットが追加されます。よろしくお願いいたします。
パベル