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
大家好、
我正在尝试使用 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秒测量周期 } }
>#pragma vector = Timer1_A0_vector
这仅适用于 TA1CCR0 (仅限)。 尝试:
>#pragma vector = Timer1_A1_vector
也就是说、您会发现很难捕获以1MHz 运行的10us 脉冲的两个边沿。 (估计最少20-30个 MCLK、仅用于进入/退出 ISR、而您只有10个 MCLK。) 选项:
1) 1)加速 MCLK。 在8MHz 时、您将拥有80个 MCLK、这可能是可行的。 (提示:首先抓取 TA1CCR1。) 16MHz 将会相当舒适。
2)使用 DMA 获取 CCR 值。 遗憾的是、我在可用的 DMA 触发器中看不到 TA1CCR1 [SLAS704F 表6-12]。 您可以改用 TA1CCR2 (P1.3)吗? 此外、我不知道捕获相应 TA1CCTL1的好方法、因此您必须稍后将序列拼接在一起。
3) 3)分离输入线并将其馈入 TA1.1和 TA1.2。 一个边沿使用 CCR1、另一个边沿使用 CCR2。 它们具有通用时基、因此两个捕获是可比较的。
是的、加快时钟速度可能是最简单的。
[编辑:修正了措辞。]
您好 Marc、
一个注释、
最好避免这样的陈述:
Distance_cm =(TA1CCR1 -计数器)/58;
中断功能。
分频操作需要很多时间、如果可能的话、应该在中断之外完成。
举例来说:
8MHz F1611上的整数除法约为57µs μ s。
在5994 @ 16MHz 时、可能需要超过20µs μ s 的时间。
我希望明天或星期日我有时间研究您的代码。
Mark、您好!
我对整数-整数除法进行了额外的调查。
对于 MSP430FR5969支持的 CPUx 架构、
一个整数-整数除以等于41的固定值(2^5+2^3+2^0)
大约需要200个 CPU 周期。
但是、使用 Horner 或 Horner+CSD 架构时、执行除法运算的时间
可以减小10倍。
请查看下面从 www.ti.com/.../slaa329.pdf 中提取的表格
在本例中、使用 Horner 架构时、可能需要用值58除以多项式2^5+2^4+2^3+2^1表示、
让我们猜测、由于一个位置的多项式更长、周期增加30%。
不过、值得知道的是、Horner 方法存在。
你好,切尔特
首先、非常感谢您的帮助。 我实际上对整个微控制器领域非常陌生。
经过一些研究后、我还发现 Timer0_A1矢量只是 ccr0寄存器的矢量、我必须使用 Timer1_A1矢量。
我 一定会看一下 Horner 计划、但我也为自己做了一些小事情。
不可能仅在 ISR 上升沿和下降沿时刻捕获定时器寄存器的实际值、并在主函数中进行距离计算。
我要测量的距离只是水箱中的水位、水箱中的水位将缓慢变化、在大多数时间内根本不会改变、我想在泵启动之前只触发测量。 可能还可能只需要一个计时器周期、bc 这足以确定水位。
此外、我还可以运行@ 16MHz 的整个系统、以获得更多时间、这一点已有人提到过。
事情是、我不知道传感器将回传脉冲发送到10us 触发脉冲的时间有多长、但我实际上认为它将超过10us。
此致
Marc