您好!
我的目的是测量方波信号的导通和关断持续时间。 计时器的频率为20MHz。 我将来自外部信号发生器的信号(20kHz)馈入 P3.1。 下面您将看到我的代码。 (这是用于研究捕获过程的原始代码的较短版本。 您会看到一些变量声明 未在该代码段中使用)
当我第一次运行程序时、我在调试屏幕中看到捕获的值(捕获了8个值)、它们与信号完全匹配(例如471,622,472,622、470、 621,471,622)。 但是、如果我更改外部信号的频率或占空比、捕获的值将不再正确。
我阅读了用户指南、论坛、了解到了可能的原因可能是引脚悬空。 我 为 P3.1添加了上拉(P3REN |= BIT1 ; P3OUT |= BIT1 )和下拉电阻(P3REN |= BIT1 ; P3OUT &=~BIT1 ),但它没有帮助。 I 在 P3.1和接地之间连接了10K 电阻器(不调用 P3REN)。 同样、这也行不通。
然后、我尝试在捕捉中断例程和/或主程序中将 CCIS 更改为 GND 或 VCC、但没有成功。 开头带有两个斜杠符号的线是我的(失败的)试验。
如有任何建议,我将不胜感激。
#包含
#包含
#包含
#包含
#包含
#define f_system 19988.48
#define NUM_OF_CHANNELS 3
uint32_t say_ilk;
uint8_t cnt = 0;
uint32_t T_system;
uint16_t FAZ_farki;
uint16_t ratio_system;
uint16_t say1;
uint16_t t_deger[8];
空 main (void)
{
//停止 WDT
WDT_A_HOLD (WDT_A_BASE);
PMM_setVCore (PMM_CORE_LEVEL_3);
//设置 ACLK = XT1
UCS_initClockSignal (
UCS_ACLK、
UCS_XT1CLK_SELECT、
UCCS_CLOCK_DIVIDER _1
);
Ratio_system = round((Float)f_system*1000/32768);
//设置比率和所需的 MCLK 频率 并初始化 DCO
UCS_initFLLSettle (
F_SYSTEM、
比率系统
);
P3DIR = 0x00;P3SEL = BIT1;//(P3.1)定时器 TA1.CCI0A 捕捉输入;引脚编号:43
// P3REN |= BIT1;
// P3OUT |= BIT1;
TA1CTL = TASSEL_2 | MC_2 | TACLR ;// 1:ACLK - 2:SMCLK,连续模式
TA1CCTL0 = CM_3 | CCIS_0 | SCS | CAP | CCIE;//=在上升和下降沿捕捉 CCIxA
__enable_interrupt ();
while (1)
{
for (fr=22000 ; fr>19000 ; fr = fr-1)//此 for 循环在此代码段中是冗余的
{
TA1CCTL0 = CM_2 | CCIS_0 | SCS | CAP | CCIE;// TA1CCTL0 |= CCIE 就足够了
// TA1CCTL0 = CM_3| CCIS_3| SCS | CAP | CCIE ;
// TA1CCTL0 = CM_3 | CCIS_2 | SCS | CAP | CCIE ;
}
}
}
#pragma vector = Timer1_A0_vector
__interrupt void Timer1_A0_ISR (void)//自动清除标志
{
静态 uint16_t LastTime = 0;//上次捕获时间
t_deger[cnt]= TA1CCR0;
faz_farki = t_deger[cn]- LastTime ;//查找间隔(计数)
LastTime = T_deger[cnt];//为下一次捕获节省时间
cnt = cnt + 1;
if (cnt>7)// 8 captures
{
TA1CCTL0 &&(~CCIE);//退出中断例程
// TA1CCTL0 = CM_3| CCIS_2 | SCS | CAP ;
// TA1CCTL0 = CM_3| CCIS_2 | SCS | CAP ;
CNT=0;
}
// TA1CCTL0 &=(~CCIE);
// TA1CCTL0 = CM_3| CCIS_3| SCS | CAP ;
// TA1CCTL0 = CM_3| CCIS_2 | SCS | CAP ;
}