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.
您好!
我们有一款基于 MSP430F67791A 的旧设计产品。 除计量参数外、该产品还很少
特殊函数,基于计量数据的决策。计量代码库是 TI slaa577g 代码库。
根据代码和应用手册 SLAA577G……功率、电流、电压样本正在更新
或在 emeter-background.c 中以1秒的间隔被掠夺
现在、我们的客户要求在同一产品中添加一个要求我们获取电压、电流、功率、PF 和的附加功能
频率数据、并且我们希望使用相同的现有代码库来完成附加功能。
我在 emeter-structs.h 中尝试了跟随
#define SAMPLE_RATE 409 // 4096
#define ADC_BITS 16.
#define SAPESS_PER_10_seconds 4090 // 40960ul
但这对我来说是不可行的。我想...这里的 SAMPLE_RATE = 409意味着在1秒的时间间隔内获得409个样本。它不会解决我的目的。如果我错了、请纠正我的问题。
在这方面,任何人都能提供帮助...在 slaa577g 代码库中需要进行哪些更改(以及哪些文件),以便在每隔<100ms 获得所需的计量数据。
谢谢、此致
您好 ARS、
感谢您的详细博文。 更改这两个变量是一个很好的开始、看起来它们是正确的。 但是、100ms 比1秒周期短得多、因此在减少这么多之前、我建议尝试一半原始值、以查看通信/功能是否仍然正常。 如果确实如此、这是很好的。
但是、对于您的情况、您需要更快的报告、这意味 着使用 sample_per_10_seconds 的代码(您可以通过在项目文件中搜索此变量来找到该代码)可能无法针对如此低的值正常工作。 此外、您可能会过度运行通信速度、甚至计算每个相位的参数所需的时间量。 您可能需要提高通信和/或 CPU 速度、以确保数据的发送速度足够快、以便执行计算。
此致、
James
您好 James、
感谢您的回答。我需要您的帮助才能解决问题。
请注意,我的应用使用单相电压和 电流。并且,百分比计量误差可以高达2%。
在上述应用中,系统时钟以16MHz 运行,根据应用报告 SLAA577,ΣΔ24 ADC 的时钟选择为1.048576MHz,采样频率为4.096ksps。 即4096个样本/秒。 因此 、每个 ΣΔ24 Δ Σ ADC 采样中断的发生频率为244uec。
我的第一个选择:
遵循 emeter-structs.h 中定义的宏
#define SAMPLE_RATE 4096
#define ADC_BITS 16.
#define SAMOESS_PER_10_seconds 40960ul
我仍然认为、仅将 SAMPLE_RATE 和 SAMPS_PER_10_Seconds 更改为1/10的值(即409和4090)、就不会在100msec 提供结果。因为我的理解是、根据宏名称建议 、SAMPLE_RATE 宏定义了在1秒时间间隔内累积的样本数。 因此,如果我将其设为409, 我认为现在相当于409个样本的样本数据将在1秒内累积,因此样本数据的上升 率不会降低(在我的情况下,我希望它在100毫秒内)。 相反、1秒间隔内的任何样本都不会减少。结果也是如此。
请评论!
我认为的第二个选项是:调用 log_parameters (phase)函数(来自 emeter-background.c 中的 ADC ISR 例程),以减少采样数 (在本例中为409)。
// if (phase -> metal量.dot_prod.sample_count >= samples_per_sond)//原始代码 if (phase -> metal量.ode_prod.sample_count >= 409) //完成的更改,希望获取数据@100毫秒 { log_parameters (phase); _BIC_SR_IRQ (LPM0_Bits); /*当作为主机程序运行时,没有 RTC,但我们仍需要以某种方式启动前台。 */ } 一 // if (phase -> metal量.dot_prod.sample_count >= samples_per_second + 200)//原始代码 if (phase -> metyetition.ode_prod.sample_count >=(409 + 10))//已完成更改,希望获取数据@100msec { /*我们似乎没有检测到电源周期的结束,因此没有检测到力 处理块条件的结束。 * log_parameters (phase); _BIC_SR_IRQ (LPM0_Bits); }
但我不知道上述变化的副作用。 这第二种方法是否会以100毫秒的速度提供数据?这第二种方法是否正确?
Samples_per_second = Samples_per_10_seconds / 10.
emeter-setup.c 和 emeter-background.c 中使用的" samples_per_10_seconds "值。我可以说明的是、它用于检查40至70Hz 之间的频带。
由于我们更加关注应用端代码并将 TI 计量代码库作为一个完整的工具库,我请求您的 TI 专家团队能提供合适的解决方案,使其在100mSec 下工作。
谢谢、此致、
ARS
尊敬的 James 和 TI 团队:
1.我可否就上述申请要求及上述解释提供进一步的帮助?
2. 项目中有一个库文件 Emeter-fi-table.c、并且有 一个 FIR 系数表来校正相移。
const Int16_t fir _coeffs[][2]=
{
{32767、8198}、// 2.1973度
{31761、8326}、// 2.1629度
三、会议的报告
};
如果 系统时钟频率发生更改或采样频率发生更改,而不是4096Hz,我认为必须更改此表。 TI 是否提供任何计算器来生成 除4096Hz 采样频率之外的 fir 表。
3. 这是唯一决定采样频率的函数,可在 Emeter-setup.c 中找到
在下面的代码中,我想让系统时钟频率= 25MHz (使用的外部晶振= 32.768kHz)和采样频率= 4096Hz
静态__inline__void init_analog_front_end_normal (void) { int i; REFCTL0 = REFMSTR + REFVSEL_1 + REFON; /* Enabale Reference = 2.0V */ SD24BCTL1 &=~SD24GRP0SC; #if MCLK_DEF = 25 SD24BCTL0 = SD24SSEL_SMCLK //时钟为 SMCLK */ | SD24PDIV_3 /* 8分频=> ADC 时钟:2MHz */ | SD24DIV1 | SD24REFS; /*使用内部基准*/ #endif SD16INCTL_CURRENT_1 = CURRENT_PHASE_GAIN; /*设置通道1的增益*/ SD16CCTL_CURRENT_1 = SD24DF_1 | SD24SCS_4; SD16BOSR_CURRENT_1 = 256 - 1; // SD16BOSR_CURRENT_1 = 512 - 1; SD16PRE_CURRENT_1 = 0; SD16INCTL_CURRENT_2 = CURRENT_PHASE_GAIN; /*设置通道2的增益*/ SD16CCTL_CURRENT_2 = SD24DF_1 | SD24SCS_4; /*将过采样率设置为256 (默认值)*/ SD16BOSR_CURRENT_2 = 256 - 1; // SD16BOSR_CURRENT_2 = 512 - 1; SD16PRE_CURRENT_2 = 0; SD16INCTL_CURRENT_3 = CURRENT_PHASE_GAIN; /*设置通道3的增益*/ SD16CCTL_CURRENT_3 = SD24DF_1 | SD24SCS_4;//| SD16IE; /*将过采样率设置为256 (默认值)*/ SD16BOSR_CURRENT_3 = 256 - 1; // SD16BOSR_CURRENT_3 = 512 - 1; SD16PRE_CURRENT_3 = 0; SD16INCTL_NEUTRAL = CURRENT_NEW_GAIN; /*为通道中性设置增益*/ SD16CCTL_NEUTRAL = SD24DF_1 | SD24SCS_4; /*将过采样率设置为256 (默认值)*/ SD16BOSR_NEUTRAL = 256 - 1; SD16PRE_NEUTRAL = 0; // SD16BOSR_NEUTRAL = 512 - 1; /*配置模拟前端通道2 -电压*/ SD16INCTL_VOLTGE_1 = VOLTGE_GAIN; SD16CCTL_VOLTGE_1 = SD24DF_1 | SD24ALGN | SD24SCS_4; SD16BOSR_VOLTGE_1 = 256 - 1; // SD16BOSR_VOLTGE_1 = 512 - 1; SD16PRE_VOLTGE_1 = DEFAULT_V_PRESALE_FACTOR; // SD16PRE_VOLTGE_1 = DEFAULT_V_PRESALE_FAC因 子_A; SD16INCTL_VOLTGE_2 = VOLTGE_GAIN; SD16CCTL_VOLTGE_2 = SD24DF_1 | SD24ALGN | SD24SCS_4; SD16BOSR_VOLTGE_2 = 256 - 1; // SD16PRE_VOLTGE_2 = DEFAULT_V_PRALE_FACTOR _B; // SD16BOSR_VOLTGE_2 = 512 - 1; SD16PRE_VOLTGE_2 = DEFAULT_V_PRESALE_FACTOR; SD16INCTL_VOLTGE_3 = VOLTGE_GAIN; SD16CCTL_VOLTGE_3 = SD24DF_1 | SD24ALGN | SD24SCS_4; SD16BOSR_VOLTGE_3 = 256 - 1; // SD16BOSR_VOLTGE_3 = 512 - 1; SD16PRE_VOLTGE_3 = DEFAULT_V_PRESALE_FACTOR; // SD16PRE_VOLTGE_3 = DEFAULT_V_PRALE_FACT_C; 对于(i = 0;i < NUM_PASes;i++) CHAN [i].metrology.current.in_phase_correction[0].sd16_preloaded_offset = 0; SD24BIE=0x7F; SD24BCTL1 |= SD24GRP0SC; }
此致、
ARS
在"emeter-background.c"中、此代码确定何时触发前台进程、该进程将完成计算并发送数据。 更改 Samples_per_10_seconds 会导致触发速度更快或更慢。 您应该能够使用选项1、该选项应自动为您执行选项2。
/*查看是否 记录了足够长的测量间隔,并捕捉下一个周期的开始。 只要 块 的长度合理、我们实际上并不关心有多少个周期。 设置至少1秒 比计算周期更好、因为它不受噪声 尖峰的影响。 同步到一个完整的周期数可减少 块到块抖动、尽管它不会影响 测量的长期精度。 // if (phase -> metal量.dot_prod.sample_count >= samples_per_second) { log_parameters (phase); _BIC_SR_IRQ (LPM0_Bits); //作为主机程序运行时没有 RTC,但我们仍需要使用 以某种方式启动前景。 *
[引用 user="ars"] emeter-setup.c 和 emeter-background.c 中使用的" samples_per_10_seconds "值。我可以说明的是、它用于检查40至70Hz 之间的频带。
没错。 由于您要调整 Samples_per_10_seconds、因此需要相应地调整该代码。 所发生的情况是、您的采样数不会递增、因为代码认为交流电源输入频率超出范围。
#IF 定义(MAIN_FREQUENCY 支持)
/*对样本计数应用限制、以避免尖峰或电源线逐渐耗尽干扰
频率读数太大*/
/*主电源应小于40Hz 或大于70Hz,以使此测试失败! *
if (256*SAMPS_PER_10_seconds/700<= PHASE_>metality.cley_sample_count && PHASE_metality.cley.cley_sample_count <= 256*SAMPS_PER_10_seconds/400)
{
}
其他
{
phase -> metal量 度.cycle_sample_count = 0;
FIR 表需要针对不同的采样率进行重新生成。 TI 不提供该计算器。
采样率通过将 ADC 源时钟除以过采样率(OSR)来确定。 您可以通过在 ADC ISR 中切换 GPIO 来验证该速率。
此致、
James
您好 James、
感谢您的指导。
1) 1)我遵循 了选项1: 更改了 emeter-structs.h 中定义的以下宏
#define SAMPLE_RATE 409 // 4096
#define ADC_BITS 16.
#define SAPESS_PER_10_seconds 4096ul // 40960ul
下面的代码部分已更改。 如果 有任何问题、请帮我解决。
#IF 定义(MAIN_FREQUENCY 支持)
/*对样本计数应用限制、以避免尖峰或电源线逐渐耗尽、从而干扰频率读数过多*/
/*主电源应小于40Hz 或大于70Hz,以使此测试失败! *
// if (256*SAMPS_PER_10_seconds/700 <= PHASE_>metal量 度量.cycle_sample_count && PHASE_metality.cycle_sample_count <= 256*SAMPS_PER_10_seconds/400)
//更改为.....
if (256*SAMPS_PER_10_seconds/70 <= PHASE_>metal量.cycle_SAMPLE_COUNT && PHASICLE->met量.cycle_SAMPLE_COUNT <= 256*SAMPS_PER_10_seconds/40)
{
}
其他
{
phase -> metal量 度.cycle_sample_count = 0;
}
我的应用可以接受电压和电流测量读数。但我观察到、反向电流检测在较低功耗下需要花费大量时间。 例如。 如果我想检测100瓦的反向电流,在注入105瓦时需要500毫秒,但如果注入大约200瓦,则检测到180毫秒。您能在这里指导我缩短检测时间吗?
我已经改变了这个宏、认为它将减少时间。
/*! 这是必须同意的连续测量块的数量
反转的当前状态在我们接受它之前发生了变化。 *
#define PHASE_REGAL_Persistence_CHECK 2 // 5
2) 2)为什么 在 emeter-background.c 的 ADC ISR 例程中调用 log_parameters (phase)函数两次
if (phase->metnationality.dot_prod.sample_count >= samples_per_sond) //完成的更改,希望获取数据@100毫秒
{
log_parameters (phase);
_BIC_SR_IRQ (LPM0_Bits);
/*当作为主机程序运行时,没有 RTC,但我们仍需要以某种方式启动前台。 */
}
一
if (phase -> metal量 度.dot_prod.sample_count >=(samples_per_second + 200))//完成更改,希望获得@100ms
的数据{
/*我们似乎没有检测到电源周期的结束,因此没有检测到力
处理块条件的结束。 *
log_parameters (phase);
_BIC_SR_IRQ (LPM0_Bits);
}
我想删除第二 个 log_parameters (phase) 函数。它可以吗?
谢谢、此致、
ARS
[引用 user="ARS"]
1) 1)我遵循 了选项1: 更改了 emeter-structs.h 中定义的以下宏
#define SAMPLE_RATE 409 // 4096
#define ADC_BITS 16.
#define SAPESS_PER_10_seconds 4096ul // 40960ul
下面的代码部分已更改。 如果 有任何问题、请帮我解决。
[/报价]
看起来是正确的。
[引用 user="ars"> 我的应用可以接受电压和电流测量读数。但我观察到、反向电流检测在功耗较低的情况下需要花费大量时间。 例如。 如果我想检测100W 的反向电流,则注入105W 的电流需要500ms,但如果注入200W 的电流,则检测到180ms 的电流。您能在这里指导我缩短检测时间吗?[/引述]
我假设您要通过更改 PHASE_REGAL_THRESHOLD_POWER 来调整该电平。 是否启用 power_balance_detection_support?
还有 一个 power_balance_detection_support 可能会影响您的结果。 这些参数可能还需要 调整 PHASE_INDEAL_PONENT_CHECK。
您是否将 NEL_MONITOR 支持定义为1?
/*! 这是必须同意的连续测量块的数量 不平衡状态在我们接受它之前发生了变化。 */ #define PHASE_INGAL_persistence_check 5 星! 这可以监控带电和中性点电流之间的平衡 用于篡改检测。 */ #define POWER_ALANGAND_DETECHNOT_SUPPLIC支持 /*! 这是最小电流电平(跛行模式)和最小功率电平(正常) 模式)、在该模式下、我们将检查接地条件。 非常小 读数缺乏进行有意义的 FF 比较所需的精度和分辨率 中性点之间的差异。 */ #define PHASE_INGAL_THRESHOLD_CURRENT 500 #define PHASE_INGAL_THRESHOLD_POWER 2000年
查看'emeter-forefore.c'、在检查"curry_Reversed"之前有一些代码。 该代码似乎取决于 NEUTRAL_MONITOR_SUPPORTING_SUPPORTY_POWER_Balance_DETECTENT_SUPPORT助 。
#if 已定义(power_balance_detection_support) #IF 定义(single_phase) x = TEST_PHASE_Balance (x、y、PHASE_INBALING_THRESHOLD_POWER); 其他 x = TEST_PHASE_Balance (PHASE、x、y、PHASE_INBALING_THRESHOLD_POWER); #endif IF (((PHASE_>STATUS & PHASE_INBONGH)) { /*当相位不平衡时,我们仅在中查找反向电流 电流的情况下产生最大的电流。 如果我们不施加此限制、则耦合 通过寄生 CT 电源变压器会导致反向情况 不正确地升高。 如果没有寄生电源、则该测试可能是 浪费时间。 * if ((阶段->状态& CURRENT_FENT_NEUTRAN)) Reversed= phase -> status & I_nel_Reversed; 其他 Reversed= phase -> status & I_Reversed; } #endif
2) 为什么 在 emeter-background.c[/quot]的 ADC ISR 例程中调用 log_parameters (phase)函数两次?
在输入频率超出40至70Hz 时、这被称为两次超时。 如果您不应用任何内容、第二次调用将更新结果(虽然可能只是噪声)。 这也适用于测量不具有频率或过零的直流信号。
此致、
James
感谢 James 的支持!
[引用 user="James Evans 的说法]我假设您要通过更改 PHASE_REGAL_THRESHOLD_POWER 来调整该电平。 是否启用 power_balance_detection_support?
是的。 您是正确的。我已将宏值更改为50
#define PHASE_REGAL_THRESHOLD_POWER 50 //已更改
由于我没有检查任何不平衡、我还评论了以下内容。
/*! 这可以监控带电和中性点电流之间的平衡
用于篡改检测。 *
//#define power_balance_detection_support
我的结果是在代码中执行上述操作。
/*! 这是必须同意的连续测量块的数量
不平衡状态在我们接受它之前发生了变化。 *
#define PHASE_INDEAL_persistence_check 5.
但是、我在下面的代码中进行了更改
/*! 这是必须同意的连续测量块的数量
反转的当前状态在我们接受它之前发生了变化。 *
#define PHASE_REGAL_Persistence_CHECK 2 // 5
[报价用户="James Evans"]您是否将 NEL_MONITOR 支持定义为1?[/QUERPLET]
否 我的应用不需要中性监控或篡改检测。 因此、我没有对其进行定义
#undef nel_monitor_support
#define PHASE_UNBALANCED_THRESHOLD_CURRENT 500
#define PHASE_UNBALANCED_THRESHOLD_POWER 2000
[引用 user="James Evans 的值]如果输入频率在40至70Hz 范围之外、则调用两次作为超时。 如果您不应用任何内容、第二次调用将更新结果(虽然可能只是噪声)。 这在测量不具有频率或过零的直流信号时也适用。[/quot]
好的。 注意到。 我曾观察到测量更新有相当长的延迟。 假设5 - 8秒。 测量输入时的电流。 例如、我注入了220V 交流测量输入、有时我停止了220VAC。 它应该在100-200毫秒内为零。 但有时我会看到、变为零需要5到8秒。可能的原因是什么?
谢谢、此致、
ARS
尊敬的 James 和 TI 团队:
除了我在上一篇文章中发表的几点意见之外,我想与大家分享在应用中也需要解决的问题。
我喜欢根据超出设定可编程阈值的有功功率值采取措施。
1。 例如,如果我将阈值设置为100瓦...并且在应用程序检查中,需要花费100瓦的时间。
情况 A:我注入102瓦,代码大约需要520 - 540毫秒才能确定是否超过100瓦。这不符合要求。
情况 b: 我注入250瓦,大约需要120 - 140 毫秒的代码来确定它是否超过100瓦。
我怀疑在100毫秒内,当注入的功率仅为100瓦时,代码无法检测到100瓦的有效功率。 但它会检测注入的功率何时更高(情况 b)。 为解决此问题,需要对库代码进行哪些更改?
2. 在下面的代码段中,请帮助我了解为什么在每个 ADC 中断中添加256?
#IF 定义(MAIN_FREQUENCY 支持) phase -> metal量 度.cycle_sample_count += 256; #endif
感谢您的支持。
此致、
ARS
尊敬的 James 和 TI 团队:
我能否对上一篇帖子进行任何更新。但我仍然无法获得结果。
感谢您在图书馆的帮助...尽管我知道 TI 已转向新的 EMDC。
在 TI 网站上搜索时,我看到 了应用报告 SLAA638 :单相和直流嵌入式计量(功率监视器)
MSP430I2040的使用 方法、该方法介绍 了... 对于 50Hz 信号、读数每4个交流周期更新一次、即80毫秒。 这与我的要求类似。 我认为与此注释相关的计量代码采用库文件格式。
TI 能否为我使用的 MCU 器件提供类似行的库...或任何综合详细指南。
谢谢、此致、
ARS
[引用 user="ARS]1。 例如,如果我将阈值设置为100瓦...并且在应用程序检查中,超过100瓦所需的时间。
我不确定为什么检测时间之间存在差异。 遗憾的是、这些宏可能已作为参考实现、但并非在所有场景中都经过全面测试。 但是、我怀疑您设置的电平实际上是接近250W 而不是100W 的电平。 也许您可以降低电平、直到它在100ms 内触发。
很明显、由于噪声、可能会有较低的限制、因此您可能会接近该点。 也许您可以以较低的电流校准您的系统、看看这是否会有所改善。 希望您使用的增益设置能够充分利用整个满量程范围。
[引用 user="ARS]2. 在下面的代码段中,请帮助我了解为什么在每个 ADC 中断中添加256?
该值取决于 OSR。 每个 ADC 样本之间有256 (预加载)步长。 在相位校准期间对齐电压和电流样本时、这一点很重要。
关于另一个库、它们可能是类似的。 我不确定它们之间的区别是什么、但您可以通过一些 API 进行移植。
是的、我们建议在新设计中采用 EMDC、因为设计中心使配置、校准和评估一切变得更容易。 此外、CCS 现在受免费使用的新库支持。
此致、
James