文脈に入るために私はこれをやっています:ドライバー(A4988)へのパルス周波数入力の変化を通してステッパーモーターを駆動します(この質問のためにこれの機能を知る必要はありません)。ここで、パルスの周波数を変化させます (エンジン速度を変化させます)。モーター シャフトの 1 回転で 200 パルスが必要であることを知っておく必要があります (エンジンは 1 ステップあたり 1.8 ° です)。
私はエンジンを手に入れ、彼を 1 秒で 1 回転させました。期間 = 0.005 秒
これをプログラムするために、TimerUnit_LDD というコンポーネントを使用しています。周波数163840Hzでカウント
全体ターン1の場合は、この機能を頻繁に使用することを取得します。
---- main.c
TU1_Enable (TU1_DeviceData);
TU1_SetPeriodTicks (TU1_DeviceData, 410);
パラメータ410は、次のように、ピンの値を変更することによってプログラムされたパルスを送信する場合と同様に、必要な期間と比較されます。ハイパルスとローパルスの両方が考慮されます。
----- イベント.c
TU1_OnCounterRestart void (* UserDataPtr LDD_TUserData)
{
Step1_NegVal ();
}
上記の深刻な近似値を念頭に置いて、深刻な定式化の周期は 819.2 です (オシロスコープで見た周波数は 200 Hz (ok) です)。
すでにコンテキストに入力されている問題は次のとおりです。
---- main.c
TU1_Enable (TU1_DeviceData); // Enable the counter
TU1_SetPeriodTicks (TU1_DeviceData, 410); // Setting the desired period
for (;;) {
TU1_Enable (TU1_DeviceData);
WAIT1_Waitms (1000); // Rotation time
TU1_Enable (TU1_DeviceData); // Disable the counter
}
このコードを使用して、周波数計算が正しく、1 秒で 1 回転することを確認しようとしています。しかし、何が起こるかというと、回転はしますが、もう少しオフセットされます。これは、コードの各行に必要なランタイムを通過すると思います。
私が知りたいのは、イベント内の変数の数値をどのように取得できるかということです。どうすればこのようなことができますか。
---- main.c
TU1_Enable (TU1_DeviceData); // Initialize the counter
TU1_SetPeriodTicks (TU1_DeviceData, 410); // Setting the desired period
for (;;) {
for (;;) {
if (GetValue (x) == 200) break; // GetValue (x) This function is what I want to achieve
}
WAIT1_Waitms (1000);
}
----- イベント.c
TU1_OnCounterRestart void (* UserDataPtr LDD_TUserData)
{
Step1_NegVal ();
x = x + 1;
}
GetValue (x) この関数は、Events.c にある x の値を取得し、espefico を制御するためのパルス数を定義します。
変数を取り、カウンターの影響を受け、これが 200 になる (1 秒で 1 ターン)。
これにより、メネラが単独で孤独に送信され、多かれ少なかれ200パルスのみであることが確実になります。
これは、CNC マシンのプログラムを作成するのと同じくらい具体的にする必要があり、最高の精度が非常に重要です。
理解していただければ幸いです。私はスペイン語を話します。これは Chrome によって翻訳されました。
C 言語、Freescale KL25Z、CodeWarrior、OPEN_SDA、