主题中讨论的其他器件: 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秒测量周期 } }