1245184_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

1245184_ja-JP

1245184_ja-JP

QTMERパルス出力機能使用時に過剰なパルスカウントが発生する問題みなさんこんにちは。マニュアルのセクション 46.7.5.12 のパルス出力機能に従いました。パルス出力モードで、サンプルコードに従って公式開発ボードでテストしました。パルスは送信できますが、ロジックアナライザでパルス数を確認すると、正しいパルスが送信されるときと、1つ余分にパルスが送信されるときがあります。何が問題なのかわかりません。ご助言いただければ幸いです。ありがとうございます。Re: 使用QTMER 脉冲输出功能脉冲数多发问题

こんにちは、

根本的な問題が何であったか考えたことがありますか?RT1020 でも非常によく似た状況ですが、Keil を使用していません。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

こんにちは、

私が共有したサンプルプログラムを使用して、この波形を取得できましたか?そうでない場合は、私のプロジェクトを直接ダウンロードし、MCUXpresso IDEを使用してテストしてください。

すてきな一日を!
チック

---------------------------------------------------------------------------------
注記:
- この投稿があなたの質問への回答である場合は、「正解としてマーク」ボタンをクリックしてください。ありがとう!


- スレッドは最後の投稿から7週間フォローされます。それ以降の返信は無視されます。
後ほど関連する質問がある場合は、新しいスレッドを開いて、閉じたスレッドを参照してください。
---------------------------------------------------------------------------------

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

データ送信後、シミュレーションモードでソフトウェアを使用してコードをリセットし、再送信しましたか?KEILソフトウェアでリセットしてコードを再実行したところ、誤った数のパルスが送信されました。ボードの電源投入後の最初のコード実行時のみ、正しい数のパルスが送信されます。

あるいは、Keil を使ってテストしていただくと便利ですでしょうか? または、私がお送りした KEIL のサンプルをご覧になって、そのサンプルを使ってテストしていただくことも可能です。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

こんにちは、
MCUXpreeso IDEを使用しています。出力はMIMXRT1050のGPIO_AD_B1_00、J23-6にあるため、関連するピンを初期化する必要があります。対応するコードはBOARD_InitPins()関数にあります。
すてきな一日を!
チック

---------------------------------------------------------------------------------
注記:
- この投稿があなたの質問への回答である場合は、「正解としてマーク」ボタンをクリックしてください。ありがとう!


- スレッドは最後の投稿から7週間フォローされます。それ以降の返信は無視されます。
後ほど関連する質問がある場合は、新しいスレッドを開いて、閉じたスレッドを参照してください。
---------------------------------------------------------------------------------

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

コードをボードにダウンロードした際に、ボードのリセットボタンを押すとロジックアナライザで波形がキャプチャされ、キャプチャされた波形と波形数は常に正しいことに気付きました。しかし、Keilのデバッグモードでソフトウェアを使用してボードをリセットすると、ロジックアナライザでキャプチャされたパルス数が1つ増加します。これを試して原因を確認してください。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

シミュレーション中に波形が表示されません。ボードは手動でリセットすることで波形をキャプチャできますが、波形とパルス数が正しくありません。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

IMXRT1050-EVKBマザーボード

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

ピンはJ23のピン6です。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

/*
* 著作権 2017-2020 NXP
* 無断転載を禁じます。
*
* SPDXライセンス識別子: BSD-3条項
*/

/****************************************************************************************
* 含まれるもの
**********************************************************************************/
#include "fsl_debug_console.h"
#include "board.h"

#include "bsp_tmr.h"
//#include "fsl_qtmr.h"

#include "pin_mux.h"
#include "clock_config.h"
/****************************************************************************************
* 定義
**********************************************************************************/
/* ボードに使用されるQTMRインスタンス/チャネル */
#define BOARD_QTMR_BASEADDR TMR3
#定義 BOARD_FIRST_QTMR_CHANNEL kQTMR_Channel_0
#定義 BOARD_SECOND_QTMR_CHANNEL kQTMR_Channel_1
#define QTMR_ClockCounterOutput kQTMR_ClockCounter0Output


/* 使用されるQTMRインスタンスの割り込み番号と割り込みハンドラ */
#define QTMR_IRQ_ID TMR3_IRQn
#define QTMR_IRQ_HANDLER TMR3_IRQHandler

