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.
工具/软件: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、并且可以进行一些焊接、则可以在板上安装/启用晶体。