当前位置:首页 > 技术学院 > 技术前线
[导读]MSP430F5529之捕获模式下的HCSR04超声测距(粗略)

前段时间需要用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用捕获的方法,如果要精确的话,还需要校准时钟频率等等。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