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.

[参考译文] MSP430FG6626:在上升沿和下降沿进行捕捉是有效的、但只能是第一次!

Guru**** 2391005 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1300179/msp430fg6626-capture-on-both-rising-and-falling-edges-works-but-only-first-time

器件型号:MSP430FG6626

您好!

我的目的是测量方波信号的导通和关断持续时间。 计时器的频率为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 ;  

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

    [这些代码片段不能很好地匹配在一起、但在行之间读取:]

    我不明白更改输入频率(在限制范围内)为什么会产生非常不同的结果。 我通常估算使用大约30kHz 至40kHz 的捕获来测量频率的上限、但使用 DMA 可以做得更好。

    您能否提供一个不同频率的示例、其中包含错误结果? 这里可能有线索。

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

    您好、Bruce、感谢您的快速响应。

    事实证明、我使用的信号发生器噪声非常大。 当我使用另一个信号发生器进行测量时、结果是正确的。

    我很抱歉不必要地困扰了论坛界。 祝你一切顺利!