This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F1611:无线超声波传输和接收

Guru**** 2390755 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/656843/msp430f1611-wireless-ultrasound-transmission-and-reception

部件号:MSP430F1611

尊敬的各位:

我目前正在构建一个无线超声波透射和接收系统。

我的系统时钟通过交换数据包与无线网络同步。

我正在尝试定期传输和接收超声波,这应该是可能的,因为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

e2e.ti.com/.../3364.01bsp_5F00_radio_5F00_rx.c

e2e.ti.com/.../01bsp_5F00_radio_5F00_tx.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我完全不清楚(超声波)发送器和接收器是如何同步的。 同步网络时钟并不意味着相应的while ()循环以同步方式运行--如果没有其他内容,它们包含不同的代码,因此循环所需的时间也不同。

    此外,发射器中的触发周期为3.2768万 (~4秒),但接收器启用周期为1.8万 (~2.25 秒),因此即使同步,它们也会快速漂移。

    每侧停止并等待接收(时钟同步?) 数据包。 它们是否都接收相同的数据包? 如果是这样,此时它们可能已接近锁定步骤。

    您在多大程度上确定您修改后的HC-SR04是否符合您的预期? 可能值得在这个系统之外尝试一下(它们),即没有责任循环,以确保它们一起工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    TX和Rx不会相互同步,它们都从同一网络检索时间戳,并将同步到此时间戳,这意味着两个模块将在相同的时间范围内工作。

    下面是我要尝试的操作,我将实施代码,以便TX 模块每2秒开始传输一次,RX每2秒也会启动listenin。 正确地说,它们的两个TACR0都应该是默认值1.8万。

    如果我通过电线连接模块,我可以让它们正常工作。 我在开始之前已经对它们进行了测试,因为这是我的系统的最后一步。

    我们非常感谢您的帮助

    此致

    Yong

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    接收器仅在2秒(~2 % 占空比)中打开50毫秒,并且必须在发射器的音频脉冲到达20秒(共2秒)内打开。 RX和TX需要相当紧密地同步。

    双方有一个共同的时钟,但我看不到在某一特定时间触发某种东西的机制。

    您能否更频繁地运行接收器和/或发射器? 一个简单的答案是随时运行接收器。 或者,您可以在一段时间运行接收器,然后"连续"运行发射器(我不知道HC-SR04是否能非常有效地执行此操作),至少在这段时间内。 后一种方法用于某些无线电协议(请记住ContikiMAC)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    TX和RX模块在5us内相互同步,因为它们共享相同的主时钟。

    触发TX的机制设置为每1.8万个时钟触发一次,Rx设置为每1.7万个时钟触发一次,以确保RX不会错过。

    这将中断激发触发标志的TIMERA_Vector。

    //brief此函数在TimerA中断触发时调用。
    #pragma vector = TIMERA0_vector
    __interrupt void TIMERA0_ISR (void){
    app_vars.trig =1;//提升标记
    
    LEDs_all_on();
    
    } 

    我现在已经开始处理这个问题了,对于TX来说,代码工作正常,但对于RX模块,代码似乎不符合我所写的功能。

    代码应该能够收听美国的声音,并相应地触发ISR。 但是,我似乎没有得到任何一项工作。

    int mote_main(void){//
    
    清除局部变量
    memset(&app_vars,0,sizeof(app_vars_t));//
    
    初始化board_init()
    ;
    
    //设置
    
    
    
    
    
    
    UART计数器sctimer_setasnreadCb(cb_asncounter);//添加
    
    
    
    
    
    
    
    
    
    
    
    DIR函数radio scasn_setstart_scamecb; rb_radio; rb_cretch; rb_rb_cretch; rb=) //将WFP 2.3 设置为输出(1 =输出,0 =输入)
    P2OUT &=~0x08;//设置WFP 2.3 2.7 LOW
    P2DIR &=~0x80;//将WFP 2.7 设置为输入
    P2OUT |= 0x80;//将WFP 2.7 设置为高P2IE初始
    值|= 0x80;//启用WFP中断
    P2IFG &=~0x80; //提前清除引脚标志
    P2IES |= 0x80;//在下降边缘中断
    
    时(1){
    
    TACCTL0 = CCIE;//捕获/比较中断启用
    TACTL = Tassel_1 | MC_2 | ID_2;//选择ACLK,'计数'模式,输入分配器(4)
    TACCR0 +=1.7万; // 1.8万k@32kHz ~ 550 ms
    
    ,如果(app_vars.rxpk_buf[0 == 0x08]){
    
    app_vars.ASN =(uint64_t) app_vars.rx_buf[17]+(uint64_t) app_vars.rxpk_buf[18]<8) app_vars <intel_re_vars.64_
    时间7.25 (app_rx64_buars_ app_buars_ app_buars_ rf_buf[19_(<_
    app_re_)<intel_r_ app_r.pk_buars_
    
    在计算新的alpha和内容之前,如果错误太大,则切换LED
    app_vars.compensated_time =(app_vars.current_local_time - app_vars.previous_local_time)*app_vars.alpha + app_vars.previous_network_time;
    
    /*if (abs(app_vars.current_network_time - app_vars.compensated_time >5){ LEDs_all_on_on_off_all_on)}
    
    
    
    
    
    然后计算新的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;
    
    if (app_vars.previous_local_time ==0){ app_vars.=1;
    app_smoothers.elening 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
    
    
    app_vars.compensated_time_dbg>>8;
    
    
    app_vars.compensated_time_dbg>>32;= abs( app_vars.compensated_time)-(app_vars.current_network_time)); app_vars.compensated_time_dbg>>16;
    app_vars.compensated_time_dbg>>40; app_vars.current_network_time = apart_counter_app_vars.compensated_time_dbg; app_vars.compensated_time_dbg>>24;
    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;
    
    //发送app_vars.UARS.UART_txFrame over UART
    UART_clearTxInterrupts();
    UART_RXeInterrupts();
    UART_writeByte(app_vars.UARS.UART_counterFrame[app_vars.UARs.UARS.UARS.UARUARUAR_counterOUT];
    while
    
    
    
    
    
    (app_vars.ups.ups.ups.app_disch_ref_ref_^ p_reflects=0)= 2.3
    ~
    p_^ pet/p_08/0)0;petrapp_bycles p= p_modelf_p_p_0;p_08/08/1= p_byclus=0=0=0800; p_bycles p_0
    //延迟50 ms
    app_vars.trig = 0;
    }
    否则,如果(app_vars.echo !=0){
    LEDs_all_off();
    __delay_cycles(9.6万);//延迟20 ms
    //LEDs_all_on();
    app_vars.echo =0;//提升
    
    
    UART标志else { app_vars.}_done
    
    
    } 

    我们非常感谢您的帮助。

    谢谢你

    此致

    Yong Kim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RX和TX将根据其本地时钟在每个mote启动后的固定时间(~2.2秒)内激活(或至少触发)。 除非它们是在完全相同的时间(极不可能)启动的,否则它们不会在超声波信号上同步。

    我看到您正在计算同步时钟,但我看不到您在哪里使用它来同步双方的操作。

    RX占空比是否是项目的要求?