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.

[参考译文] LAUNCHXL-CC1352R1:当 DAC 输出正弦波时、发生电平回退

Guru**** 2431510 points


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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1290248/launchxl-cc1352r1-level-fallback-occurs-when-the-dac-outputs-a-sine-wave

器件型号:LAUNCHXL-CC1352R1

大家好、

以下是客户提出的问题、期待收到您的回复!

#include <stdint.h>
#include <stddef.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
/* 驱动头文件 */
#include <ti/drivers/DAC.h>
#include <ti/drivers/Timer.h>
#include <ti/drivers/GPIO.h>
#include <ti/drivers/UART.h>
/* 驱动配置 */
#include "ti_drivers_config.h"

#define COUNT (128)
#define HALFCOUNT (COUNT/2)

DAC_Handle dacHandle;
UART_Handle uart;
UART_Params uartParams;
uint32_t sintable[COUNT] = {0x80,0x86,0x8c,0x92,0x98,0x9e,0xa5,0xaa,
                            0xb0,0xb6,0xbc,0xc1,0xc6,0xcb,0xd0,0xd5,
                            0xda,0xde,0xe2,0xe6,0xea,0xed,0xf0,0xf3,
                            0xf5,0xf8,0xfa,0xfb,0xfd,0xfe,0xfe,0xff,
                            0xff,0xff,0xfe,0xfe,0xfd,0xfb,0xfa,0xf8,
                            0xf5,0xf3,0xf0,0xed,0xea,0xe6,0xe2,0xde,
                            0xda,0xd5,0xd0,0xcb,0xc6,0xc1,0xbc,0xb6,
                            0xb0,0xaa,0xa5,0x9e,0x98,0x92,0x8c,0x86,
                            0x80,0x79,0x73,0x6d,0x67,0x61,0x5a,0x55,
                            0x4f,0x49,0x43,0x3e,0x39,0x34,0x2f,0x2a,
                            0x25,0x21,0x1d,0x19,0x15,0x12,0x0f,0x0c,
                            0x0a,0x07,0x05,0x04,0x02,0x01,0x01,0x00,
                            0x00,0x00,0x01,0x01,0x02,0x04,0x05,0x07,
                            0x0a,0x0c,0x0f,0x12,0x15,0x19,0x1d,0x21,
                            0x25,0x2a,0x2f,0x34,0x39,0x3e,0x43,0x49,
                            0x4f,0x55,0x5a,0x61,0x67,0x6d,0x73,0x79};
uint16_t sin_count = 0;
uint16_t count = 0;
Timer_Handle timer0;
char str[30];

/**
\brief timerCallback
\note 无特殊说明
\see 无参考
\param 参数myHandle: 定时器句柄
\param 参数status: 定时器状态
\retval None
\warning 无警告
*/
void timerCallback(Timer_Handle myHandle, int_fast16_t status);

/**
\brief get_sintable
\note 无特殊说明
\see 无参考
\param 参数count: 生成样本的数量
\param 参数table: 存储生成样本的数组
\retval None
\warning 无警告
*/
void get_sintable(uint16_t count,uint32_t *table);

/**

\brief mainThread

\note 无特殊说明

\see 无参考

\param 参数arg0: 额外传递的参数

\retval None

\warning 无警告
*/
void *mainThread(void *arg0)
{

    Timer_Params params;
    DAC_Params dacParams;

    Timer_init();
    //GPIO_init();
    DAC_init();
    UART_init();

    //GPIO_setConfig(CONFIG_GPIO_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    //GPIO_write(CONFIG_GPIO_0, CONFIG_GPIO_LED_ON);



    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode = UART_RETURN_FULL;
    uartParams.baudRate = 115200;

    uart = UART_open(CONFIG_UART_0, &uartParams);

    get_sintable(COUNT,sintable);
    DAC_Params_init(&dacParams);
    dacHandle = DAC_open(CONFIG_DAC_0, &dacParams);
    DAC_enable(dacHandle);

    Timer_Params_init(&params);
    params.period = 10000;
    params.periodUnits = Timer_PERIOD_US;
    params.timerMode = Timer_CONTINUOUS_CALLBACK;
    params.timerCallback = timerCallback;

    timer0 = Timer_open(CONFIG_TIMER_0, &params);
    Timer_start(timer0);



    while(1)
    {

    }
}

