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.
工具与软件:
您好!
我们最近将嵌入式微控制器从 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);
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组中的最后一个通道。
处理器驱动程序更新后 、宏 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);
但它无法 正常工作、
[报价]您能否详细说明此配置实现的采样率?
[/quote][/quote][/quote]在16MHz 频率下仍然会发生这种情况。 ADC 反馈之一是(正确)大约返回1300反馈。 问题是缓冲区是"循环"所以
值从第一个 ADC 反馈传递到通过每个反馈的最后一个 ADC。
[报价]您的反馈是什么意思? 您是说您读取的 ADC 值不正确吗? 您希望读1300、但读1?
[/quote][/quote]我尝试频率为30 MHz、除以240除以8、这似乎可行。 [报价]您可以展示您为 ADCClockConfigSet 设置的有效参数吗?
[/quote]如何降低采样速度? 或者以这个速度运行 ADC 是不是有问题?
我将使用的代码为: ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、8);
使用以前的芯片时速度实际上是125ksps、我如何获得这个值?
[报价]使用 ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_第八、8)实现多大的采样率;?
您能否详细说明此配置所实现的采样率?
我们对旧的处理器 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){
[/quote]
this->buffer=&buffer;
}
现在我使用的是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时、您得到的实际采样率是多少。
[/quote]假设这个数组包含缓冲区的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 的原因。
您好!
抱歉、我不熟悉此类编程、我习惯使用 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_八分之一?
[/quote]user4441152 说:您能否查看 ADCOSTAT 和 ADCUSTAT 寄存器以查看是否存在 FIFO 上溢或下溢事件?如何检查这些寄存器?
[/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。