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.

[参考译文] TM4C1294NCPDT:多个具有 PWM 的 ADC 工作不正常

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/970944/tm4c1294ncpdt-multiple-adcs-with-pwm-not-working-properly

器件型号:TM4C1294NCPDT

尊敬的支持人员:

我尝试使用电位器读取4个 ADC 信号、并生成 PWM 来测试它。

我遵循了以下代码: e2e.ti.com/.../374763

尽管我物理连接不同的端口、但 ui32adcValues[0]中的值始终会发生更改。 可能我没有正确获取或理解代码。

//
//库
//*********

#include 
#include 

#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/pin.h"
#include
"driverlib/mware.h"
#include "drivers.h"#include "driverlib/simme.h"


#include "drivers.h"#include "drivers.包含"drivers.hw_intruart"#include "#包含"#drivers.h"#drivers.h"#drivers.hw_inuart.h"#include "#include "#include "inuart.h"#include "#include "#"inuart.h"


//为计时
器#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_adc.h"
#include "inc/hw_timer.h"
#include "inc/hw_NVIC.h"
#include "inc/hw_sysctl.h"

#include "utils/uartdio.h

*
//变量声明
//*********

// ADC
uint32_t ui32adcValues[4]、ui32Count、ui32adc0Values[1]、ui32adc1Values[1]、ui32adc2Values[1]、ui32adc3Values[1];

// PWM
long analogs=0、ui32adc2Values[1]、ui32adc3Valuatui000=ui000=ui000=uw32、uatuatuuuuuuuu000=uuuuuuuuuuuuuu000=u000u000uu000uuu000u000u000uuuu000uuu000u

// 120MHz/5kHz

//系统
uint32_t g_ui32SysClock; //系统时钟速率,单位为 Hz。

//
//
//如果驱动程序库遇到错误,则调用的错误例程。
////
*****************
#ifdef debug
void
__error__(char *dpcFilename、uint32_t ui32Line)
{

#endif

//*********
// ADC 初始化
//*************

void
ConfigureADC (void)
{


SysCtlPeripheralReset (SYSCTL_Periph_GPIOE);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
SysCtlPeripheralReset (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlDelay (10);

GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);

ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_Eighth、30);

//选择序列发生器2并将其设置为最高优先级。
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_ALE一直、0);
ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_ALE一直、1);
ADCSequenceConfigure (ADC0_BASE、2、ADC_TRIGGER_ALE一直、2);
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_ALE一直、3);

//选择序列发生器2中的 Step 0作为数据缓冲区,将其设置为 Last Step 并启用中断


ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH1);
ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH2);
ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH3 | ADC_CTL_IE | ADC_CTL_END);


ADCSequenceEnable (ADC0_BASE、0);
ADCSequenceEnable (ADC0_BASE、1);
ADCSequenceEnable (ADC0_BASE、2);
ADCSequenceEnable (ADC0_BASE、3);

}

//*********
// PWM 初始化- 13.09.2020
//*********
void Init_PWM (){

// 1.
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF); //启用端口 F
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOF));

// 2.
SysCtlPWMClockSet (SYSCTL_PWMDIV_16);
SysCtlPeripheralDisable (SYSCTL_Periph_PWM0);
SysCtlPeripheralReset (SYSCTL_Periph_PWM0);
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
while (!(SysCtlPeripheralReady (SYSCTL_Periph_PWM0)));


// PWM0_BASE:0 -> 0来自 M_0_PWM1
// PWM_OUT_1和 PWM_OUT_1_BIT:1来自 M0PWM_1
// PWM_GEN_0:针对 PWM0和 PWM1的 GEN_0、针对 PWM2和 PWM3的 GEN_1……


SysCtlPWMClockSet (SYSCTL_PWMDIV_1); // 120MHz/1 = 120MHz

GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1); //端口 F - PF1的引脚1
GPIOPinConfigure (GPIO_PF1_M0PWM1);
PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、pwmMax); // 120MHz/pwmMax = pwmPeriod
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、1);
PWMGenEnable (PWM0_BASE、PWM_GEN_0);
PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT、TRUE);

PWMIntEnable (PWM0_BASE、PWM_INT_GEN_0);
IntMasterEnable();
PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_TR_CNT_ZERO);
IntEnable (INT_PWM0_0);

}

//*********
//等待并读取 ADC 函数
//*********
uint32_t
WaitAndReadADC (uint32_t * adcValues)
{

ADCProcessorTrigger (ADC0_BASE、0);
//等待采样序列完成。

while (!ADCIntStatus (ADC0_BASE、0、false)){}
//从 ADC 读取值。

return (ADCSequenceDataGet (ADC0_BASE、0、adcValues));
}