/* QTMR Ipg クロック ソースのクロック ソース ディバイダ。以下の 2 つのマクロの値は揃える必要があります。*/
#define QTMR_PRIMARY_SOURCE (kQTMR_ClockDivide_128)
#QTMR_CLOCK_SOURCE_DIVIDER (128U) を定義します。
/* ソースクロックを分周した後の周波数。*/
#QTMR_SOURCE_CLOCK (CLOCK_GetFreq(kCLOCK_IpgClk) / QTMR_CLOCK_SOURCE_DIVIDER) を定義します。

/****************************************************************************************
* プロトタイプ
**********************************************************************************/

/****************************************************************************************
* 変数
**********************************************************************************/

揮発性ブール qtmrIsrFlag = false;

/****************************************************************************************
* コード
**********************************************************************************/
void QTMR_IRQ_HANDLER(void)
{
/* 割り込みフラグをクリアします。*/
QTMR_ClearStatusFlags(BOARD_QTMR_BASEADDR、BOARD_SECOND_QTMR_CHANNEL、kQTMR_CompareFlag);

qtmrIsrFlag = true;
}


/*!
* @brief メイン関数
*/
int メイン(void)
{
uint32_t i = 0;
qtmr_config_t qtmrConfig;

gpio_pin_config_t gpt_config;

gpt_config.direction = kGPIO_DigitalOutput;
gpt_config.outputLogic = 0;
gpt_config.interruptMode= kGPIO_NoIntmode;


/* ボードピン、クロック、デバッグコンソールの初期化 */
BOARD_ConfigMPU();
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();

GPIO_PinInit(GPIO1, 16, &gpt_config);

QTMR_GetDefaultConfig(&qtmrConfig);

/* 入力チャネルを初期化します。*/
qtmrConfig.primarySource= QTMR_PRIMARY_SOURCE;
QTMR_Init(BOARD_QTMR_BASEADDR、BOARD_SECOND_QTMR_CHANNEL、&qtmrConfig);

IpFreq=CLOCK_GetFreq(kCLOCK_IpgClk);
//PlsueCh0Init();
PulseChxStream_Init(TMR3、TMR3_IRQn、100000、4、1、0、0x0A67);
(i=0;i<100000000;i++);

PulseChxStream_Init(TMR3、TMR3_IRQn、100000、4、1、0、0x0A67);
(i=0;i<100000000;i++);

PulseChxStream_Init(TMR3、TMR3_IRQn、100000、4、1、0、0x0A67);
(i=0;i<100000000;i++);

PulseChxStream_Init(TMR3、TMR3_IRQn、100000、4、1、0、0x0A67);

一方(1)
{
}
}

私は、qtmr_timer への代コードを移植する例の代わりに、ソース ファイルを置き換え、板卡真にダウンロードし、波形を分析して取得しませんでした

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

KEIL をお使いですか? 私は KEIL 5.27 を使用していますが、機能ファイルを開くことができません。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

こんにちは、
共有していただいたコードに基づいて、SDK ライブラリの evkbimxrt1050_qtmr_timer コードを変更し、パルス出力モードを実装しました。テスト後、関数は正常に動作しました。
PWM出力ピンは、MIMXRT1050ではGPIO_AD_B1_00、J23-6です。

jeremyzhou_0-1616056266688.png


添付ファイルには私のコードが含まれています。

すてきな一日を!
チック

---------------------------------------------------------------------------------
注記:
- この投稿があなたの質問への回答である場合は、「正解としてマーク」ボタンをクリックしてください。ありがとう!


- スレッドは最後の投稿から7週間フォローされます。それ以降の返信は無視されます。
後ほど関連する質問がある場合は、新しいスレッドを開いて、閉じたスレッドを参照してください。
---------------------------------------------------------------------------------

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

KEIL 5.27開発環境を使用

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

アナライザーは GPIO2 のピン 6 を測定します。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

こんにちは、

完全なコード プロジェクトを共有して、MIMXRT1050 ボードでテストし、問題を再現できるかどうかを確認してください。

すてきな一日を!
チック