void timerCallback(Timer_Handle myHandle, int_fast16_t status)
{
//    if(sin_count < COUNT - 1 && sin_count != HALFCOUNT)
//    {
//        DAC_setCode(dacHandle, sintable[sin_count++]);
////        sprintf(str,"%d\n",sintable[sin_count]);
//    }
//    else if(sin_count == HALFCOUNT)
//    {
//        sin_count += 15;
//        DAC_setCode(dacHandle, sintable[sin_count++]);
//    }
//    else
//    {
//        DAC_setCode(dacHandle, sintable[sin_count]);
////        sprintf(str,"%d\n",sintable[sin_count]);
//        sin_count = 15;
//    }
//    if(sin_count < COUNT - 1)
//    {
//        DAC_setCode(dacHandle, sintable[sin_count++]);
//    }
//    else
//    {
//        DAC_setCode(dacHandle, sintable[sin_count]);
//        sin_count = 0;
//    }
    DAC_setCode(dacHandle, sintable[sin_count]);
    sin_count++;
    if(sin_count >= COUNT)
    {
        sin_count = 0;
    }
    sprintf(str,"%d  %d\n", sin_count,sintable[sin_count]);
    UART_write(uart, str, strlen(str));
//    UART_write(uart, str, strlen(str));
}


void get_sintable(uint16_t count,uint32_t *table)
{
    uint16_t i = 0;
    for(i = 1;i <= count;i++)
    {
        double num = (1.0+sin(2.0*M_PI *(1.0*i/(count))))*128;
        table[i-1] = num ;
//        if(i == HALFCOUNT)
//        {
//            sprintf(str,"-----------\n");
//            UART_write(uart, str, strlen(str));
//        }
        sprintf(str,"%d\n", table[i]);
        UART_write(uart, str, strlen(str));
    }
}

原始代码如上所示。 在示波器上发现、正半个周期和负半个周期的交叉点上将出现失真。 如下图所示、对波形进行多次优化后、仍然会出现这种情况:

然后、通过串行端口打印数据、逐步排除问题并进行调试。 发现串行端口打印的数据是正常的、但微控制器的实际输出电压与设定的电压不匹配。

如下所示:

那么、如何解决这种情况呢?  遇到的当前问题是、DAC 输出在特定变化曲线下进行水平回归、导致波形失真。

谢谢。此致、

约兰德

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

    尊敬的 Yolande:

    此错误已在我们更新的 SDK 版本中修复。 我建议您升级 SDK、并亲自试用。

    此致、

    亚瑟

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

    Arthur、您好!

    您好、此问题是从哪个 SDK 版本解决的?

    谢谢。此致、

    约兰德

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

    尊敬的 Yolande:

    它已修复版本6.40、大约一年前。 同样、我建议您尽可能使用最新的 SDK。

    此致、

    亚瑟

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

    Arthur、您好!

    好的、非常感谢您的答复!  我还想知道,我们可以在现有的 5.20.0.52版本下做些什么来改善这种情况?

    谢谢。此致、

    约兰德

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

    Yolande 您好,有没有任何理由保持在5.20.0.52以下?

    您可以下载最新的 SDK、并解压以下文件:

    • DACCC26XX.board.c.xdt
    • DACCC26XX.syscfg.js
    • DAC26X2.c
    • DACCC26X2.h

    然后将其复制到旧的 SDK 中。

    如果要这样做、我建议您借助 Git 在 SDK 中跟踪所做的更改。

    运行以下命令:

    git init . && git add * && git commit -m "Original SDK"

    您可以放心地进行操作。

    此致、

    亚瑟