uint32_t
WaitAndReadADC1 (uint32_t * adcValues)
{

ADCProcessorTrigger (ADC0_BASE、1);
//等待采样序列完成。

while (!ADCIntStatus (ADC0_BASE、1、false)){}
//从 ADC 读取值。

return (ADCSequenceDataGet (ADC0_BASE、1、adcValues));
}

uint32_t
WaitAndReadADC2 (uint32_t * adcValues)
{

ADCProcessorTrigger (ADC0_BASE、2);
//等待采样序列完成。

while (!ADCIntStatus (ADC0_BASE、2、false){}
//从 ADC 读取值。

return (ADCSequenceDataGet (ADC0_BASE、2、adcValues);
}

uint32_t
WaitAndReadADC3 (uint32_t * adcValues)
{

ADCProcessorTrigger (ADC0_BASE、3);
//等待采样序列完成。

while (!ADCIntStatus (ADC0_BASE、3、false)){}
//从 ADC 读取值。

return (ADCSequenceDataGet (ADC0_BASE、3、adcValues));
}


int
main (void)
{

//
//从 PLL 以120MHz 运行。
//
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);

//
//配置器件引脚。
//
PinoutSet (false、false);

//
//为 LED D1 (PN1)启用 GPIO 引脚。
//
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);

//
//初始化 UART。
//
ConfigureADC();
init_pwm ();

adcToPwmRatio = pwmMax/4095; // 2^12位

//无限循环
while (1)
{

//ui32Count = WaitAndReadADC1 (ui32adcValues);
//ui32Count = WaitAndReadADC2 (ui32adcValues);
//ui32Count = WaitAndReadADC3 (ui32adcValues);
ui32Count = WaitAndReadADC (ui32adcValues);

//求和过滤器
if (sumCounter < iSamples){

analogValue = ui32adcValues[0]+ analogValue;

sumCounter++;

} 否则{

analogAvg = analogValue /iSamples;

// PWM
pwmValue = analogAvg*adcToPwmRatio;

// PWM 最小限制
if (pwmValue < 30){
pwmValue = 1; // pwmValue 永远不能为零
}

// PWM 最大限制
if (pwmValue >(pwmMax - 30)){
pwmValue = pwmMax;
}

//更改 PWM 值
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、pwmValue);

//重置总和过滤器变量
analogValue = 0;
总和计数器= 0;

}

}

请提供一些帮助吗?

此致、

