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.

MSP432 SDK 多通道ADC采集例程问题

SDK版本:simplelink_msp432p4_sdk_3_40_01_02

CCS10.1.0

我在使用FreeRTOS的ADC驱动例程(adcbufmultichannel)遇到问题,我把P5.4接到3.3v,P5.5接到GND,通过串口显示采集结果,我看不出哪个是通道一的结果,哪个是通道2的结果。

  • 请您重新以附件形式上传一下图片,谢谢
    另外您使用的是TI的红色开发板?
  • 是的,红色开发板。

  • 参考该例程的说明

    The sample buffer will contain alternating values between Board_ADCBUF0CHANNEL0 and Board_ADCBUF0CHANNEL1.

    也就是说,buffer内是交替的值[CH0,CH1,CH0,CH1…]

    您可以通过下面的代码来识别

    void adcBufCallback(ADCBuf_Handle handle, ADCBuf_Conversion *conversion,
        void *completedADCBuffer, uint32_t completedChannel) {
        uint_fast16_t i;
        uint16_t *completedBuffer = (uint16_t *) completedADCBuffer;
     
        for (i = 0; i < ADCBUFFERSIZE; i++) {
            outputBuffer[i] = completedBuffer[i];
        }
    
        if(completedChannel == CONFIG_ADCBUF0CHANNEL_0)
        {
            sem_post(&adcbufSem);
        }
     
        /* post adcbuf semaphore */
       // sem_post(&adcbufSem);
    }

    参考自: dev.ti.com/.../node

  • 我有两个问题:

    1. 可以在callback中打断点,并观察当前的channel号,我发现实际上每个通道完成后都会进入callback函数。如果释放信号量不加if限制,理论上每个通道完成后都会释放信号量,但实际上task似乎只能接收到channel1完成的信号量,接收不到channel0完成时释放的信号量,所以task每次只打印channel1的结果。

    2.按照您的建议,我在callback中释放信号量加了if条件(只有channel0完成时释放信号量),我定义了一个全局变量channel来观察当前的通道号,在task中打了一个断点,每当程序执行到断点,我看到channel并不是0,而是1。

  • haolong liu 说:
    如果释放信号量不加if限制,理论上每个通道完成后都会释放信号量

    是的,您的理解是正确的,理论上是应该两个channel交替的

    haolong liu 说:
    但实际上task似乎只能接收到channel1完成的信号量,接收不到channel0完成时释放的信号量

    您是如何测试的呢?

    haolong liu 说:
    每当程序执行到断点,我看到channel并不是0,而是1。

    我来测试一下后回复,谢谢

  • Susan Yang 说:
    haolong liu
    但实际上task似乎只能接收到channel1完成的信号量,接收不到channel0完成时释放的信号量

    您是如何测试的呢?

    Susan Yang,您好

    我想了一下,task是可以正确的接收信号量的。中断发送信号量,任务接收信号量的机制是没有问题的,只是多通道采集时,在任务执行打印之前,channel1的结果覆盖了channel0的结果,所以channel0结果一直没办法被任务打印

  • 抱歉,之前漏掉了您的帖子。您现在测试的情况如何了?
  • 例程中用一个outputbuffer来存储两个channel的数据,我认为处理流程如下:
    1. channel0采集完成,并存储到outputbuffer中,发送信号量adcbufSem;
    2. task接收到信号量,准备打印outputbuffer中的数据,在打印数据之前,channel1采集完成,覆盖了outputbuffer;

    所以现象就是串口一直在打印channel1的结果,而没有channel0的结果。

    设置两个outputbuffer0, outputbuffer1分别存储channel0和channel1的数据, 问题就解决了。
  • 很高兴您能解决问题。谢谢您分享解决方法!