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.

[参考译文] MSP430F6769A:关于提高 A/D 转换的精度

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1301907/msp430f6769a-regarding-improving-accuracy-of-a-d-conversion

器件型号:MSP430F6769A
主题中讨论的其他器件:MSP-TS430PEU128

您好!

一如既往的感谢!

ΔΣ 正在编写代码、以提高24位 Δ Σ ADC 的精度。

我目前正在使用 Resource Explorer 示例代码 msp430f677xA_sd24b_06.c 查看 AD 转换的输出。

当前、输入电源电压= 3.3V、基准电压= 1.25V (外部)、输入电压= 1.0V。

在几乎没有更改程序的情况下、我们能够实现大约14位或更低的性能。 但是、性能并不符合所述的要求。

 这里有一个问题。

・我应该使用什么代码来将 OSR 增大到1024? 我将 SD24BOSRx 设置为 OSR=9、但结果是通常值的27倍? 它已经上升到大约。

・什么代码用于执行 AD 转换? 这是通过 SD24BISR 实现的吗? 我无法从这个程序中看到 SD24BISR 的内部、这很令人困惑。

・我想使用 IQmathlib、所以我得到了库并将其包括在内、但是我应该如何编写这个程序来进行 AD 转换呢?

MSP430 IQmathLib 用户指南01.10.00.05版用户指南

https://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/IQmathLib/latest/exports/MSP430-IQmathLib-UsersGuide.pdf

我不知道该怎么说。"

我将使用 MSP-TS430PEU128并插入一个引脚接头来输入电压。 3.3V 电源电压也从外部输入。

如果您有任何其他可以提高准确性的想法、敬请告知。

我很感激,如果你能给我一些建议,因为我是无知。

谢谢你。

