历史上的今天
今天是:2024年10月21日(星期一)
2019年10月21日 | MSP430F5529之捕获模式下的HCSR04超声测距(粗略)
2019-10-21 来源:eefocus
前段时间需要用MSP430F5529,因为是个菜鸟,很多都不会,遇到了很多问题,百度好多东西都是千篇一律的,好些东西都是Ctrl+c,Ctrl+v。而有很多老鸟,可能说不定也是菜鸟一个呢!!一副为了你好的样子,你看手册啊,手册不会吗?你用示波器打啊,示波器不会吗?你什么单位啊,示波器都没有吗?所以才打算在把这个捕获模式搞清楚后发一篇自己的心得吧.。发了半天牢骚,正文如下。
要用捕获我们得搞清楚捕获的原理是什么,捕获的原理是通过计数器,记录从使能开始到设定的沿的数值(也可以理解为时间)。在设定为捕获模式下,使能过后,计数器TA0R就开始计数了,在单步调试过程中,可以通过观察CCS里面的Registers各个寄存器的变化来深入的理解。


上面分别是CCS单步调试的时候的寄存器图和MSP430F5529的引脚图,根据引脚图我们可以知道,关于定时器TA0.0相关的功能在P1.1引脚上,以此类推对应起来。这次我用到的是P1.4引脚,也就是TA0.3,选择了TA0.3那么,相对应的捕获到的时间的值,是在TA0CCTL3那里。

然后我们可以通过写TA0CCTL3里面的寄存器,来选择模式,关于什么模式下是什么作用,可以通过头文件,看头文件里面的注释,也可以通过看上图Register中Value一栏的值,如:CM下的00-CM_0功能是Capture mode 1(捕获模式1)。
在单步调试的过程中,我们可以看到,计数器计数的过程中,TA0R每一个单步都会变,在捕获到设定好的边沿时,TA0R的值会赋给TA0CCR3,然后TA0R再接着计数。
单步调试的大概思路就是这样的,我们接下来通过观察Expressions里面的值,来看我们捕获到的时间。

我这里没有连超声模块,就没有再次单步调试了,但是之前调试的过程是这样的。按照这个思路来应该没有问题。
根据超声模块HC_SR04的时序图可以知道:

超声模块内部发出信号需要先10us的高电平,最后我们需要捕捉一个上升沿和下降沿就好了,就可以得出时间了。
#include unsigned int k=0; unsigned int LastCCR1; //上一次高电平持续的时间,和距离正相关 unsigned int dat[20]; //通过数组备份采集到的数据 void HC_SR04Init(); void HC_SR04Start(); void TimeGetInit(); void main() { HC_SR04Init(); //初始化超声模块HC_SR04 TimeGetInit(); //初始化计数捕获引脚,模式等 _EINT(); while(1) { HC_SR04Start(); LPM0; } } /*初始化HC_SR04Init()模块*/ void HC_SR04Init() { P1DIR|=BIT2; } /*开始超声发送*/ void HC_SR04Start() { P1OUT|=BIT2; _delay_cycles(12); //至少持续10us的高电平 P1OUT&=~BIT2; } /*初始化捕获模式,获取时间*/ void TimeGetInit() { P1DIR&=~BIT4; P1SEL|=BIT4; TA0CTL=TASSEL_2+ID_0+MC_2+TACLR; TA0CCTL3=CM_1+SCS+CAP+CCIE+CCIS_0; } #pragma vector=TIMER0_A1_VECTOR __interrupt void TIMER0_A1_ISR(void) { _DINT(); //关中断 static unsigned char times=1; static unsigned char i=0; unsigned char j; unsigned int t; if(times==1) { LastCCR1=TA0CCR3; //记录下上次CCR3的值 TA0CCTL3&=~CM_1; //清上升沿捕获 TA0CCTL3|=CM_2; //改为下降沿捕获 times++; } if(times==0) { if(i<20) //把采集到的20次的值都放到数组中 { dat[i]=TA0CCR3-LastCCR1;; i++; } if(i>=20) //为了防止误差,排序把采集到的两头两尾的值去掉,取中间的平均值 { for(i=0;i<20;i++) { for(j=0;j<20-i;j++) { if(dat[j]>dat[j+1]) { t=dat[j]; dat[j]=dat[j+1]; dat[j+1]=t; } } } t=0; for(i=7;i<12;i++) { t=t+dat[i]; } k=t/5; i=0; } TA0CCTL3&=~CM_2; //清除下降沿触发 TA0CCTL3|=CM_1; //变为上升沿触发 times++; //改变times的值 } times&=0x01; //times>1时清0 LPM0_EXIT; //退出低功耗模式 TA0CCTL3&=~CCIFG; //清除中断响应标志 _EINT(); //开中断 } 这个没有具体的算时间,但是我根据距离S=V*(t/2)大概算了下,这里时间粗略为:t=k*1us。像那么回事,这里只是讲下MSP430F5529用捕获的方法,如果要精确的话,还需要校准时钟频率等等。
史海拾趣
|
引用《移动在线》 GSM数字移动通信发展非常迅速,从早期规划的大区制,到后来的小区制,直到现在的微蜂窝、微微蜂窝,相对应的天线从早期架设在屋面铁塔上,到后来天线降到屋面上,直到现在要把天线设置在屋面下的外墙侧面上。所有的这些变化都说 ...… 查看全部问答> |
|
印制电路板(转)PS:谁还有PCB的有关知识,劳驾补充学习下~ 印制电路板,又称印刷电路板,印刷线路板,英文简称PCB或PWB,是重要的电子部件,是电子元器件的支撑体,是电子元器件电气连接的提供者。由于它是采用电子印刷术制作的,故被称为“印刷”电路板。 历史 印制电路板的发明者是奥地利人保罗·爱斯 ...… 查看全部问答> |
|
1.4 深度睡眠模式设置步骤 处理通过调用WFI 指令即可进入睡眠模式,但要进入深度睡眠实现最低的功耗需要正确配置,其步骤如下: 1. 使能ACG 自动时钟门控。这样睡眠模式和深度睡眠模式的外设时钟可以单独控制。 2. 配置寄存器DCGC0、 DCGC1 和DC ...… 查看全部问答> |
|
新买的博创公司的270A开发板,用的是pxa270芯片,我按照它上面的介绍烧写WINCE5.0后,发现显示屏不停的开关,并没有出现像他们说的烧写完后自动运行.下面是超级终端出现的代码,各位帮忙解答一下,我对这是个绝对的菜 FlashWrite: dwLengt ...… 查看全部问答> |
|
51单片机的全局变量在主程序中输入值改变后,在中断中却没有改变 我的主程序中,在AD转换后赋值一全局变量,在输入值改变后,它是随着改变的,在串口中断中发送给上位机,中断发出的值为什么不随输入的改变而改变呢?请有经验的人给以指点.非常感谢!!… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 请问广州哪里有零售漆包线、绝缘纸和绝缘漆的地方?? 昨天下午走了一下午,传说中有这些东西的解放中,都没看见有卖忘各位朋友指出哪里有得买 … 查看全部问答> |




