This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430G2553:[MSP430G2553+DRV8842]计时8842计时器A0在两个相同的卡上的工作方式不同

Guru**** 2539570 points
Other Parts Discussed in Thread: MSP430G2553, DRV8842

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/584510/ccs-msp430g2553-msp430g2553-drv8842-timer-a0-operates-differently-on-two-identical-cards

部件号:MSP430G2553
主题中讨论的其他部件: DRV8842

工具/软件:Code Composer Studio

你好

我正在处理由DRV8842和MSP430G2553组成的嵌入式卡。

我 通过DRV控制24[V]直流电动机,并通过MCU监测其他低功耗外围设备(LED,感应器等...)。

在我的代码中,我可以输入系统工作的秒数,但我突然 注意到,我在软件中确定的时间间隔与实际 执行之间存在间隔。

 在卡执行过程中还有大约7秒的间隙。 一张卡的运行时间约 为61秒,另一张卡的运行时间为69秒,其上的代码相同。

我推断了我在项目中使用的ISR。请帮我弄清楚我错过了什么。

谢谢

这是我的项目中ISR的一个示例。 这里也会出现同样的延迟 。

#include <msp430g2553.h>

//*** GPIO端口1的常量声明***********************************************************************************
#define I4 BIT0 // PIN NUM 2
#define RXD BIT1 // PIN NUM 3
#define TXD BIIT2 // PIN NUM 4
#define I1 BIT3 // PIN NUM 5
#define I0 BIT4 // PIN NUM 6
#define FAULTn BIT5 // PIN NUM 7
#define OK_LED BIT6 // PIN NUM 14

//********************************************************************************************************
//*** GPIO端口2的常量声明**********************************************************************************
#define RESETn BIT0 // PIN NUM 8
#define init_1 BIT1 // PIN NUM 9
#define init_2 BIIT2 // PIN NUM 10
#define RST_OUT BIT3 // PIN NUM 11
#define spare BIT4 // PIN NUM 12
#define faild_LED BIT5 // PIN NUM 13
#define I3 BIT6 // PIN NUM 19
#define I2 BIT7 // PIN NUM 18


void Config_TimerA (void);
void Config_GPIO (void);


int cnnt_sec, count_f;
int main (void){
WDTCTL = WDTPW + WDTHOLD;//停止看狗计时器
BCSCTL1 = CALC1_1MHz;
DCOCTL = CALDCO_1MHz;
BCSCTL3 |= LFXT1S_2;// LFXT1 = VLO,时钟默认,
IFG1 &=~OFIFG;


CONFIG_TimerA();
CONFIG_GPIO ();

// P1DIR |= BIT6;
P1OUT |= OK_LED;
count_f=1;

__bis_sr_register (GIE);
同时(1)

如果(cnt_sec=60)/60  秒时间间隔,  

cnt_sec=0;
P1OUT ^= OK_LED;

}
}
}


作废Config_TimerA (void)

TACTL = Tassel_1 + MC_1;
CCTL0 |= CCIE;
CCR0 +=1.2万;//一秒间隔
}


#pragma vector = TIMER0_A0_vector
__interrupt void Timer_A (void)

CCR0 +=1.2万;//一个SEC的周期
如果(count_f==1)

cnt_sec=cnt_sec+1;

}


}
void Config_GPIO (void)

// P1DIR ||(I4 +I1+I0 + OK_LED+FAULTn);//保护端口1的数字OUTUPTS
P1DIR ||(I4 +I1+I0 + OK_LED);//保护端口1的数字OUTUPTS
// P1OUT ||(I4 +I1+I0+FAULTn );//输出偏高
P1OUT |= I4;//输出高
P1OUT |= I1;//输出高
P1OUT |= I0;//输出高
P1OUT &=~ FAULTn;//输出高
P1REN |= FAULTn;
P1OUT |= FAULTn;
P1REN |= RXD;
P1OUT |= RXD;
P1REN |= TXD;
P1OUT |= TXD;
P1OUT &=~(OK_LED);//输出低

P2DIR ||(RESETn +INIT_2 +RST_OUT+ SPARE+FAILD_LED+I3+I2);//保护端口2的数字OUTUPTS
P2OUT |= RESETn;//输出高
P2OUT |= RST_OUT;
P2OUT |=故障LED;
P2OUT |= I3;
P2OUT |= I2;
// P2OUT &=~(init_2+spare+faild_LED);//输出低
P2OUT &=~ init_2;
P2OUT &=~Ω 备件;
P2OUT &=~故障LED;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Avraham,

    您从由VLO提供的ACLK获取TA0,如数据表中所述,其频率在4至20 kHz之间变化,典型频率为12 kHz。 要获得更精确的定时配置源TA0来自SMCLK (1 MHz的校准DCO)或源ACLK来自32 kHz外部晶体振荡器。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CNT_sec需要具有易失性,因为它已在ISR中更新。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Ryan

    非常感谢您的帮助,这很成功。 为了计算60秒,我计算了1800个脉冲,这是有效的。

    我还不得不对我的项目做一些其他的修改,因为我的项目发生了变化,但时间差距 完全 消失了。

    现在我需要调整我的PWM功能,但这没有问题。

    此致,Avraham

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢Keith,我要改变一下。