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.

[参考译文] CC2640:如何使用辅助定时器0在 CC2640中获取 ADC 采样

Guru**** 2551110 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/576295/cc2640-how-to-get-adc-sampling-in-cc2640-using-aux-timer0

器件型号:CC2640

您好!

我的要求是以500Hz 的频率对多个通道(3个通道)进行采样。 我让系统以手动触发方式运行、其中的传感器控制器在 RTCTick = 131时被调用。 产生的频率接近500Hz (但不完全是)。  

我将在这里放置实现方案。  

#初始代码********

//安排第一次执行

fwScheduleTask (1);

#结束初始序列

#执行代码

//启用 ADC

adcEnableSync (ADC_REF_FIXED、ADC_SAMPLE_TIME_170_US、ADC_TRIGGER_MANUAL);

//探测点脉冲以检查采样率

//将 GPIO 拉为高电平以指示此采样阶段的开始

gpioSetOutput (AUXIO_O_SAMPLING_PROBE);

对于(U16 n = 0;n < SENSOR_OUTPUT_CNT;n++){

U16 p = n;

//选择 ADC 输入

adcSelectGpioInput (cfg.pAuxoASensorOutput[n]);

//插入延迟以实现稳定

fwDelayU (150、FW_DELAY_RANGE_200_US);

//对 ADC 值进行采样和存储

adcGenManualTrigger();

N = output.head;

adcReadFifo (output.pSamples[n]);

utilIncrAndWrap (n、buffer_size;output.head);

if (output.head=0){

fwGenAlertInterrupt();

N = p;

//将 GPIO 调低以指示此采样阶段结束

GpioClearOutput (AUXIO_O_SAMPLING_PROBE);

//禁用 ADC

adcDisable();

//安排下一次执行

fwScheduleTask (1);

#结束执行代码

终止代码中没有任何内容。  

此代码起作用。 但是、我想使用 AuxTimer0获取 ADC 采样、但无法执行该操作。  

首先、我在初始化代码中引入了 StartAuxTimer0 (2000)、希望采样每2000年发生一次。 我在执行代码中引入了以下语句时、代码陷入停顿。 后来我读出、一旦 StartAuxTimer0启动、就无法引入 adcEnableSync 或 adcEnableAsync。

AdcEnableSync (ADC_REF_FIXED、ADC_SAMPLE_TIME_170_US、ADC_TRIGGER_AUX_TIMER0);  

稍后、我在启动 AuxTimer0之前移动了 Init 例程中的 adcEnableSync 语句。 代码运行、但 ADC 输出是固定的、并且永远不会随着输入被提供的输入而改变。 我还尝试 在 adcEnableSync 之后将 StartAuxTimer0放入执行代码中、并在代码结束时停止 AuxTimer0、然后再禁用 ADC。 代码运行、但显然采样不是我所需要的。 我明白、为了获得连续的样本序列、AuxTimer0必须持续运行、并且无法启动和停止。

我已经搜索了很多东西来找到实现这一目标的正确方法、但不幸的是、关于这个主题的文档就在旁边、您能帮我实现使用 AuxTimer0进行采样的基本实现吗、即使它用于单个通道也是如此。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Goutam、
    使用辅助定时器0触发器时、传感器控制器必须处于激活模式。 请参阅 Sensor Controller Studio 中的 ADC Data Streamer 示例代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Erik、
    我可以让代码在您的指导下工作。 非常感谢。
    但我有一个问题。

    我使用以下序列调用一次传感器控制器代码:
    scifOsalInit();
    scifOsalRegisterCtrlReadyCallback (scCtrlReadyCallback);
    scifOsalRegisterTaskAlertCallback (scTaskAlertCallback);
    scifInit (&scifDriverSetup);
    SCIF_RESULT_T RC = scifExecuteTasksOnceNbl (BV (SCIF_ADC_DATA_Streamer_Task_ID));

    这运行正常。 我在主循环中获得警报通知、并进行相同的处理。
    我使用 scifClearAlertIntSource()清除警报,获取所有数据,最后使用 scifAckAlertEvents()确认警报。


    要停止传感器控制器、我执行以下操作:
    /*停止传感器控制器任务*/
    scifStopTasksNbl (BV (SCIF_ADC_DATA_Streamer_TASK_ID);
    scifResetTaskStruts (BV (SCIF_ADC_DATA_Streamer_TASK_ID)、SCIF_STRUCT_INPUT);

    //等待任务终止
    scifWaitOnNbl (100000);

    我不确定它是否正在停止传感器控制器、但在这里它不会伤害我。

    我遇到卡滞的地方是尝试重新启动传感器控制器以进行另一个捕获会话。 scifExecuteTasksOnceNbl()这次返回值1,这意味着 SCIF_NOT_READY (之前的非阻塞调用仍在运行)

    您能不能帮助指出其中的错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试放置
    scifResetTaskStruts (BV (SCIF_ADC_DATA_Streamer_TASK_ID)、SCIF_STRUCT_INPUT);
    之后
    scifWaitOnNbl (100000);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。 它的工作原理。 我必须增加等待时间。 非常感谢。

    高塔姆