关于按钮触发和定时器的问题

weixin_45698347 weixin_45698347 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

我在采用cc2530mini开发板进行sr-04超声波模块的实验,我希望能够实现按下按钮触发模块测距。模块触发条件是trig引脚高电平10us以上触发。我将trig引脚连接到p0_5引脚,采用timer3定时延迟,timer1捕获echo的信号。在写了逻辑代码后始终没有响应。通过逻辑分析仪测试发现按下按钮,p0_5引脚第一次为9.5us,连续按3下按钮,第一次为9.5us,后续为6.5us。当我修改延时长度,修改为30us时,按下按钮实验现象不变,仍为第一次为9.5us,后续为6.5us。但是当我将延时改为5时,变为6.4us。当延时数字大于10的时候均为9.5。请问这是怎么回事,我应该怎么修改。以下是我的部分代码

 

超声波触发代码

void SR04_Trigger(void)
{
    TRIG_LOW();
    Delay_us(2);
    TRIG_HIGH();
    Timer3_Delay_us(20);
    TRIG_LOW();
}

// 测量距离(单位:cm)
float SR04_CaptureDistance_cm(void)
{
    uint16 duration;
    float distance;

    echo_done = 0;
    SR04_Trigger();

    
    TRIG_LOW();
    // 等待捕获完成(最多等待30ms)
    uint16 timeout = 30000;
    while (!echo_done && timeout--) Delay_us(1);

    if (!echo_done)
        return -1.0; // 超时,无回波

    if (echo_end >= echo_start)
        duration = echo_end - echo_start;
    else
        duration = (0xFFFF - echo_start + echo_end); // 溢出处理

    // 每tick = 0.5us,duration单位为tick
    // 距离 = 时间(us) × 0.0343 / 2
    distance = (duration * 0.5f * 0.0343f);

    return distance; // 单位cm
}

延时代码

#pragma optimize=none
void Timer3_Delay_us(uint16 us)
{
    // 设置 Timer3 为模模式,tick=1us(F/1),手动装载
    T3CTL = 0x08;       // 模式,F/1,无溢出中断
    T3CNT = 0;
    T3CTL |= 0x10;      // 启动 Timer3

 while (T3CNT < (us / 4)); // 等待满足 us

    T3CTL &= ~0x10;     // 停止 Timer3
}

按钮触发代码

static void zclSampleSw_HandleKeys( byte shift, byte keys )
{ 
  if(keys & HAL_KEY_SW_6)
  {
            sendSyncSignalAndUltrasound(); // 调用超声波函数
  }
} 



void sendSyncSignalAndUltrasound(void)
{
     float distance;
     SR04_Init();
        distance = SR04_CaptureDistance_cm();
        if (distance > 0)
            printf("Distance = %.2f cm\r\n", distance);
        else
        {
            printf("No Echo Detected.\r\n");
            HalLcdWriteString("No Echo Detected.",HAL_LCD_DEBUG_LINE_1);
        }
}

zcl_sampleloop中部分代码

  if ( events & SYS_EVENT_MSG )
  {
    while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( zclSampleSw_TaskID )) )
    {
      switch ( MSGpkt->hdr.event )
      {
        case ZCL_INCOMING_MSG:
          {
            xxx
            }

          break;

        case KEY_CHANGE:
          zclSampleSw_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
          break;

        case ZDO_STATE_CHANGE:
          
          break;          
        default:
          break;
      }

      // Release the memory
      osal_msg_deallocate( (uint8 *)MSGpkt );
    }

    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }

 

...全文

相关推荐

基于stm32定时器与EXTI外部中断的简易电子表(EEDevice_1)

为了实现一个,可通过按钮调节基准时间,并通过按钮进行启动的简易电子表,我们需要如下准备。

ZK_H

数电-基于FPGA的自动售货控制系统设计

本次数电的课程设计是设计一款基于FPGA的自动售货控制系统,因为手上暂时没有FPGA的板子,所以先采用proteus仿真进行设计,观察系统效果,等之后FPGA板子下发,再移到quartus上调试和下载。同样是自己第一次自主设计电路系统,可能在功能上不完整或者逻辑上有错误,大家多多包涵,欢迎沟通交流。

LoG.MAX

S4 Hana SD -信贷管理 - 02

在S4版本中,客户的信用管理数据在事务代码BP维护,业务伙伴角色是UKM000。在维护过程中,我们并不能直接输入信贷控制范围这个组织架构,而是需要输入一个信用段,并且在信用段的维度下去维护相应信用管理数据。对于信用段,可以分为主信用段(信用段是0000)和其他临时信用段,我们可以通过配置把次级信用段的客户信贷负债汇总到主信用段。当然,在后台也有配置,会把信用段和信贷控制范围这两者进行关联.3.2SPROIMG > 财务供应链管理 > 信用管理 > 信贷风险监视 > 主数据 > 创建信用段。

码农清风

Android Audio常见问题分析方法

分析audio dump,确定写给BT的data是否正常,MTK平台Android原生架构分析threadloop write节点,高通平台分析QXDM 1586节点,从dump确定问题大概位置。分析systrace 确定性能。AudioFocus状态(用于播放或者音量异常的情况)。AudioTrack是否正常创建bt连接是否正常通路异常,setMode,setSpeakerphoneOn等都会影响设备选择,sco调用流程是否正常。

一条老狗ˉ

Gerrit 使用操作手册

Gerrit是一种免费、开源的代码审查工具,使用网页交互页面。这个软件的名称来自于荷兰设计师师赫里特·里特费尔德(GerritRietveld),作者为Google公司的ShawnPearce。它使用Git作为底层版本控制系统,相比于其他的代码管理工具,Gerrit明显的特色是代码审核。利用网页浏览器,同一个团队的软件程序员,可以相互审核(Review)彼此修改后的程序代码,然后决定是继续提交还是取消提交。...

九离⠂
评论 2
收藏 已收藏
分享
返回顶部
weixin_45698347
ZigBee 682 成员 635 内容