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:处理器更改后、ADC 反馈无法正常工作

Guru**** 1995585 points
Other Parts Discussed in Thread: TM4C129XNCZAD, TM4C1294NCPDT
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1436542/tm4c1294ncpdt-adc-feedback-not-working-properly-after-processor-change

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:TM4C129XNCZAD

工具与软件:

您好!  

我们最近将嵌入式微控制器从 tm4C129xnczad 更新为  TM4C1294NCPDT。  

ADC 设置方法(c++)是:  

(tm4c129xnczad )

SysCtlPeripheralEnable (SYSCTL_PERIPH_ADC0);
SysCtlADCSpeedSet (SYSCTL_ADCSPEED_125KSPS);  

ADCSequenceDisable (ADC0_BASE、0);

ADCHardwareOversampleConfigure (ADC0_BASE、64);

ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_processor、0);

ADCSequenceStepConfigure (ADC0_BASE、0、0、
ADC_CTL_CH0 | ADC_CTL_IE);
ADC =新的 TivaWareIntegratedADCDriver (ADC0_BASE、0、0);
((TivaWareIntegratedADCDDriver*) ADC)->setSharedBuffer (* adcSharedBuffer);

...

ADCIntEnable (ADC0_BASE、0);
ADCSequenceEnable (ADC0_BASE、0);

并且工作正常。  

处理器驱动程序更新后 、宏 SysCtlADCSpeedSet 不再可用、所以替换它的代码看起来像这样:

(TM4C1294NCPDT)

ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、64);  

问题是 ADC 反馈不准确。 在 IDLE 状态下、所有 ADC 反馈每秒从1变为1353。

ADC 设置中用于新处理器的代码是否正确?  还有其他方法可以做到这一点吗?

这就是用于新型微控制器的完整方法:

SysCtlPeripheralEnable (SYSCTL_PERIPH_ADC0);
ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、64);

ADCSequenceDisable (ADC0_BASE、0);

ADCHardwareOversampleConfigure (ADC0_BASE、64);

ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_processor、0);

ADCSequenceStepConfigure (ADC0_BASE、0、0、
ADC_CTL_CH0 | ADC_CTL_IE);
ADC= NEW TivaWareIntegraatedADCDriver (ADC0_BASE、0、0);
((TivaWareIntegratedADCDDriver*) ADC)->setSharedBuffer (* adcSharedBuffer);

...