---------------------------------------------------------------------------------
注記:
- この投稿があなたの質問への回答である場合は、「正解としてマーク」ボタンをクリックしてください。ありがとう!


- スレッドは最後の投稿から7週間フォローされます。それ以降の返信は無視されます。
後ほど関連する質問がある場合は、新しいスレッドを開いて、閉じたスレッドを参照してください。
---------------------------------------------------------------------------------

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

この方法を使ってステッピングモーターの角度制御を行いたいのですが、送信するパルス数が間違っていると、モーターの回転角度の精度に確実に影響が出てしまいます。

繰り返しテストを行った結果、QTMER チャネル 0 がカウント比較後に時間内に出力をシャットダウンしなかったため、出力チャネルが余分なパルスを送信したと思われます。

チップのハードウェアの問題ではないかと考えています。私のプログラムはマニュアルの例に厳密に従っています。1052-EVKでテストすることもできます。

コード例があれば私に送っていただければ、ロジック アナライザーでテストします。

ありがとう!

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

こんにちは。この現象は定期的に発生するものではありません。送信されたアイテムの数は正しい場合もあれば、複数回連続して試行するとエラーが発生する場合もあります(常に1つ余分なアイテムが送信されます)。

一度送ったときには数量は合っているのに、再度送ったときにはもう 1 つ多く送ってしまう、といったことも起こります。

ただし、各チップのリセット後に送信される最初の数値は正しいですが、後続のリセットで送信される数値は正しくありません。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

こんにちは、

あなたがおっしゃった現象は毎回起こるのでしょうか、それとも発生率や発生順序は決まっているのでしょうか?

すてきな一日を!
チック

---------------------------------------------------------------------------------
注記:
- この投稿があなたの質問への回答である場合は、「正解としてマーク」ボタンをクリックしてください。ありがとう!


- スレッドは最後の投稿から7週間フォローされます。それ以降の返信は無視されます。
後ほど関連する質問がある場合は、新しいスレッドを開いて、閉じたスレッドを参照してください。
---------------------------------------------------------------------------------

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

送信完了後にCNTRの値を読み取れるように、LENGTH=0に設定しました。LENGTH=1に設定すると、カウント完了後に新しい値がCNTRにプリロードされてしまうため、値を読み取れなくなります。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

こんにちは。LENGTH=1 に設定しても、カウントがまだ正しくありません。時々余分なパルスが送信されます。繰り返しテストしたところ、パルスは頻繁に送信されていることがわかりました。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

こんにちは、
NXP Semiconductor 製品にご興味をお持ちいただき、また、サービスを提供させていただく機会をいただき、ありがとうございます。
デモ コードを確認すると、基本的には RM のコードと同じです (図に示すように)。

jeremyzhou_1-1615775707524.png



また、以下のコードはコメントと矛盾しているようです。SOよくご確認ください。

// 定时器3的输出是该定时器的时钟源。
/* TMR1_CTRL: CM=0,PCS=7,SCS=0,ONCE=1,LENGTH=1,DIR=0,COINIT=0,OUTMODE=7 */
TIMx->CHANNEL[OutChanel].CTRL=OutMode; /* 0x0A47 设置模式 TMR3的定时器1作为通道0的时钟源 */


すてきな一日を、
TIC

---------------------------------------------------------------------------------
注記:
- この投稿があなたの質問への回答である場合は、「正解としてマーク」ボタンをクリックしてください。ありがとう!


- Threadは最後の投稿から7週間フォローされます。それ以降の返信は無視されます。
後ほど関連する質問がある場合は、新しいThreadを開いて、閉じたThreadを参照してください。
---------------------------------------------------------------------------------

Re: 使用QTMER 脉冲输出功能脉冲数多发问题

バージョン47.6.5.12のパルス出力モードを使用

このルーチンは