俊晴

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

    尊敬的俊晴:

    1. 若要将 OSR 设置为1024、请填充整个寄存器、使 SD23BOSRx = 0x3FF
    2. SD24BCCTLx 寄存器包含了控制转换的位置。
      1. SD24SCSx 位允许不同的选项、包括外部触发器、组触发器、或设置开始转换位。
      2. SD23SC 为开始转换位
      3. 示例代码
    3. 对于 IQ 数学、您需要使用_IQN (float a)函数将 ADC 转换的结果转换为 IQ 数、然后使用 IQ 数学变量类型执行数学函数。 有关详细信息、请参阅用户指南

    除了软件数字滤波器外、具有良好的模拟前端也有助于改善结果。 我们 对三相电子电表的实施 提供了一些模拟前端的示例。 尽管预期的输入信号是120V @ 60Hz 或240V @50Hz (世界各地的典型电源线)。

    此致、
    卢克

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

    您好、 Luke

    感谢您的回答!

    我仅设置了我理解的部分。

    当我把 SD23BOSRx 寄存器设置为0x3FF 时、6位的值(64倍)增加了、如图所示。 您知道原因吗?

    我已经看到过代码示例、目前正在使用该代码进行转换。 SD23SC 是转换开始位、但它是否也适用于转换操作?

    执行 IQ 数学函数时、不清楚使用哪个函数以及替换哪个值。 关于问题2、我想如果你知道 AD 转换函数公式和要替代的值、就可以使用这个公式、但我想知道这一点。

    我为我的无知道歉。

    如果你愿意教我的话。

    谢谢你。

    俊晴

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

    您好、 Luke

    我稍微更改一下回复。

    3.我做了一个这样的程序。这个程序是 Luke 教我的修改。

    我将在 ch0上测量。

    但结果保持不变。

    您仍在错误地使用它吗?

    #define GLOBAL_IQ 24  
    #包含
    #包含

    浮点结果;
    _iQ24 IQ_结果;

    空 main (void){

    空 main (void)
    {

    WDTCTL = WDTPW | WDTHOLD;  

    SD24BCTL0 = SD24SSEL_1 | SD24DIV4;  

    SD24BINCTL0 = SD24GAIN_1 | SD24INTDLY0;  

    SD24BCCTL0 = SD24SNGL | SD24DF1;  

    SD24BIE |= SD24IE0;   

    SD24BOSR0 |= 0x3FF;  

    __delay_cycles (0x3600);  

    while (1)
    {
    SD24BCCTL0 = SD24SC;  
    __ bis_SR_register (LPM0_bits | GIE);  
    ___ no_operation();
    ___ no_operation();  

    #if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
    #pragma vector=SD24B_vector
    __interrupt void SD24BISR (void)
    #Elif 已定义(_ GNU _)
    void __attribute_((interrupt (SD24B_vector))) SD24BISR (void)
    #else
    #错误编译器不受支持!
    #endif
    {

    开关(SD24BIV)
    {
    案例 SD24BIV_SD24OVIFG:  
    中断;
    案例 SD24BIV_SD24TRGIFG:  
    中断;
    情况 SD24BIV_SD24IFG0:  
    IQ_Results =_iq24 (结果);
    IQ_RESULTS = SD24BMEMH0;
    IQ_RESULTS =(IQ_RESULTS << 16)| SD24BMEML0;
    中断;
    案例 SD24BIV_SD24IFG1:// SD24MEM1 IFG
    中断;
    案例 SD24BIV_SD24IFG2:// SD24MEM2 IFG
    中断;

    __ bic_SR_register_on_exit (LPM0_bits);//退出 LPM0

     

    谢谢!

    俊晴

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

    尊敬的俊晴:

    在您的 ISR 中 SD24BIV_SD241FG0情况下、我相信顺序错误。

    unsigned long results;
    _iq24 IQ_results;
    ...
    case SD24BIV_SD24IFG0:   
        results = SD24BMEMH0;
        results = (results << 16) | SD24BMEML0;
        IQ_results = _IQ24(results);
        break;
    ...

    两次测试之间的差异。 电压=代码* VREF/最大代码

    256 OSR (默认)-最大值为 FF FFFF (16777216)

    记录值- 15072365

    电压= 15072365 * 1.25 / 16777216 = 1.123 (四舍五入为最接近的千分之一)

    ----------------

    1024 OSR -最大值为4000 0000 (1073741824)

    记录值- 964826962

    电压= 964826962 * 1.25 / 1073741824 = 1.123 (四舍五入为最近的千分之一)

    --------

    至于为什么该值要大64倍、这是基于创建满量程范围的公式。 FS = 2^(3* log2 (OSR))、过采样为1024的满量程范围比默认256过采样的满量程范围大64倍。

    另一项检查是对满量程范围进行分频以获得其比率。 1073741824/16777216 = 64。

    当设置 SC 位时、它将开始采样和转换、当整个过程完成时、它将生成中断。 IQMath 可被用来创建实际电压值、正如我在上面的数学运算中所做的那样。 或者、如果您要创建 Vrms、IRMS、Power 等统计信息、 IQMath 可以帮助解决大的乘法和除法。

    此致、
    卢克

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

    您好、Luke

    非常感谢!  我对 OSR 的理解加深了!

    但出现了一个问题。

     无符号长整型结果;
    _iQ24 IQ_结果;
    ...
    情况 SD24BIV_SD24IFG0:
    结果= SD24BMEMH0;
    结果=(结果<< 16)| SD24BMEML0;
    IQ_Results =_iq24 (结果);
    中断;
    ...

    当我更改了上面的程序时、IQ_Results 的值发生了很大变化。

    详情请查看图片。

    这是否意味着结果将为 float 类型且结果将为_iq24 (results)?

    但是、由于我缺乏相关知识、即使我将其更改为浮点型、

      结果=(结果<< 16)| SD24BMEML0;

    如果将其设置为浮点类型、 将无法编译、因为采用了此语句。 我不知道如何更改它。  

    我很抱歉没有告诉你所有的时间,但我想得到你的知识。

    谢谢你。

    俊晴

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

    尊敬的俊晴:

    编译器可能会指出您无法对浮点数进行按位运算。 float 和 IQMath 具有与整数不同的表示形式、因此按位函数无法提供正确的结果。 经过进一步研究、我认为我们不需要在这里使用浮点数据类型。

    您可以直接将结果转换为 IQ24数字。  

    int32_t results;
    _iq24 IQ_results;
    ...
    case SD24BIV_SD24IFG0:
    //Get and store results from the ADC
    results = SD24BMEMH0;
    results = (results << 16) | SD24BMEML0;
    IQ_results = (_iq24) (results >> 8);

    要查看 IQMath 的值、请右键单击"Expressions"窗口、然后转到 Q 值并选择与 IQMath 编号对应的 Q 值。  

    --------

    另一个设计决策是您要使用的数学类型。 您可能需要使用不同的 IQ 类型来防止溢出、而这将需要您进行一些正确的移位。

    要在 IQMath 数和十进制之间进行转换、可以对 IQMath 用户指南中列出的值进行反向运算。

    反向运算将是2^n * Xiq = xi。 例如、如果我们获取您的数字:  964826962。将其存储为 IQ24、我们会执行8位右移、然后转换为 IQ24。结果是 Xiq = 0.2246412635。 为了返回到原始数字、我们将取0.2246412635 * 2^24、然后左移8。

    我建议测试不同的操作和条件、因为您希望在预期的应用用例中防止数据溢出。

    此致、
    卢克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我更改上述程序时,IQ_results 的值发生了很大变化。

    当然是这样了。 将整数转换为 IQ24格式时、请将其左移24位。 这会将整数的二进制点与 IQ24格式的二进制点对齐。  导致24位结果消失。 其中包括 ADC 结果的24位中的16位。

    如果您从合适的方法开始、那么该转换效果要好得多。 就像一个浮子。

    最好将您的比例因子应用于 ADC 结果、然后切换到 IQ24。 实际上可以一步完成。 假设您具有 IQ24格式的换算系数、只需乘法即可。 无需使用 IQmath 函数、只需进行常规乘法即可。

    由于您以零小数位数和24作为起始值、结果将为24、因此为 IQ24格式。 假设换算系数不会导致整数部分溢出、则效果很好。 如果发生溢出、您需要使用不同的 IQ 格式。

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

    您好、Luke

    感谢您的回答!

    很抱歉这么晚才回复。 另外、我还有问题。

    正如您所说、我能够表达 IQ 值。
    有关计算结果、请查看用户指南、更改 N 值以查看数字值。
    让我们更改该程序以找出溢出的各种条件和操作。
    如果您对条件或操作有任何疑问、请随时与我们联系。
    现在我有一个问题。
    您可能需要使用不同的 IQ 类型来防止溢出

    这是否意味着 IQN 的 N 值必须准确?

    例如、对于分辨率为24位的 ADC、较好的情况是 IQ24、但如果为 IQ28或 IQ16、则会造成不便。

    谢谢!

    俊晴

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

    大家好、David

    感谢您的回答!

    理解以下说法是否正确?如果您尝试为 IQ24获取一个24位值、它将向左移动24位、因此您将无法获得16位的 ADC 值。

    我目前正在尝试通过将结果乘以适当的比例因子来使 Q 值合适。

    当前的情况是默认偏移二进制状态、我已经确认了大约964827590的输出、但即使输出加倍、它也会立即达到16777216。

    在这种情况下、即使 IQN 加倍、也不会达到16777216吗?

    我很抱歉我缺乏知识。

    如果您能告诉我、我将不胜感激。

    谢谢!

    俊晴

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

    大家好、David

    抱歉、我没有足够的信息。

    补充。
    在这种情况下,即使是双倍的 IQN (IQ5或更低)也不会达到16777216吗?

    关于这一点、当我查看用户指南(第10页、表2.2:IQMath 数据类型)时、_iq7的最大值为16,777,215…… 因此我认为它会小于1/2、_iq5。

    https://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/IQmathLib/latest/exports/MSP430-IQmathLib-UsersGuide.pdf

    谢谢!

    俊晴