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.

CC1312R: sensor使用COMPB,在Event Handler A Code可以添加ADC采集模拟量的代码么?

Part Number: CC1312R

1:第一种实现方式,当某一个引脚电平大于某一个值时进入Event Handler A Code代码中,在进入时添加Timer  和ADC配合,采集一个50Hz的交流波形,一个周期,然后唤醒大核进行计算等别的操作,这样是可以实现的么?

2:第二种实现方式,当某一个引脚电平大于某一个值时进入Event Handler A Code代码时,立刻运行Execution Code里面的代码(Timer  和ADC配合,采集一个50Hz的交流波形,一个周期,然后唤醒大核进行计算等别的操作,),这样的功能应该通过

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待

  • 您好目前没有任何解决办法的消息吗?

  • 您好

    根据您的说明,总的来说均可以实现,从系统优化等上,建议第一种,能避免直接在Event Handler中执行完整采集流程(如20ms持续采样)会严重阻塞其他中断,导致系统响应延迟或看门狗超时。

  • 这两种方案我均已经尝试过,第一种会影响sensor对大核的正常那个唤醒,第二种会导致ADC不能及时采集而错过最佳波形,有没有优化解决方案

  • 您好

    官方不建议您使用第二种方案,建议您使用第一种方案来处理您的问题。

  • 第一种方案,导致不正常唤醒大核,会严重影响整个程序的运行,这个方案就是会出现这种情况无法解决么

  • 您好

    方案一唤醒可以通过中断优化,以及确认DMA完成中断后通过Semaphore来实现。

    方案二 在ISR中直接执行20ms采样会阻塞系统,导致其他中断无法响应,如果您坚持要用方案二的话吗, 确保Swi能及时抢占低优先级任务,但不会阻塞硬件中断。

    综上关于代码没有相对应的,只有相关建议。

  • 第一种方案我遇到的问题是,sensor唤醒主MCU异常,导致整个程序运行不正常;

    第二种我遇到的问题是,满足不了我得实时性,但是整个运行是没有问题的,但是不能自动来了即可就采集,请问有解决方案么

    关键问题分析

    1. 信号特性‌:目标波形为‌非周期性突发信号‌,无法通过固定频率采样捕捉。
    2. 触发机制‌:需依赖硬件信号实现‌事件驱动型采集‌(而非定时轮询),确保信号到来时立即响应。
  • 您好

    感谢您的回复!

    第一种方案我遇到的问题是,sensor唤醒主MCU异常,导致整个程序运行不正常;

    如果无法直接唤醒,那么定义标识位,当数据采集完成后。检测标识位后叫用相关函数进行唤醒,而不是直接进入。这样既保证您的转换过程的稳定,同事通过之后对于标识位的处理避免被中断打断而无法唤醒,同时也需要做中断优先级优化来进一步避免这种事情的发生。

    第二种我遇到的问题是,满足不了我得实时性,但是整个运行是没有问题的,但是不能自动来了即可就采集,

    需要做中断优化使得唤醒和采集处于伪同步的状态来实现,但这这样如果出现中断冲突会导致功能处理有问题。

    关于有没有具体的解决方案官方没有详细的支持资料,您可以尝试以上建议。

  • 如果无法直接唤醒,那么定义标识位,当数据采集完成后。检测标识位后叫用相关函数进行唤醒,而不是直接进入。这样既保证您的转换过程的稳定,同事通过之后对于标识位的处理避免被中断打断而无法唤醒,同时也需要做中断优先级优化来进一步避免这种事情的发生。

    您说的设置标志位唤醒没有完全理解,我目前使用的是COMPB中断来了之后程序会立刻运行Event Handler A Code 中的代码,将ADC周期采样放在这里面,然后使用fwGenAlertInterrupt();唤醒主MCU进行其他的操作,这样唤醒很不理想,您说的只用标志位唤醒,如果把标志位置位放在Event Handler A Code 代码中么?这样谁来识别唤醒主MCU呢?

  • 您好

    感谢您的回复!

    如我之前所说,关于您的这个具体的设计,官方只有一个有可行性的建议,没有相关具体的代码和测试完整的方案。相关函数您可以参考官方的SDK。

    dev.ti.com/.../node

  • 根据您那边的建议,我尝试了各种方法,依然和我之前的问题是一样的,或许我对您那边的建议没有完全理解:

    以下是传感器控制器(sensor)中Exent Handler A Code中代码

    // The first execution (triggered by the timer) must initialize the trigger level
    if (state.initDone == 0) {
    compbGetOutput(state.currTriggerLevel);
    gpioClearOutput(AUXIO_O_LED_POW);
    state.initDone = 1;
    }else{
    state.SendFlag=0;
    }

    ////ADC采集部分程序////

    timer1Start(TIMER1_MODE_PERIODICAL, 1250,0);
    // Select ADC input
    // Enable the ADC (fixed reference, 2.7 us sample time, manual trigger)
    adcEnableSync(ADC_REF_FIXED, ADC_SAMPLE_TIME_2P7_US, ADC_TRIGGER_MANUAL);
    for(U16 n = 0; n < 32; n ++){
    adcSelectGpioInput(AUXIO_A_ADC_PIN);
    adcGenManualTrigger();
    adcReadFifo(output.adcValue[n]);
    // Disable the ADC
    adcDisable();
    timer1Wait();
    }
    timer1Stop();


    // If the COMPB output is low...
    if (state.currTriggerLevel == 0) {

    //... Do something here ...
    gpioClearOutput(AUXIO_O_LED_POW);
    // Setup COMPB output high as next trigger
    evhSetupCompbTrigger(0, 1, EVH_COMPB_TRIG_ON_MATCH);
    state.currTriggerLevel = 1;

    // Otherwise (the COMPB output is high)...
    } else {

    //... Do something here ...
    gpioSetOutput(AUXIO_O_LED_POW);
    // Setup COMPB output low as next trigger
    evhSetupCompbTrigger(0, 0, EVH_COMPB_TRIG_ON_MATCH);
    state.currTriggerLevel = 0;

    }
    output.adcFlag=1;
    fwGenAlertInterrupt();

    该程序的结果就是无法正常唤醒主MCU

  • 您好

    感谢您的回复!

    针对于您分享的代码没有相关建议,如果您像在程序上有相关帮助,请您参考官方的公布的SDK的部分代码进行参考。

  • 我可以这么理解您表达的意思么?关于我的问题,您那边没有根本性解决办法,相关建议也只是猜测对么?

  • 您好

    针对于您的设计问题,官方给您理论上可以尝试的可行方案,但是由于官方没有针对性的代码。所以无法针对于您提供的代码提供针对性修改和提供相关针对性的资料。