TIMx->CHANNEL[OutChanel].CTRL&=~TMR_CTRL_CM_MASK; /* カウンターをリセット */
TIMx->CHANNEL[TimChanel].CTRL&=~TMR_CTRL_CM_MASK; /* タイマーをリセット */
//タイマー3のクロックソースとしてIP_bus_clk / 16を選択
/* TMR3_CTRL: CM = 0、PCS = 0x0C、SCS = 0、ONCE = 0、LENGTH = 1、DIR = 0、COINIT = 0、OUTMODE = 3 */
// TMR3->CHANNEL[1].COMP1=CLOCK_GetFreq(kCLOCK_IpgClk)/128/Plusefreq; /* (16 * 37500)/60e6 = 0.01秒*/
(プラス度数 < 10000)の場合
{
TIMx->CHANNEL[TimChanel].CTRL=0x1E23; /* モードを設定 */
TIMx->CHANNEL[TimChanel].COMP1=IpFreq/128/(Plusefreq);
}
それ以外
{
TIMx->CHANNEL[TimChanel].CTRL=0x1023; /* モードを設定 */
TIMx->CHANNEL[TimChanel].COMP1=IpFreq/1/(Plusefreq);
}
/* TMR3_SCTRL: TCF = 0、TCFIE = 0、TOF = 0、TOFIE = 0、IEF = 0、IEFIE = 0、IPS = 0、INPUT = 0、
機能説明
Capture_Mode = 0、MSTR = 0、EEOF = 0、VAL = 0、FORCE = 0、OPS = 0、OEN = 0
/
TIMx->CHANNEL[TimChanel].SCTRL=0x00;
TIMx->CHANNEL[TimChanel].LOAD=0x00; /* ロードレジスタをリセット */
/* TMR3_CSCTRL: DBG_EN=0,FAULT=0,ALT_LOAD=0,ROC=0,TCI=0,UP=0,OFLAG=0,
TCF2EN=0、TCF1EN=0、TCF2=0、TCF1=0、CL2=0、CL1=0 */
TIMx->CHANNEL[TimChanel].CSCTRL=0x00; /* コンパレータ制御レジスタを設定する */
// タイマー 3 の出力はこのタイマーのクロック ソースです。
/* TMR1_CTRL: CM=0,PCS=7,SCS=0,ONCE=1,LENGTH=1,DIR=0,COINIT=0,OUTMODE=7 */
TIMx->CHANNEL[OutChanel].CTRL=OutMode; /* 0x0A47 モードTMR3のタイマー1をチャネル0のクロックソースとして設定します */
/* TMR1_SCTRL: TCF=0,TCFIE=0,TOF=0,TOFIE=0,IEF=0,IEFIE=0,IPS=0,INPUT=0,
キャプチャモード=0、MSTR=0、EEOF=0、VAL=0、FORCE=0、OPS=0、OEN=1 */
TIMx->CHANNEL[出力チャネル].SCTRL=0x0001;
TIMx->CHANNEL[OutChanel].CNTR=0x00; /* カウンタレジスタをリセット */
TIMx->CHANNEL[OutChanel].LOAD=0x00; /* ロードレジスタをリセット */
TIMx->CHANNEL[OutChanel].COMP1=PluseData; /* 比較のために1つのレジスタから出力されるパルス数を設定します */
// 最後のパルスの後に割り込みを設定する
/* TMR1_CSCTRL: DBG_EN=0,FAULT=0,ALT_LOAD=0,ROC=0,TCI=0,UP=0,OFLAG=0,
TCF2EN=0、TCF1EN=1、TCF2=0、TCF1=0、CL2=0、CL1=0 */
TIMx->CHANNEL[OutChanel].CSCTRL=0x40; /* コンパレータ制御レジスタを設定する */
// 最後に、カウンターを開始します。
TIMx->CHANNEL[TimChanel].CNTR=0; /* カウンターをリセットする */
// /* 割り込み優先度を設定する */
// set_IRQn_Priority(IRQn、Group4_PreemptPriority_6、Group4_SubPriority_0);
// /* 割り込みを有効にする */
// EnableIRQ(IRQn);

TIMx->CHANNEL[OutChanel].CTRL|=(1<<13); /* 実行カウンタ */
TIMx->CHANNEL[TimChanel].CTRL|=(1<<13); /* ソースクロックカウンタを実行する */


これは私が修正したルーチンです。

