TI中文支持网
TI专业的中文技术问题搜集分享网站

CC1310的ADC的continuous采样方式

CC1310F128 V2.1
SDK版本
simplelink_cc13x0_sdk_3_20_00_23
问题:目前需要采用连续采样的方式,总共8个通道,使用continuous方式时,callback只能收到第一个ADCBuf_convert通道的数据,如果需要开启多个通道同时进行时,需要怎么操作?

我测试,同时ADCBuf_convert两个通道时,adcBufCallback只能收到第一个通道的数据,单独任意一个通道都可以正常使用

源码如下:

void adcBufCallback(ADCBuf_Handle handle, ADCBuf_Conversion *conversion,
    void *completedADCBuffer, uint32_t completedChannel)
{
    uint_fast16_t i;
    uint_fast16_t uartTxBufferOffset = 0;

    /* Adjust raw ADC values and convert them to microvolts */
    ADCBuf_adjustRawValues(handle, completedADCBuffer, ADCBUFFERSIZE,
        completedChannel);
    ADCBuf_convertAdjustedToMicroVolts(handle, completedChannel,
        completedADCBuffer, microVoltBuffer, ADCBUFFERSIZE);

    /* Start with a header message. */
    uartTxBufferOffset = snprintf(uartTxBuffer,
        UARTBUFFERSIZE – uartTxBufferOffset, "\r\nBuffer %u finished.%u %s",
        (unsigned int)buffersCompletedCounter++, completedChannel,(completedChannel==1?"———–":""));

    /* Write raw adjusted values to the UART buffer if there is room. */
    uartTxBufferOffset += snprintf(uartTxBuffer + uartTxBufferOffset,
        UARTBUFFERSIZE – uartTxBufferOffset, "\r\nRaw Buffer: ");

    for (i = 0; i < ADCBUFFERSIZE && uartTxBufferOffset < UARTBUFFERSIZE; i++) {
        uartTxBufferOffset += snprintf(uartTxBuffer + uartTxBufferOffset,
            UARTBUFFERSIZE – uartTxBufferOffset, "%u,",
        *(((uint16_t *)completedADCBuffer) + i));
    }

    /* Write microvolt values to the UART buffer if there is room. */
    if (uartTxBufferOffset < UARTBUFFERSIZE) {
        uartTxBufferOffset += snprintf(uartTxBuffer + uartTxBufferOffset,
            UARTBUFFERSIZE – uartTxBufferOffset, "\r\nMicrovolts: ");

        for (i = 0; i < ADCBUFFERSIZE && uartTxBufferOffset < UARTBUFFERSIZE; i++) {
            uartTxBufferOffset += snprintf(uartTxBuffer + uartTxBufferOffset,
                UARTBUFFERSIZE – uartTxBufferOffset, "%u,",
                (unsigned int)microVoltBuffer[i]);
        }
    }

    /*
     * Ensure we don't write outside the buffer.
     * Append a newline after the data.
     */
    if (uartTxBufferOffset < UARTBUFFERSIZE) {
        uartTxBuffer[uartTxBufferOffset++] = '\n';
    }
    else {
        uartTxBuffer[UARTBUFFERSIZE-1] = '\n';
    }

    /* Display the data via UART */
    UART_write(uart, uartTxBuffer, uartTxBufferOffset);
}
void *mainThread(void *arg0)
{
    UART_Params uartParams;
    ADCBuf_Handle adcBuf;
    ADCBuf_Params adcBufParams;
    ADCBuf_Conversion continuousConversion;
    ADCBuf_Conversion continuousConversion2;

    /* Call driver init functions */
    ADCBuf_init();
    UART_init();

    /* Create a UART with data processing off. */
    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.writeMode = UART_MODE_CALLBACK;
    uartParams.writeCallback = uartCallback;
    uartParams.baudRate = 115200;
    uart = UART_open(Board_UART0, &uartParams);

    /* Set up an ADCBuf peripheral in ADCBuf_RECURRENCE_MODE_CONTINUOUS */
    ADCBuf_Params_init(&adcBufParams);
    adcBufParams.callbackFxn = adcBufCallback;
    adcBufParams.recurrenceMode = ADCBuf_RECURRENCE_MODE_CONTINUOUS;
    adcBufParams.returnMode = ADCBuf_RETURN_MODE_CALLBACK;
    adcBufParams.samplingFrequency = 200;
    adcBuf = ADCBuf_open(Board_ADCBUF0, &adcBufParams);

    /* Configure the conversion struct */
    continuousConversion.arg = NULL;
    continuousConversion.adcChannel = Board_ADCBUF0CHANNEL1;
    continuousConversion.sampleBuffer = sampleBufferOne;
    continuousConversion.sampleBufferTwo = sampleBufferTwo;
    continuousConversion.samplesRequestedCount = ADCBUFFERSIZE;

    if (adcBuf == NULL){
        /* ADCBuf failed to open. */
        while(1);
    }

    /* Start converting. */
    if (ADCBuf_convert(adcBuf, &continuousConversion, 1) !=
        ADCBuf_STATUS_SUCCESS) {
        /* Did not start conversion process correctly. */
        while(1);
    }
    /* Configure the conversion struct */
    continuousConversion2.arg = NULL;
    continuousConversion2.adcChannel = Board_ADCBUF0CHANNEL0;
    continuousConversion2.sampleBuffer = sampleBufferOne2;
    continuousConversion2.sampleBufferTwo = sampleBufferTwo2;
    continuousConversion2.samplesRequestedCount = ADCBUFFERSIZE/2;
    // sleep(100);
    if (adcBuf == NULL){
        /* ADCBuf failed to open. */
        while(1);
    }

    /* Start converting. */
    if (ADCBuf_convert(adcBuf, &continuousConversion2, 1) !=
        ADCBuf_STATUS_SUCCESS) {
        /* Did not start conversion process correctly. */
        while(1);
    }

    /*
     * Go to sleep in the foreground thread forever. The ADC hardware will
     * perform conversions and invoke the callback function when a buffer is
     * full.
     */
    while(1) {
        sleep(1000);
    }
}
Kevin Qiu1:

/**======== threadFxn0 ========*Open an ADC instance and get a sampling result from a one-shot conversion.*/
void *threadFxn0(void *arg0)
{ADC_Handleadc;ADC_Paramsparams;int_fast16_t res;ADC_Params_init(&params);adc = ADC_open(Board_ADC0, &params);if (adc == NULL) {Display_printf(display, 0, 0, "Error initializing ADC0\n");while (1);}/* Blocking mode conversion */res = ADC_convert(adc, &adcValue0);if (res == ADC_STATUS_SUCCESS) {adcValue0MicroVolt = ADC_convertRawToMicroVolts(adc, adcValue0);Display_printf(display, 0, 0, "ADC0 raw result: %d\n", adcValue0);Display_printf(display, 0, 0, "ADC0 convert result: %d uV\n",adcValue0MicroVolt);}else {Display_printf(display, 0, 0, "ADC0 convert failed\n");}ADC_close(adc);return (NULL);
}/**======== threadFxn1 ========*Open a ADC handle and get an array of sampling results after*calling several conversions.*/
void *threadFxn1(void *arg0)
{uint16_ti;ADC_Handleadc;ADC_Paramsparams;int_fast16_t res;ADC_Params_init(&params);adc = ADC_open(Board_ADC1, &params);if (adc == NULL) {Display_printf(display, 0, 0, "Error initializing ADC1\n");while (1);}for (i = 0; i < ADC_SAMPLE_COUNT; i++) {res = ADC_convert(adc, &adcValue1[i]);if (res == ADC_STATUS_SUCCESS) {adcValue1MicroVolt[i] = ADC_convertRawToMicroVolts(adc, adcValue1[i]);Display_printf(display, 0, 0, "ADC1 raw result (%d): %d\n", i,adcValue1[i]);Display_printf(display, 0, 0, "ADC1 convert result (%d): %d uV\n", i,adcValue1MicroVolt[i]);}else {Display_printf(display, 0, 0, "ADC1 convert failed (%d)\n", i);}}ADC_close(adc);return (NULL);
}

具体看adcsinglechannel 例程,是使用两路采集的,

赞(0)
未经允许不得转载:TI中文支持网 » CC1310的ADC的continuous采样方式
分享到: 更多 (0)