ADCIntEnable (ADC0_BASE、0);
ADCSequenceEnable (ADC0_BASE、0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="609258" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1436542/tm4c1294ncpdt-adc-feedback-not-working-properly-after-processor-change "]

    ADCSequenceStepConfigure (ADC0_BASE、0、0、
    ADC_CTL_CH0 | ADC_CTL_IE);
    ADC =新的 TivaWareIntegratedADCDriver (ADC0_BASE、0、0);
    ((TivaWareIntegratedADCDDriver*) ADC)->setSharedBuffer (* adcSharedBuffer);

    ...

    [报价]

    您好!

     在您的  tm4c129xnczad 代码中、我实际上感到惊讶的是、它可以在没有 ADC_CTL_END 的情况下工作。 本可以预料的。  

    ADCSequenceStepConfigure (ADC0_BASE、0、0、
    ADC_CTL_CH0 | ADC_CTL_IE |  ADC_CTL_END );// ADC_CTL_END 表示 ADC_CTL_CH0是序列比较0组中的最后一个通道。  

    [报价 userid="609258" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1436542/tm4c1294ncpdt-adc-feedback-not-working-properly-after-processor-change "]

    处理器驱动程序更新后 、宏 SysCtlADCSpeedSet 不再可用、所以替换它的代码看起来像这样:

    [报价]

    您必须使用极旧的 TivaWare 或携带 LM3S 中的代码。 在 更高版本的 TivaWare 外设驱动程序库中没有 SysCtlADCSpeedSet API、被 ADCClockConfigSet 取代 。      有关此 API、请参阅最新的外设驱动程序库用户指南。  

    SysCtlPeripheralEnable (SysCtl_Periph_ADC0);
    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_八分之一、64);[/QUOT]

    要实现1Msps、需要以16MHz 的频率运行 ADC 时钟。 因此、要实现1Msps、您需要将 PLL VCO (240Mhz)除以15、以使 ADC 时钟为16MHz。 要获得125Ksps、您将使用  ADC_CLOCK_RATE_八分之一。 请尝试以下内容。  

    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、15);

    还要确保添加  ADC_CTL_END  如上所述。  

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

    您好!

    我尝试了以下内容:  

    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、15);

    但它无法 正常工作、  

    问题是 ADC 反馈不准确。 在 IDLE 状态下、所有 ADC 反馈每秒从1变为1353。

    在16MHz 频率下仍然会发生这种情况。 ADC 反馈之一是(正确)大约返回1300反馈。 问题是缓冲区是"循环"所以  

    值从第一个 ADC 反馈传递到通过每个反馈的最后一个 ADC。  

    我尝试以30 MHz 除以240除以8、这似乎有效。  

    然而、有人告诉我、这种速度太快是浪费了、因为所需的操作量较小、而且还可以提高  

    和输出温度。  

    如何降低采样速度? 或者以这个速度运行 ADC 是不是有问题?

    我将使用的代码为: ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、8);

    使用以前的芯片时速度实际上是125ksps、我如何获得这个值?

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

    我尝试了以下内容:  

    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、15);

    但它无法 正常工作、  

    [报价]

    您能否详细说明此配置实现的采样率?

    在16MHz 频率下仍然会发生这种情况。 ADC 反馈之一是(正确)大约返回1300反馈。 问题是缓冲区是"循环"所以  

    值从第一个 ADC 反馈传递到通过每个反馈的最后一个 ADC。  

    [报价]

    您的反馈是什么意思? 您是说您读取的 ADC 值不正确吗? 您希望读1300、但读1?

    我尝试频率为30 MHz、除以240除以8、这似乎可行。  [报价]

    您可以展示您为  ADCClockConfigSet 设置的有效参数吗?

    如何降低采样速度? 或者以这个速度运行 ADC 是不是有问题?

    我将使用的代码为: ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、8);

    使用以前的芯片时速度实际上是125ksps、我如何获得这个值?

    [报价]

    使用 ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、8)实现多大的采样率;

    [/quote]
    [/quote][/quote]
    [/quote][/quote][/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否详细说明此配置所实现的采样率?

    我们对旧的处理器 ADC 使用了125ksps。 我被告知1MSPS 比需要的要高得多、并且可能会使电路板的温度升高。 现在、我使用的是240/8=30Mhz、因此它甚至更大、但我无法找到每秒采样率更小的方法。  

    反馈是什么意思? 您是说您读取的 ADC 值不正确吗?[/QUOT]

    我遇到的问题是:我有6个 ADC 通道可以使用。 其中一个是返回1300、这是正确的、其他应该保持为0。 但是、当采样率高于或低于30Mhz 时、发生以下情况:  

    我有一个软件可以帮助我查看 ADC 通道的电流反馈情况。 每个反馈值都位于一个面板中、因此我可以看到每个值转发器。 1300反馈应该只保留在其中一个、但我可以看到它从第一个变为最后一个、就像它正在循环一样。 所以我们假设这个数组包含了缓冲器的6个值:0 0 0 1300 0 0、每50 ms (大约)我看到这种情况发生:0 0 0 1300 0、然后0 0 0 0 1300 0等等。 这是我对自行车的意思。  

    您能展示一下为  ADCClockConfigSet 设置的有效参数吗?

    我使用的是当前的时钟配置:

    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、8);

    使用 ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、8)可实现何种采样率;

    由于最后一个方法参数是除数、我想我获得的采样率是240Mhz / 8 = 30Mhz、我是对吗?  

    问题是否与软件中的 ADC 缓冲器有关? 这是我当前使用的驱动程序:

    #include "adcdriver/TivaWareIntegratedADCDriver.h"

    TivaWareIntegratedADCDriver:TivaWareIntegratedADCDriver (uint32_t base、
    uint32_t sequenceNum、uint32_t step)
    :AbstractADCDriver()、
    基座(基座)、
    sequenceNum (sequenceNum)、
    值(0)、
    步骤(STEP)

    缓冲区=新 uint32_t[8];
    }

    TivaWareIntegratedADCDriver::~TivaWareIntegratedADCDriver ()

    // todo 自动生成的析构函数存根
    }

    Double TivaWareIntegratedADCDriver::Read (){
    // ADCProcessorTrigger (base、sequenceNum);
    // while (! ADCIntStatus (ADC0_BASE、sequenceNum、false){}
    // uint32_t size = ADCSequenceDataGet (base、sequenceNum、buffer);
    value = static_cast (缓存[步进]);
    返回值;
    }

    空 TivaWareIntegratedADCDriver::updateADC (){
    ADCProcessorTrigger (base、sequenceNum);
    while (! ADCIntStatus (ADC0_BASE、sequenceNum、false){}
    uint32_t size = ADCSequenceDataGet (base、sequenceNum、缓冲器);
    }

    void TivaWareIntegratedADCDriver::setSharedBuffer (uint32_t& buffer){
    this->buffer=&buffer;
    }

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在我使用的是240/8=30Mhz、所以它甚至更多、但我找不到一种方法来使用每秒更少的样本量。  [报价]

    您好!

     您是否已尝试过 我之前建议的 ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_八分之一、15)。 240/15=16MHz。 16MHz 时的最大值为1Msps。 如果您额外应用 ADC_CLOCK_RATE_第八 个、它将为您提供1Msps / 8 = 125Ksps。 这是我试图问您的问题、当您将其除以15时、您得到的实际采样率是多少。  

    假设这个数组包含缓冲区的6个值:0 0 0 1300 0 0、每50毫秒(约为50毫秒)我看到发生了这种情况:0 0 1300 0、然后0 0 0 1300 0等等。 这是我对自行车的意思。  [报价]

    您是否在 ADC ISR 中读取数组? 在代码中、使用 ADC_CTL_IE。 借助于该标志、当采样序列发生器中的最后一个通道完成其转换时、它将生成 ADC 中断。  

    这里、您说您是每50ms 读取一次缓冲区。 您是否正在使用计时器来生成此50ms 周期? 您是否以50ms 的速率读取计时器 ISR 内的缓冲区?  

    看起来、当您使用 ADCSequenceDataGet 读取 ADC FIFO 时、可能会有另一个通道转换完成、其值被压入 FIFO。   

    您能否检查 ADCOSTAT 和 ADCUSTAT 寄存器以查看是否存在 FIFO 上溢或下溢事件?

    [报价 userid="609258" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1436542/tm4c1294ncpdt-adc-feedback-not-working-properly-after-processor-change/5520476 #5520476"]

    由于最后一个方法参数是除数、我想我获得的采样率是240Mhz / 8 = 30Mhz、我是对吗?  

    问题是否与软件中的 ADC 缓冲器有关? 这是我当前使用的驱动程序:

    [报价]

    240 / 8 = 30Mhz、此时最大为2Msps。 这就是我要求除以15以获得16MHz 的原因。   

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

    您好!  

    抱歉、我不熟悉此类编程、我习惯使用 C#等高级代码。  

    user4441152 说:
    您是否正在使用计时器生成此50ms 周期? 您是否以50ms 的速率读取计时器 ISR 内的缓冲区?  [报价]

    我不使用任何计时器、我只是说它刷新非常快

    您是否 按照我之前的建议试用了 ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_Eighter、15)。 240/15=16MHz。 16MHz 时的最大值为1Msps。 如果您额外应用 ADC_CLOCK_RATE_第八 个、它将为您提供1Msps / 8 = 125Ksps。[/QUOT]

    如何 第二次应用 ADC_CLOCK_RATE_八分之一?

    user4441152 说:
    您能否查看 ADCOSTAT 和 ADCUSTAT 寄存器以查看是否存在 FIFO 上溢或下溢事件?
    [/quote]

    如何检查这些寄存器?

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

    我尝试了以下命令:

    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_RATE_FULL、120);  

    全速率是240MHz 还是480? 不管怎样、我将除以120、使其应该约为2或4 MHz、这是否意味着我将获得125Ksps 或250Ksps、我是对吗?

    我猜、如果16MHz 对应1Msps/8 = 125Ksps、那么16MHz/8 = 2MHz、对吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不使用任何计时器、我只是说刷新速度非常快

    您能解释一下如何读取 ADC 吗? 您是否正在使用中断并根据 ADC 中断读取 ADC 值? 或者您在 50ms 时异步读取 ADC FIFO?

    [报价 userid="609258" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1436542/tm4c1294ncpdt-adc-feedback-not-working-properly-after-processor-change/5522727 #552272727"]

    如何 第二次应用 ADC_CLOCK_RATE_八分之一?

    [报价]

    我不是第二次来了。 您仍然没有告诉我、您使用  ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_Rate_八分之一、15)时观察到的采样率是多少。  

    如何查看这些寄存器?

    您可以在寄存器窗口中查看它们。  

    [报价 userid="609258" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1436542/tm4c1294ncpdt-adc-feedback-not-working-properly-after-processor-change/5522898 #5522898"]

    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_RATE_FULL、120);  

    全速率是240MHz 还是480? 不管怎样、我将除以120、使其应该约为2或4 MHz、这是否意味着我将获得125Ksps 或250Ksps、我是对吗?

    我猜、如果16MHz 对应1Msps/8 = 125Ksps、那么16MHz/8 = 2MHz、对吗?

    [报价]

    由于存在勘误表、PLL 的 VCO 输出将为240Mhz。  

    不能除以64。 您可以尝试除以60、这样就会得到一个4Mhz 的 ADC 时钟。 在4Mhz 下、您理论上应该可以得到256ksps。 您可以应用 ADC_CLOCK_RATE_HALF、这应该会得到125ksps。