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/MSP430G2231:MSP430G2231

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/914094/ccs-msp430g2231-msp430g2231

器件型号:MSP430G2231

工具/软件:Code Composer Studio

大家好、我的项目有一个问题、就是我要使用 msp430g2231微控制器、我想测量高达10MHz 的频率。我不熟悉微控制器(不是编程)、我不确定如何正确执行。我使用定制的 itoa 函数将 long int 转换为字符串、然后我发送 将计算值存储为 long 后、将其串接 LCD、然后我将其发送到 LCD、如下所示:

void send_string (char * s)

while (* s)

SEND_DATA (*秒);
S++;

void main (void)

WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
BCSCTL1 = CALBC1_1MHz;      //设置范围
DCOCTL = CALDCO_1MHz;      //设置 DCO 步长+调制
延迟(100);  //延迟100mS,直至下次屏幕刷新


/*** Timer_A 设置***/
  TA0CCR0 = SampleTuneTime;
  TA0CCTL0 |= CCIE;            //中断使能
  TA0CTL |= TASSEL_2 + ID_3;        // SMCLK
  TA0CCTL1 |= CCIE + CCIS_0 + CM_1 + CAP;//中断使能、捕获选择 CCIxA、正边沿、捕获模式
  TA0CTL |= tassel_2;           //SMCLK

  _BIS_SR (GIE);        //输入启用中断的 LPM0
   
       
             
  while (1)
  {

  TA0CTL |= MC0;        //启动定时器递增模式。定时器递增计数到 TACCR0
  TA0CTL |= MC1;        //启动计时器
  //while (CounterValue!= 400);//等待 CounterValue 不等于400
  TA0CTL &=~MC0;       //停止计时器模式
  TA0CTL &=~MC1;       //停止计时器

  结果>=2;        //将结果除以4
      CALC_FREQ();

      //将 long 转换为频率
      char buffer[8]={0、};
      unsigned long toLCD =频率;
    //  int Base = 10;
      itoa (toLCD、buffer);  //转换十进制
            
       lcd_init();  
       send_string ("frequency is");
       SEND_COMMAND (0xC0);
       send_string (buffer);
       SEND_COMMAND (0xC8);
       send_string ("Hz");

           结果= 0;         //零结果
          计数器值= 0;      //零计数器值
          StoredCount = 0;       //零 StoredCount
           TA0R = 0;          //零 Timer_A0寄存器
  }

#pragma vector=TIMER0_A0_VECTOR
_interrupt void Timer0_A0 (void)

  TA0CTL &=~MC0;       //停止计时器
  TA0CTL &=~MC1;       //停止计时器
  计数器值++;       //递增计数器值
    if (CounterValue >=(NumberSamples +1))//如果达到 NumberSamples +1、则重置值
      {
      计数器值= 0; //零计数值
      StoredCount = 0;  //无 StoredCount
      }
  Result += StoredCount;   //将累积计数存储在结果中(我使用 Result / Sample Time 计算频率
  StoredCount = 0;       //零 StoredCount
  TA0CTL |= MC1;        //启动计时器
  TA0CTL |= MC0;        //启动计时器
  StoredCount++;   //递增 StoredCount

 

这是使用定制函数对 itoa 和与 LCD 通信的程序 im 的主代码。我有两个问题

1)  我能否使频率计高达10MHz、因为 g2231有一个定时器和1MHz 校准可用。

2.)MC0和 MC1只能使用一个定时器 TA0CTL

感谢你能抽出时间。

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

    2) 2) MC0/1是一个2位字段中的位。 我建议您使用 MC_2 (连续)来设置该字段、并使用(~MC)来清除该字段。

    1) 1)您不会成功地使用捕获测量10MHz、因为即使在最高 CPU 速度(16MHz)下、也只能提供1.6个 CPU 时钟来处理每个捕获。

    捕捉对于低频信号很有用(首选)、但对于高频信号、您需要进行频率计数。 为此、您可以使用您的信号作为计时器的时钟(TACLK=P1.0)、然后在 TA0R 中定期对运行计数进行采样。 特别是对于 G2231、这带来了一些难题:

    a) TACLK 的运行速度不能超过 Fsystem [参考数据表(SLAS694J) p.25 ("Timer_A")]正如您提到的、G2231在1MHz 时只有一个 CALCO、您需要至少10MHz。 可以生成扩散式 CALDCO、但为此需要参考时钟(通常为32kHz 晶体)。

    B) G2231只有一个定时器、您可以将其用于信号、因此执行"定期采样"部分可能会比较棘手。 一种可能是__delay_cycles,它非常精确,但您的程序无法执行任何其他操作。 另一种是使用捕获、但使用不同的方法:TA0.CCI0B 触发使用 ACLK 捕获、从而为您提供 TA0R 的可靠周期性(每31+微秒)快照[参考数据表表、表10]。 要运行 ACLK (具有任何类型的精度)、确实需要32kHz 晶体。

    考虑到(A)和(B)、您可能需要32kHz 晶体。 如果您使用的是 G2 Launchpad、并且可以进行一些焊接、则可以在板上安装/启用晶体。