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

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

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

64,616 Views
798821723
Contributor I
大家好,我按手册46.7.5.12章的脉冲输出功能 Pulse-Output Mode,按照例程编写代码,用官方的开发板测试,能够发送脉冲,但是我用逻辑分析仪查看脉冲数有时正确,有时会多发一个,不知是什么问题。 请大家指点谢谢。
0 Kudos
Reply
26 Replies

55,090 Views
798821723
Contributor I

我将LENGTH=0是想发送完毕后读取CNTR中的数值,LENGTH=1后就会在计数完成后CNTR就被预装载了新值,这样就读不到数值了。

0 Kudos
Reply

3,416 Views
798821723
Contributor I

您好:我将LENGTH=1后计数仍然不正确,有时会多发1个脉冲,反复测试脉冲只会多发不会少发。

0 Kudos
Reply

3,409 Views
798821723
Contributor I

我需要发送准确的脉冲数量来控制步进电机转动一定的角度,发送的脉冲数量不能多也不能少,这样才能保证角度准确。

我现在实现了10HZ-500KHZ的频率发送,就是脉冲数有多发现象,打断点调试时感觉是手册例程TMR1关断不及时造成会多发一个,监控CNTR的计数值和比较寄存器的值是一样的,有点头大不知什么问题了,请大家指点一下。感谢

0 Kudos
Reply

3,405 Views
798821723
Contributor I
xample: 47.6.5.12.1 Pulse Outputs Using Two Counters // (See Processor Expert PulseStream bean.) // This example generates six 10ms pulses, from QT1 output. // Assuming the chip is operating at 60 MHz. // // To do this, timer 3 is used to generate a clock with a period of 10ms. // // Timer 1 is used to gate these clocks and count the number of pulses that have // been generated. // void PulseStream_Init(void) { // Select IP_bus_clk/16 as the clock source for Timer 3 /* TMR3_CTRL: CM=0,PCS=0x0C,SCS=0,ONCE=0,LENGTH=1,DIR=0,COINIT=0,OUTMODE=3 */ setReg(TMR3_CTRL,0x1823); /* Set up mode */ /* TMR3_SCTRL: TCF=0,TCFIE=0,TOF=0,TOFIE=0,IEF=0,IEFIE=0,IPS=0,INPUT=0, Functional Description i.MX RT1050 Processor Reference Manual, Rev. 1, 03/2018 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); /* Reset load register */ setReg(TMR3_COMP1,37500); /* (16 * 37500 ) / 60e6 = 0.01 sec */ /* 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); /* Set up comparator control register */ // Timer 3 output is the clock source for this timer. /* TMR1_CTRL: CM=0,PCS=7,SCS=0,ONCE=1,LENGTH=1,DIR=0,COINIT=0,OUTMODE=7 */ setReg(TMR1_CTRL,0x0E67); /* Set up mode */ /* 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); /* Reset counter register */ setReg(TMR1_LOAD,0x00); /* Reset load register */ setReg(TMR1_COMP1,0x04); /* Set up compare 1 register */ // set to interrupt after the last pulse /* 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); /* Set up comparator control register */ // Finally, start the counters running setReg(TMR3_CNTR,0); /* Reset counter */ setRegBitGroup(TMR3_CTRL,CM,0x01); /* Run source clock counter */ setRegBitGroup(TMR1_CTRL,CM,0x01); /* Run counter */
0 Kudos
Reply

3,400 Views
798821723
Contributor I

使用的47.6.5.12 Pulse-Output Mode

使用的这个例程

TIMx->CHANNEL[OutChanel].CTRL&=~TMR_CTRL_CM_MASK; /* 复位计数器 */
TIMx->CHANNEL[TimChanel].CTRL&=~TMR_CTRL_CM_MASK; /* 复位定时器 */
//选择IP_bus_clk / 16作为定时器3的时钟源
/* 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秒 */
if(Plusefreq<10000)
{
TIMx->CHANNEL[TimChanel].CTRL=0x1E23; /* 设置模式 */
TIMx->CHANNEL[TimChanel].COMP1=IpFreq/128/(Plusefreq);
}
else
{
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,
Capture_Mode=0,MSTR=0,EEOF=0,VAL=0,FORCE=0,OPS=0,OEN=1 */
TIMx->CHANNEL[OutChanel].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); /* 运行源时钟计数器 */

 

这是我改动的例程

0 Kudos
Reply

3,380 Views
jeremyzhou
NXP Employee
NXP Employee

Hi,
Thank you for your interest in NXP Semiconductor products and for the opportunity to serve you.
After going through your demo code, it's basic as same as the code in the RM (as the figures show).

jeremyzhou_1-1615775707524.png

 


And I find that the below code is inconsistent with the comment, so please check it carefully.

// 定时器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的时钟源 */


Have a great day,
TIC

-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!

 

- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------

0 Kudos
Reply