Re: 使用QTMER 脉冲输出功能脉冲数多发问题例: 47.6.5.12.1 2 つのカウンターを使用したパルス出力 // (プロセッサ Expert PulseStream bean を参照してください。)// この例では、QT1 出力から 6 つの 10 ミリ秒のパルスを生成します。// チップが 60 MHz で動作していると仮定します。// // これを行うには、タイマー 3 を使用して、周期 10 ミリ秒のクロックを生成します。// // タイマー 1 はこれらのクロックをゲートし、生成されたパルスの数をカウントするために使用されます。// void PulseStream_Init(void) { // タイマー 3 のクロック ソースとして IP_bus_clk/16 を選択します /* TMR3_CTRL: CM=0、PCS=0x0C、SCS=0、ONCE=0、LENGTH=1、DIR=0、COINIT=0、OUTMODE=3 */ setReg(TMR3_CTRL、0x1823); /* モードを設定 */ /* TMR3_SCTRL: TCF=0、TCFIE=0、TOF=0、TOFIE=0、IEF=0、IEFIE=0、IPS=0、INPUT=0、機能説明 i.MX RT1050 プロセッサリファレンスマニュアル、Rev. 1、2018 年 3 月 2726 NXP Semiconductors Capture_Mode=0、MSTR=0、EEOF=0、VAL=0、FORCE=0、OPS=0、OEN=0 */ setReg(TMR3_SCTRL、0x00); setReg(TMR3_LOAD、0x00); /* ロードレジスタをリセット */ setReg(TMR3_COMP1、37500); /* (16 * 37500 ) / 60e6 = 0.01 秒 */ /* TMR3_CSCTRL: DBG_EN=0、FAULT=0、ALT_LOAD=0、ROC=0、TCI=0、UP=0、OFLAG=0、TCF2EN=0、TCF1EN=0、TCF2=0、TCF1=0、CL2=0、CL1=0 */ setReg(TMR3_CSCTRL,0x00); /* コンパレータ制御レジスタを設定します */ // タイマー 3 出力は、このタイマーのクロック ソースです。/* TMR1_CTRL: CM=0、PCS=7、SCS=0、ONCE=1、LENGTH=1、DIR=0、COINIT=0、OUTMODE=7 */ setReg(TMR1_CTRL,0x0E67); /* モードを設定 */ /* TMR1_SCTRL: TCF=0、TCFIE=0、TOF=0、TOFIE=0、IEF=0、IEFIE=0、IPS=0、INPUT=0、Capture_Mode=0、MSTR=0、EEOF=0、VAL=0、FORCE=0、OPS=0、OEN=1 */ setReg(TMR1_SCTRL,0x01); setReg(TMR1_CNTR,0x00); /* カウンタレジスタをリセット */ setReg(TMR1_LOAD,0x00); /* ロード レジスタをリセットします */ setReg(TMR1_COMP1,0x04); /* 比較 1 レジスタを設定します */ // 最後のパルスの後に割り込みを設定します /* TMR1_CSCTRL: DBG_EN=0、FAULT=0、ALT_LOAD=0、ROC=0、TCI=0、UP=0、OFLAG=0、TCF2EN=0、TCF1EN=1、TCF2=0、TCF1=0、CL2=0、CL1=0 */ setReg(TMR1_CSCTRL,0x40); /* コンパレータ コントロール レジスタを設定します */ // 最後に、カウンターの実行を開始します setReg(TMR3_CNTR,0); /* カウンターをリセットします */ setRegBitGroup(TMR3_CTRL,CM,0x01); /* ソース クロック カウンターを実行します */ setRegBitGroup(TMR1_CTRL,CM,0x01); /* カウンターを実行します */Re: 使用QTMER 脉冲输出功能脉冲数多发问题

ステッピングモーターを特定の角度で回転させるには、正確な数のパルスを送信する必要があります。正確な角度制御を実現するために、送信するパルス数は多すぎても少なすぎてもいけません。

10Hzから500kHzまでの周波数伝送を実装したのですが、パルスカウントが余計に発生しています。ブレークポイントを使ってデバッグしているのですが、マニュアルのサンプルコードでTMR1を適切なタイミングで無効化できなかったためにパルスカウントが余計に発生しているのではないかと考えています。CNTRのカウントと比較レジスタの値は一致しています。全く手詰まりで、何が問題なのか全く分かりません。どなたか助けていただけると大変助かります。ありがとうございます。

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎11-22-2025 08:45 AM
更新者: