社区导航

 

搜索
查看: 153|回复: 0

[资料分享] MSP430F5529之捕获模式下的HCSR04超声测距

[复制链接]

5516

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-9-10 18:59 | 显示全部楼层 |阅读模式

#include<msp430f5529.h>
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();                    //开中断
}



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-10-20 17:21 , Processed in 0.073427 second(s), 16 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表