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.

[参考译文] MSP430G2452:生成脉冲

Guru**** 2510075 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/771756/msp430g2452-generate-pulse

器件型号:MSP430G2452

您好!

我正在使用代码(如下所示)生成脉冲序列(20mSec 重复率和7个500Hz 脉冲)。 现在、我要对其进行修改、使脉冲序列的第1个脉冲的频率为1kHz、而 REST 7脉冲的频率为500Hz、并且重新生成20mSec。  

所需的波形已附加。

我尝试通过更改 第一 个脉冲计数的 TA0CCR0和 TA0CCR1来修改它、但它不起作用。 有人能帮我吗? 提前感谢。 )

#include

#include

 

//可设置(在某些限制内)

//这些设置在 P1.2上生成可见输出。

#define long_Hz    50UL          //长周期重复频率为50Hz

#define SHORT 周期2000UL      //短(PWM)周期:2000个计时器节拍= 2ms

#define SHORT_CNT  7U          //每个长周期中有7个短脉冲

 

//推导出

#define TIMER_Hz    1000000UL    // 1MHz 时的定时器节拍(SMCLK/8 [ID=3])

#define LON_PERIOD (TIMER_Hz/LON_Hz)    //长时间内的定时器节拍

#define LON_CNT    (LON_PERIODE/SHORT_PERIOD)//长周期中的 PWM 周期

 

//从1到 LCNT 计数,以跟踪长周期。

uint16_t short_cycles;

 

// OUTMOD=7提供非反相 PWM (高、低)、这正是人们所期望的。

//后半部分也是低电平,因此我们可以切换到 OUT=0而不会出现毛刺脉冲。

#define CCTL_OUTMOD (OUTMOD_7)

#define CCTL_OUT  (0*OUT)

 

// pulse_isr ()

//每短周期计时器节拍中断一次,但最后期限为短周期/2,所以不要进行 dawdle。

 

#pragma vector=TIMER0_A1_vector

_interrupt void

PULSE_ISR ()

  TA0CCTL1 &=~CCIFG;    //我们确实应该查看 TA0IV,但我们只启用 CCTL1:CCIE

 

  ++SHort_cycles;        //向上计数(短) PWM 周期

 

  //对于第一个 SHORT_CNT PWM 周期、只需让 PWM 运行

  if (short_cycles < short_CNT)

  {

      /*empty*/

  }

  //对于下一个(long_CNT-short_CNT)周期、使用 out=0将其保持为低电平

  否则、如果(short_cycles < long_CNT)

  {

      //使用 OUTMOD=0、OUT=0强制它为低电平

      //我们重复执行此操作,但这比检查便宜。

      TA0CCTL1 &=~OUTMOD_7;    // OUTMOD=0 (OUT)。 我们提前设置(=0)。

  }

  //在 LON_CNT short (PWM)周期后、重新启动长周期

  其他

  {

      //重新启动 PWM。 在第二个半周期结束前、输出不会改变。

      TA0CCTL1 |= CCTL_OUTMOD;  //返回复位/设置

      short_cycles = 0;

  }

  返回;

 

//

// main()

//

内部

main (空)

  WDTCTL = WDTPW | WDTHOLD;  //停止看门狗计时器

 

  //请求是针对50us (短周期)脉冲,但不是很长

  //足够可靠地通过1MHz 的 ISR。

  //下一个更高的校准速度是8MHz,所以我们使用它。

  DCOCTL = CALDCO_8MHZ;

  BCSCTL1 = CALBC1_8MHZ;

 

  //计时器:P1.6=TA0.1上的 PWM (50%占空比、周期 SHORT 周期)

  // SMCLK=8MHz、因此除以/8即可得到 timer_Hz=1MHz

  short_cycles = 0;

  P1SEL |= BIT2;            // P1SEL.6=1设置 P1.6=TA0.1 [参考 SLAS735J 表19]

  P1DIR |= BIT2;            //将其设置为输出、因为计时器不会[另请参阅表19]

  TA0CCR0 = SHORT 周期-1;  //短周期时间(1MHz 周期)

  TA0CCR1 = SHORT_PERIODE/2-1;// 50%占空比、无特殊原因

  TA0CCTL1 = CCTL_OUTMOD|CCTL_OUT|CCIE;  // OUTMOD_7、OUT=0、IE

  TA0CTL = tassel_2 | ID_3 | MC_1 | TACLR;// SMCLK、/8、向上(、清除)

 

  _EINT();                  //启用 ISR

  while (1)

  {

      LPM0;                  //这里没什么可做的

  }

  /*NOTREACHED*/

  返回0;

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

    你(们)好

    由于您的脉冲是固定的且数字很小   ,因此您只需使用__delay_cycles ()即可使延迟更容易,并直接切换 GPIO 以生成脉冲。

    Gary

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看不到您在哪里更改 CCR0/1。

    我怀疑您可以在(SHORT_CYCLES==LON_CNT-1)时将 CCR0/1设置为较短的周期、在(SHORT_CYCLES=1)时设置为较长的周期。 长周期将缩短半个(短)周期;我不知道这对您有多重要。