Gustavo Wegher

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

    您好 Gustavo、

    我不确定为什么以这种方式设置了 Amit 发布的代码、但您也需要取消注释这些函数、以便从所有四个通道中获得结果:

    //ui32Count = WaitAndReadADC1 (ui32adcValues);
    //ui32Count = WaitAndReadADC2 (ui32adcValues);
    //ui32Count = WaitAndReadADC3 (ui32adcValues); 

    取消注释后、每个通道应提供独立的读数。

    我还认为您应该修改函数以使用如下所示的各个向量:

    ui32Count = WaitAndReadADC1 (ui32adc1Values);
    ui32Count = WaitAndReadADC2 (ui32adc2Values);
    ui32Count = WaitAndReadADC3 (ui32adc3Values); 

    还可以 将 ui32adc0Values 用于 WaitAndReadADC 函数(可能名为 WaitAndReadADC0)。

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

    [引用用户="Ralph Jacobi"]

    您好 Gustavo、

    我不确定为什么以这种方式设置了 Amit 发布的代码、但您也需要取消注释这些函数、以便从所有四个通道中获得结果:

    //ui32Count = WaitAndReadADC1 (ui32adcValues);
    //ui32Count = WaitAndReadADC2 (ui32adcValues);
    //ui32Count = WaitAndReadADC3 (ui32adcValues); 

    取消注释后、每个通道应提供独立的读数。

    我还认为您应该修改函数以使用如下所示的各个向量:

    ui32Count = WaitAndReadADC1 (ui32adc1Values);
    ui32Count = WaitAndReadADC2 (ui32adc2Values);
    ui32Count = WaitAndReadADC3 (ui32adc3Values); 

    还可以 将 ui32adc0Values 用于 WaitAndReadADC 函数(可能名为 WaitAndReadADC0)。

    [/报价]

    您好、Ralph、

    感谢您的快速回答。

    我试图取消注释这些行、但它根本不起作用。

    我已经更新了函数以使用您说过的各个向量、并再次对其进行了测试、因此现在它是:

    //
    //等待并读取 ADC 函数
    //*********
    uint32_t
    WaitAndReadADC0 (uint32_t * adcValues)
    {
    
    ADCProcessorTrigger (ADC0_BASE、0);
    //等待采样序列完成。
    
    while (!ADCIntStatus (ADC0_BASE、0、false)){}
    //从 ADC 读取值。
    
    return (ADCSequenceDataGet (ADC0_BASE、0、adcValues));
    }
    
    [...]
    
    //无限循环
    while (1)
    {
    
    ui32Count = WaitAndReadADC0 (ui32adc0Values);
    //ui32Count1 = WaitAndReadADC1 (ui32adc1Values);
    //ui32Count = WaitAndReadADC2 (ui32adc2Values);
    //ui32Count = WaitAndReadADC3 (ui32adc3Values); 

    当我取消注释包含"WaitAndReadADC1"的行时(请注意、我还更新了将函数调用到 ui32Count1的变量、以确保这不是问题)、程序运行从 ADC0的第一次读取(我可以看到、因为"sumCounter"仍然为零) 它在 WaitAndReadADC1函数的 while 循环中停止:

    uint32_t
    WaitAndReadADC1 (uint32_t * adcValues)
    {
    
    ADCProcessorTrigger (ADC0_BASE、1);
    //等待采样序列完成。
    
    while (!ADCIntStatus (ADC0_BASE、1、false)){}
    //从 ADC 读取值。
    
    return (ADCSequenceDataGet (ADC0_BASE、1、adcValues));
    } 

    然后、我添加了 while 环路并将其重建。 ADC1仍不读取。

    我注意到的另一个问题是、我可以断开物理电缆与 PE0的连接并连接 PE1、更新后的变量仍然是"ui32adc0Values"。

    非常感谢您的关注。

    此致、

    Gustavo Wegher

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

    您好 Gustavo、

    在对代码进行全面审查后、我发现与 Amit 所分享的内容存在一些令人惊讶的不一致之处。 我认为在这种特定情况下、它可能可以正常工作、但我可以看到您自己为何遇到设置问题。 我继续将代码修改为我认为您自己的用例所需的代码。 尝试一下、看看您现在是否获得了预期结果。 我使用 LaunchPad 进行了测试、并在所有4个 ADC 通道上获得了准确的读数。

    注意您需要做的两件重要事情!

    1) 1)将 uartstdio.c 添加到您的项目中、请参阅以下有关如何执行此操作的指南: https://e2e.ti.com/support/microcontrollers/other/f/908/p/753675/2787705#2787705

    2) 2)使用以下行将 ADC ISR 添加到 CCS 文件中、并用  此 ISR 替换 ADC 序列0的 IntDefaultHandler。

    extern void ADC0Sequence0ISR (void); 

    完成这些操作后、您的项目应该会编译。 我进行了许多更改、但我认为我不会影响您的 PWM 设置。

    //
    //库
    //*********
    
    #include 
    #include 
    
    #include "driverlib/adc.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/pinmwm.h"
    #include "driverlib/rom.h"
    #include "driverlib/mnts.h"
    #include "drivers/intru.triggio.h"#include "drivers/包含"drivers.hw_intrinc/包含"drivers.h"#include "drivers.h"#drivers/intrinc/intrintrinc/包含"drivers"drivers.h"#include "drivers.h"#include "drivers.inc"
    
    
    
    
    
    
    //为计时
    器#include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_adc.h"
    #include "inc/hw_timer.h"
    #include "inc/hw_NVIC.h"
    #include "inc/hw_sysctl.h"
    
    #include "utils/uartdio.h
    
    *
    //变量声明
    //*********
    
    // ADC
    uint32_t ui32adcValues[4];
    volatile bool bDataReady = false;
    
    // PWM
    long analogValue = 0、analogAvg = 0、adcToPwmRatio = 0;
    uint32_t sumCounter = 0、iSamples = 10000、pwmMax = 0;
    uint32_t pwmValue = 24000 // 120MHz/5kHz
    
    //系统
    uint32_t g_ui32SysClock; //系统时钟速率,单位为 Hz。
    
    //
    //
    //如果驱动程序库遇到错误,则调用的错误例程。
    ////
    *****************
    #ifdef debug
    void
    __error__(char *pcFilename、uint32_t ui32Line)
    {
    
    #endif
    
    void
    ADC0Sequence0ISR (void)
    {
    ADCIntClear (ADC0_BASE、0);
    
    ADCSequDataGet (ADC0_BASE、0、ui32adcValues);
    
    if (!bDataReady)
    {
    bDataReady = true;
    }
    //
    
    *************
    // ADC 初始化
    //*************
    
    空
    配置 ADC (空)
    {
    SysCtlPeripheralReset (SYSCTL_Periph_GPIOE);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    SysCtlPeripheralReset (SYSCTL_Periph_ADC0);
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);SysCtlPeripheralEnable (
    SysCtlDelay);
    
    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);
    
    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_RATE_Eighth、30);
    
    //
    //等待时钟配置设置。
    //
    SysCtlDelay (10);
    
    //选择序列发生器2并将其设置为最高优先级。
    //ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_processor、0);
    ADCSequenceConfigure (ADC0_BASE、 0、ADC_TRIGGER_AUSE0);
    
    ADCSequenceStepConfigure (ADC0_BASE、0、ADC_CTL_CH0);
    ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH1);
    ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH2);
    ADCSequenceStepConfigure (ADC0_BASE、0、3、 ADC_CTL_CH3 | ADC_CTL_IE | ADC_CTL_END);
    
    ADCSequenceEnable (ADC0_BASE、0);
    ADCIntClear (ADC0_BASE、0);
    ADCIntEnable (ADC0_BASE、0);
    IntEnable (INT_ADC0SS0);
    }
    
    //*********
    // PWM 初始化- 13.09.2020
    //*********
    void Init_PWM (){
    
    // 1.
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF); //启用端口 F
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOF));
    
    // 2.
    SysCtlPWMClockSet (SYSCTL_PWMDIV_16);
    SysCtlPeripheralDisable (SYSCTL_Periph_PWM0);
    SysCtlPeripheralReset (SYSCTL_Periph_PWM0);
    SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
    while (!(SysCtlPeripheralReady (SYSCTL_Periph_PWM0)));
    
    
    // PWM0_BASE:0 -> 0来自 M_0_PWM1
    // PWM_OUT_1和 PWM_OUT_1_BIT:1来自 M0PWM_1
    // PWM_GEN_0:针对 PWM0和 PWM1的 GEN_0、针对 PWM2和 PWM3的 GEN_1……
    
    
    SysCtlPWMClockSet (SYSCTL_PWMDIV_1); // 120MHz/1 = 120MHz
    
    GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1); //端口 F - PF1的引脚1
    GPIOPinConfigure (GPIO_PF1_M0PWM1);
    PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
    PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、pwmMax); // 120MHz/pwmMax = pwmPeriod
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、1);
    PWMGenEnable (PWM0_BASE、PWM_GEN_0);
    PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT、TRUE);
    
    PWMIntEnable (PWM0_BASE、PWM_INT_GEN_0);
    PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_TR_CNT_ZERO);
    IntEnable (INT_PWM0_0);
    
    }
    
    //*********
    //
    //此函数将 UART0设置为用于控制台,以便
    在示例运行时显示信息//。
    ////
    *****************
    void
    InitConsole (void)
    {
    //
    //启用用于 UART0引脚的 GPIO 端口 A。
    // TODO:将其更改为您正在使用的 GPIO 端口。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    
    //
    //为端口 A0和 A1上的 UART0功能配置引脚复用。
    //如果您的器件不支持引脚复用、则无需执行此步骤。
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    GPIOPinConfigure (GPIO_PA0_U0RX);
    GPIOPinConfigure (GPIO_PA1_U0TX);
    
    //
    //启用 UART0以便我们可以配置时钟。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
    
    //
    //使用内部16MHz 振荡器作为 UART 时钟源。
    //
    UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
    
    //
    //为这些引脚选择替代(UART)功能。
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
    
    //
    //初始化控制台 I/O 的 UART
    //
    UARTStdioConfig (0、115200、16000000);
    }
    
    int
    main (void)
    {
    
    //
    ////从 PLL 以120MHz 运行。
    //
    g_ui32SysClock = map_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
    
    //
    配置器件引脚。
    //
    PinoutSet (false,false);
    
    //
    //设置串行控制台以用于显示消息。 这只是
    针对这个示例程序的//、而 ADC 运行不需要。
    //
    InitConsole();
    
    //
    为 LED D1 (PN1)启用 GPIO 引脚。
    //
    ROM_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);
    
    //
    初始化 UART。
    //
    ConfigureADC ();
    Init_PWM ();
    
    IntMasterEnable ();
    
    adcToPwmRatio = pwmMax/4095; // 2^12位
    
    // Infinite loop
    while (1)
    {
    if (bDataReady)
    {
    UARTprintf ("AIN0 =%4D\r\n、ui32adcValues[0]);
    UARTprintf ("AIN1 =%4D\r"、ui32adcValues[1]);
    UART2 =%4D\r ui32adcValues[2]);
    UARTprintf ("AIN3 =%4D\r\n、ui32adcValues[3]);
    
    bDataReady = false;
    }
    
    //求和滤波
    器 if (analogCounter < iSamples){sumatio
    
    Value = ui32adcValues[0]+ analogAvg;
    
    
    
    
    
    
    
    
    
    
    
    }{thanalogCounter = mwpwpw/ mValue = uanalog1;}/analoguanalogu&analogu&r = mwpwthere+ analogu&r = mu&r = mpwpwpw/ mu&r = u&r;
    } // pwmValue 永远不能为零
    }
    
    // PWM 最大限制
    if (pwmValue >(pwmMax - 30){
    pwmValue = pwmMax;
    }
    
    //更改 PWM 值
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、pwmSum
    
    Filter 变量);//重置 PWM 变量
    
    = 0;计数器= 0;}= 0
    
    
    
    

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

    您好、Ralph、

    好的、这是一项了不起的工作。 ADC 工作正常、值的变化比以前小、您甚至可以让 UART 工作(我在这个周末遇到了一些问题)。 我还没有测试过 PWM、可能会在本周结束时测试它。

    如果问题不大、请解释一下为什么使用中断来使其正常工作?

    我还注意到 pwmValue 的一些截断或舍入错误、这可能是由 int 和 long 变量引起的。 您是否会对如何使用 TM4C1294执行这些数学运算给出一些建议、或者可能还有一些您之前已解决的主题? (虽然这可能对另一个线程很重要)。

    非常感谢迄今为止提供的帮助!

    此致、

    Gustavo Wegher

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

    您好 Gustavo、

    [引用 USER="Gustavo Wegher1"]如果问题不是太大,请解释为什么您使用中断来使其正常工作?[/引用]

    它还可用于轮询、也可用于使用 ADC_TRIGGER_PROCESSORTE、但通常、ADC 操作使用 LEFT 中断例程、因此我使用该路由来提供示例。 它现在的设置方式是、它将反复运行、但您实际上需要了解如何为系统触发它(例如使用计时器或其他方法)。

    顺便说一下、对于 PWM、我们在 TivaWare 中提供了三个示例、这些示例应为您提供 PWM 配置所需的一切。

    [引用 user="Gustavo Wegher1">pwmValue、我还注意到我遇到了一些截断或舍入错误、这可能是由 int 和 long 变量造成的。 您是否会对如何使用 TM4C1294执行这些数学运算给出一些建议、或者可能还有一些您之前已解决的主题? (虽然这可能对另一个线程很重要)。

    如果您担心这一点、可以使用浮点数。 我不知道我是否有任何特别的一般性建议。 但如果没有浮点数、通常会出现小错误、例如任何十进制数都会在零位被截断。 不过、浮点值的诀窍是将数字返回到需要键入 uint32的 API 中。 您可以考虑使用舍入函数在类型转换返回到 uint32之前帮助舍入。

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

    您好、Ralph、

    再次感谢您的建议、我已更新代码以使用浮点运算符、没有问题。

    正如您说过的、我想通过计时器触发 ADC。 想法是对2KHz 的正弦波进行采样、因此我想 ADC 必须在200KHz 到1MHz 的范围内运行、或者类似的频率。  我采集了一些样本、似乎 ADC 有太多误差、或者样本之间没有定义的时间。

    我看了一下、看到了与此相关的 API 函数、但我仍然不确定如何执行。 我查看的代码:

    我知道必须更改配置:

    ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0); 

    但我对后续步骤有点困惑。 TimerInterrupt 应该调用 ADC 函数、CCS 文件不应该再包含 ADC 中断、而只包含计时器中断?

    如果可以、请提供有关此问题的一些信息。 提前感谢您。

    此致、

    Gustavo Wegher

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

    您好 Gustavo、

    您还可以查看已完成的 TivaWare 示例 ADC_UDMA_pingpong、以获得有关 ADC -计时器设置的进一步帮助。

    无需计时器 ISR。 配置计时器后、ADC ISR 将在每次超时后进入。 您仍然会为您配置的序列使用 ADC 中断。 例如、对于 ADC_UDMA_pingpong、使用序列0、以便将 ADC 中断 ADCSeq0Handler 分配给 ADC 序列0、并且没有与计时器外设相关联的 ISR。

    [引用 user="Gustavo Wegher1"]原理是对2KHz 的正弦波进行采样,因此我想 ADC 必须在200KHz 到1MHz 的范围内运行,或者类似的频率。

    这似乎太过分了... 您不需要以超过2倍的频率运行它。 提高运行速度只能使您获得更精细的数据、但您可以根据4kHz 时的结果重构正弦波。