主题中讨论的其他器件: CSD
工具/软件:Code Composer Studio
大家好、
我正在尝试使用 Grove 超声波测距仪进行一些距离测量。
计划发送10us 的脉冲、捕获来自传感器的回波的高电平时间、然后计算距离。
但是、我似乎无法进入 ISR (我从 TA1的示例代码文件之一复制了 ISR)。 我已将 TA0用于其他作业、因此必须使用 TA1:
我将 TA1配置为捕获模式、并在 P1.2 (根据数据表、它是计时器1 CCR1寄存器)上等待接收回波信号并触发 ISR:
#include
#include "stdint.h"
#include
#include
unsigned int 计数器;
unsigned int Distance_cm;
//计时器 A1中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = Timer1_A0_vector
__interrupt void Timer1_A0_ISR (void)
#elif defined (__GNC_ICS_
)(timer1_A0)(void)#interrupt 1)(timer1_A0)(void 1)(void 1)(void timer1_ISR (void)(void 1)(void 1)(void 1)(
#endif
{
IF (TA1CCTL1和 CCI) //上升沿
{
计数器= TA1CCR1; //将计数器值复制到变量
}
其他 //下降沿
{
//公式:以 cm 为单位的距离=(以 uec 为单位的时间)/58
Distance_cm =(TA1CCR1 -计数器)/58;
}
TA1CCTL1 &=~CCIFG; //清除中断标志-已处理
}
//时钟系统设置
无效 clock_init(){
CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
CSCTL1 = DCOFSEL_0; //将 DCO 设置为1MHz
CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 SMCLK = MCLK = DCO
// ACLK = VLOCLK
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; //将所有分频器设置为1
CSCTL0_H = 0; //锁定 CS 寄存器
}
//timer1A 设置
void timer_init(){
TA1CTL = tassel_2 | MC_2; // SMCLK、续 模式
TA1CCTL1 = CM_3 | SCS | CAP | CCIE;//在上升沿和下降沿进行捕捉、将 CCI1A 与时钟同步、
//捕获模式,捕获中断使能
}
void peripheral_init(){
P1DIR |= BIT3; //设置触发的输出
P1DIR &=~BIT2; //设置回波输入
P1SEL0 |= BIT2; //将 P1.2配置为 TimerA1的捕捉输入(CCI1A)
P1SEL1 &=~BIT2;
}
void main (void){
WDTCTL = WDTPW | WDTHOLD; //停止看门狗定时器
PM5CTL0 &&=~LOCKLPM5; // MSP430FR5969需要此功能!
clock_init ();
timer_init ();
peripheral_init ();
init_UART ();
P1OUT &=~BIT3; //Keep trigger low
//欢迎字符串 over UART
send_str ("Ultrasonic Distance Measurement in cm:");
__bis_SR_register (GIE);
while (1)
{
//测量距离
P1OUT ^= BIT3; //触发高电平
_DELAY_CYCLES (10); // 10us 宽
P1OUT ^= BIT3; //触发低电平
_DELAY_CYCLES (50000); // 0.5秒测量周期
}
}