尊敬的各位:
我目前正在构建一个无线超声波透射和接收系统。
我的系统时钟通过交换数据包与无线网络同步。
我正在尝试定期传输和接收超声波,这应该是可能的,因为TX模块和RX模块时间同步在5us错误内,因为它们共享相同的主时钟(无线网络)
我正在使用的超声波模块是HC-SR04,但我已对其进行了修改,以便每个模块只能传输和接收。
尝试合并这两个代码似乎比我想象的要复杂,看看下面的代码:
PIN和中断是初始化的,然后在执行时钟同步的地方进行循环。
这是我面临的一个问题,当主板进入睡眠状态时,它没有接收任何数据包,模块不能定期传输,除非它接收大约每6秒一次的数据包。
因此Tx模块应该能够传输3次左右,但不能。
我在此处附加了Tx和Rx代码。
//正在初始化超声
P2DIR |= 0x08;//将WFP 2.3 设置为输出(1=输出,0=输入)
P2OUT &=~0x08;//将WFP 2.3 设置为LOW
TACTL0 = CCIE;//捕获/比较中断启用
TACTL = Tassel_1 | MC_1 | ID_2;//选择ACLK,'Countup (计数)'模式,输入分配器(4)
TCCR0 += 1.8万;//~ 2.2秒
而(1){
如果(app_vars.trig !=0){//如果标记已被交替提升
LEDs_all_off();
P5OUT ^= 0x10;//切换红色LED
P2OUT ^= 0x08;//切换WFP 2.3 - TRIG
__delay_cycles (96);// delay ~ 20 us
P2OUT ^= 0x08;
__DELAY周期(24万);//延时50毫秒
P5OUT ^= 0x10;
app_vars.trig = 0;//清除标志
}
//在等待至少设置一个rxpk_done时休眠
app_vars.rxpk_done = 0;
while (app_vars.rxpk_done ==0){
Board_Sleep();
}
//如果我到达这里,我刚刚收到一个数据包
//=== 通过串行端口发送通知
//格式化帧以通过串行端口发送,显示从管理器检索到的ASN值
如果(app_vars.rxpk_buf[0]== 0x08){
app_vars.ASN =(uint64_t)app_vars.UART_txFrame[0]+((uint64_t)app_vars.UART_txFrame[1]<8)+((uint64_t)app_vars.UARS.UART_XFrame[2]+(((utx64_t)app_vars[32_intars)uars)3<_头 帧
app_vars.current_network_time =(app_vars.ASN * 7.25)*100万;
app_vars.current_local_time = app_vars.num_asn;
//--- 在计算新的alpha和材料之前,如果错误太大,您将切换LED
app_vars.compensated_time =(app_vars.current_local_time - app_vars.previous_local_time)* app_vars.alpha + app_vars.previous_network_time;
/*如果(abs(app_vars.current_network_time - app_vars.compensated_time)> 5){
LEDs_all_on();
}其他{
LEDs_all_off();
}*/
//--- 然后计算新的alpha
APP_vars.local_delta = APP_vars.current_local_time - APP_vars.previous_local_time;
app_vars.network_delta = app_vars.current_network_time - app_vars.previous_network_time;
如果(app_vars.previous_local_time == 0){
app_vars.alpha = 1;
}其他{
app_vars.alpha = app_vars.local_delta / app_vars.network_delta;//考虑在一段时间内平滑该值以减少噪音。 像指数曲线平均值这样的东西很容易实现
//还应考虑忽略过大或过小的alpha值。 1.001 或0.999 线已经很奇怪了
}
app_vars.previous_local_time = app_vars.current_local_time;
app_vars.previous_network_time = app_vars.current_network_time;
//---打印计算值和网络之间的差值
app_vars.compensated_time_dbg = abs(app_vars.compensated_time)-(app_vars.current_network_time));
APP_vars.UART_CounterFrame[0]= app_vars.compensated_time_dbg;
APP_vars.UART_CounterFrame[1]= app_vars.compensated_time_dbg>>8;
APP_vars.UART_CounterFrame[2]= app_vars.compensated_time_dbg>>16;
APP_vars.UART_CounterFrame[3]= app_vars.compensated_time_dbg>>24;
app_vars.UART_counterFrame[4]= app_vars.compensated_time_dbg>>32;
APP_vars.UART_CounterFrame[5]= app_vars.compensated_time_dbg>>40;
APP_vars.UART_CounterFrame[6]= app_vars.compensated_time_dbg>>48;
APP_vars.UART_CounterFrame[7]= app_vars.compensated_time_dbg>>56;
APP_vars.UART_Done = 0;
APP_vars.UART_CounterByte = 0;
//通过UART发送app_vars.UART_txFrame
UART_clearTxInterrupts();
UART_enableInterrupts();
UART_writeByte (APP_vars.UART_CounterFrame [APP_vars.UART_CounterByte]);
while (app_vars.UART_Done =0);//忙时等待完成
UART_DisableInterrupts();
}
我们非常感谢您的帮助。
谢谢你
此致
Yong Kim