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.
您好!
一如既往的感谢!
ΔΣ 正在编写代码、以提高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版用户指南
我不知道该怎么说。"
我将使用 MSP-TS430PEU128并插入一个引脚接头来输入电压。 3.3V 电源电压也从外部输入。
如果您有任何其他可以提高准确性的想法、敬请告知。
我很感激,如果你能给我一些建议,因为我是无知。
谢谢你。
俊晴
尊敬的俊晴:
除了软件数字滤波器外、具有良好的模拟前端也有助于改善结果。 我们 对三相电子电表的实施 提供了一些模拟前端的示例。 尽管预期的输入信号是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 类型来防止溢出
这是否意味着 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。
谢谢!
俊晴