关于按钮触发和定时器的问题
我在采用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)
为了实现一个,可通过按钮调节基准时间,并通过按钮进行启动的简易电子表,我们需要如下准备。
数电-基于FPGA的自动售货控制系统设计
本次数电的课程设计是设计一款基于FPGA的自动售货控制系统,因为手上暂时没有FPGA的板子,所以先采用proteus仿真进行设计,观察系统效果,等之后FPGA板子下发,再移到quartus上调试和下载。同样是自己第一次自主设计电路系统,可能在功能上不完整或者逻辑上有错误,大家多多包涵,欢迎沟通交流。
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)彼此修改后的程序代码,然后决定是继续提交还是取消提交。...


