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.

[参考译文] 将之前的值与当前 ADC 值(参数 AdcResult.ADCRESULT0)(TMS320F28055)进行比较时出现问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1127819/problems-comparing-a-previous-value-with-the-current-adc-value-parameter-adcresult-adcresult0-tms320f28055

主题中讨论的其他器件:TMS320F28055

大家好、
我对使用 TMS320F28055控制器的 ADC 有疑问。 输出引脚上有一个 Poti。 我可以成功地使用 ADC 进行转换。 我的触发源是计时器、这意味着我的 ADC 值每毫秒更新一次。 转换后的 ADC 值位于 AdcResult.ADCRESULT0寄存器中。 我在状态机中转换了应用的数字值、该值的运行方式例如介于0-200之间、存储在变量"A"中、并发送到另一个控制器。 现在我们来讨论一下主要问题、我只想在 ADC 值发生变化时发送变量"A"中存储的值。 为此、我创建了一个具有先前值和当前值的结构。 我更新计时器中断中的当前值、并在状态机中不断对其进行比较、如果这些值​​不相同、则应再次发送"A"。 问题是、虽然调试模式显示两个值​​(上一个值和当前值)是相同的、但它会不断跳转到 SEND 函数。 要进行测试、我一直向上转动电位器或将其设置为0、但它不起作用。 有人能告诉我如何解决这个问题吗?

我怀疑这是由于 ADC 结果。ADC 结果0参数。(因为参数总是不断变化)

感谢你的帮助。

GLOBALS_statusMotorcontroller.frequenz_sollwert =要发送的值

freqsollwert.vorherigerSollwert =以前的值  

freqsollwert.aktuellerSollwert =这是在定时器中断中不断更新的当前值

sendesollwert = 这是一个布尔变量,用于确保仅在值发生更改时才发送该值。

        faktor_frequenz =  4095 / diff;
        GLOBALS_statusMotorcontroller.frequenz_sollwert = offset +  AdcResult.ADCRESULT0  / faktor_frequenz;



        if(freqsollwert.vorherigerSollwert != freqsollwert.aktuellerSollwert)
        {
            sendesollwert = false;
        }


        ////////////FREQUENZ-SOLLWERT auf Änderung senden/////////////

        if(sendesollwert == false)
        {
            //testcounter++;
            freqsollwert.vorherigerSollwert = freqsollwert.aktuellerSollwert;
            INTERFACE_MOTORCONTROLLER_addtokritischeQueue(Motorcontroller_Befehl_Write_BE_FREQUENZ_SOLLWERT, GLOBALS_statusMotorcontroller.frequenz_sollwert );
            STATEMACHINE_SPI_MOTORCONTROLLER_kommunikation();
            sendesollwert = true;
        }

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

    Markus、

    如果您比较要运行的 ADC 的完整12位值、我想您会看到、即使对于直流输入、您也会看到一般的系统噪声导致一些代码变化; 大约为4或5 LSB、理想标准分布约为0.6LSB。  因此、这将导致比较与不匹配、并在几乎每次 ADC 转换时设置标志。

    您可能需要做的是增加比较功能的容差以适应噪声(假设这是可接受的)或对信号进行过采样/平均以降低本底噪声、从而获得更好的重复率。

    请告诉我是否正确理解了该问题。

    最棒的

    Matthew

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

    您好 Matthew

    问题对了。 电压不稳定、因此 ADC 始终波动。 我只想发送一个不相等的值。 您是否有解决此问题的方法? 我已经尝试使用&&FFF0切断 ADC 值的最后几位、但没有成功。
    感谢你的帮助

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

    Markus、

    您能否告诉我您当前在设置中看到的数据范围;最小值/最大值/标准值?

    最棒的

    Matthew

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

    这话什么意思? ADC 范围从0到4095? 我​​要设置的值是可调的、例如在0-200或100-400之间。 这些应该是可变的。

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

    Markus、

    对于您的当前设置、代码的 ADC 结果可变性太大、无法保持稳定。对于 ADC 的给定输入、我希望看到您从 ADC 结果中看到的代码。  例如、对于给定(静态)输入、如果您获取~50个 ADC 样本、则 ADC 代码分布最小值/最大值/ stddev 是什么。  如果您只想将 ADC 结果发布到此线程、这也很好。

    最棒的

    Matthew

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

    您好 Matthew

    对于3665的 ADC 值、我得到了这些结果

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

    Markus、

    根据结果、该值在大多数时间处于"稳定"状态、即~3666 +/-1或2 LSB。  有时、我会说模拟输入电压确实在变化、例如在阵列位置15 = 3581或41 = 3634处

    我认为我们必须根据您的系统确定什么变化量只是样本/样本噪声、什么是实际扰动以及您需要在 ISR 中执行的操作。

    根据数据、也许您将阈值设置为距离3666左右超过10LSB 的任何值

    最棒的

    Matthew

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

    Matthew、


    如何设置10 LSB 的阈值?

    我不使用 ADC 中断。 我的触发源只是一个计时器。 ADC 值每毫秒更新一次。


    同时、我已经尝试过此功能。 因此、该值变得更加稳定。 但最大 ADC 值只能达到4032、这仍是值得怀疑的原因。 通常、该值应高达4095。

    long berechneterWert = 0;
    long alterWert = 0;
    
    
    
    long send_mean_value_from_ADC()
    {
    
            uint16_t neuerWert = AdcResult.ADCRESULT0;
    
            berechneterWert = ((alterWert * 63) + neuerWert) / 64;
    
            alterWert = berechneterWert;
    
            return alterWert;
    }

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

    Markus、

    对于我的技术、我可能已经误解了您的系统、我本来应该有一个您尝试保持在其中的目标电压、但根据上述代码、我认为您正在寻找从可变中心点的绝对移动。

    关于4095问题、ADC 在其未修整状态下具有一定的偏移误差;如果为负、则会导致您描述的行为、其中3.3V 输入不提供4095。  您应该会在我们的示例中看到一个名为 AdcOffsetSelfCal()的函数,请确保将其作为初始化例程的一部分调用(并使用 ADC 设置),因为这样会消除偏移误差。

    最棒的

    Matthew

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

    您好、Matthew、

    感谢您的回复、我也考虑了一个偏移量。 当我离开上次发布的函数时、我可以看到值从0移动到4095、这是它应该的。 但是当我激活函数时、平均值是按照我希望的方式形成的、这样该值就不会再有很大的波动。 问题是当我激活 AdcOffsetSelfCal()函数时,我的位总是被这个函数覆盖,这样计时器就不再被触发,其他位就不再是我想要的了。

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

    Markus、

    我了解您在使用 OffsetCal 描述的问题。  您可以根据需要将此功能添加到代码中、并将相同的触发器连接到 VREFLO 采样通道的不同 SOC。  实际上、如果您不使用 A5 (或 B5、一个是 VREFLO、另一个是温度传感器)、您可以让它永久连接到 VREFLO、并且只需经常对它进行采样、然后重新将偏移校正公式与您的其他样本内联。  您可以从偏移校准示例中为 ACQPS 等设置 C/P。

    最棒的

    Matthew