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.

[参考译文] MSP430F67641A:MSP430F67641A 中的 SD24B 和 ADC10同步

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/697838/msp430f67641a-sd24b-and-adc10-syncronization-in-msp430f67641a

器件型号:MSP430F67641A
主题中讨论的其他器件: MSP430F67641MSP430F6779AMSP430I2041

您好、先生、

我总结一下、我将 msp430f67641A 用于三相四线能量计、其中我将使用3个 Σ-Δ(SD24B)电流通道和3个 SAR ADC (ADC10、通道编号 A5-A2)电压+1中性电流通道。 请告诉我如何操作。

我想使用 Σ-Δ ISR 和 SAR ADC ISR 进行采样,我不想为此使用 DMA,我以12MHz 时钟频率运行电路板,我在1秒内采集4096个样本 下面是我的设置。

//ADC 信息

void ADC_Init()

//表示 ADC
P9SEL |= BIT1+BIT2+BIT3;  
P1SEL |= BIT0;

P1MAP0=31;
REFCTL0 = REFMSTR + REFVSEL_1 + REFON;// Enabale Reference = 2.0V */
SD24BCTL1 &=~SD24GRP0SC;/* SD16SC */

#if MCLK_DEF = 12
SD24BCTL0 = SD24SSEL_SMCLK //时钟为 SMCLK */
| SD24DIV2|SD24DIV0/* 16分频=> ADC 时钟:1.048576MHz *// SD24PDIV_1 |
| SD24REFS;/*使用内部基准*/
#endif

SD_REG (SD_REG_INCTL、RI_CHANNEL)=CURRENT_CT_GAIN;  
SD_REG (SD_REG_CCTL、RI_channel)= SD24DF_1 | SD24ALGN | SD24SCS_4;
SD_REG (SD_REG_OSR、RI_CHANNEL)= 512 - 1;

SD_REG (SD_REG_INCTL、YI_CHANNEL)= CURRENT_CT_GAIN;  
SD_REG (SD_REG_CCTL、YI_channel)= SD24DF_1 | SD24ALGN | SD24SCS_4;  
SD_REG (SD_REG_OSR、YI_CHANNEL)= 512 - 1;

SD_REG (SD_REG_INCTL、BI_CHANNEL)= CURRENT_CT_GAIN;  
SD_REG (SD_REG_CCTL、BI_CHANNEL)= SD24DF_1 | SD24ALGN | SD24SCS_4;  
SD_REG (SD_REG_OSR、BI_CHANNEL)= 512 - 1;

SD24BTRGOSR=511;
SD24BTRGPRE=0;

ADC10CTL0 = 0;

 asm ("NOP");

 ADC10CTL0 = ADC10SHT1 | ADC10ON | ADC10MSC;

 ADC10CTL1 = ADC10SHP | ADC10SH_3 | ADC10DIV_2 | ADC10SSEL_3 | ADC10CONSEQ_1;

 ADC10CTL2 = ADC10RES | ADC10DF;

ADC10MCTL0 = ADC10SREF_1 | ADC10INCH_5;

 SD24BTRGCTL |= SD24SCS_GROUP0;   //触发器生成组0 +D24TRGIE */

 SD24BCTL1 |= SD24GRP0SC;       /*开始组0 */

ADC10IFG = 0;
ADC10IE |= ADC10IE0;
ADC10CTL0 |= ADC10ENC;
SD24BIE |= SD24IE2;

// SAR ADC ISR

#pragma vector=ADC10_vector
_interrupt void ADC10_ISR (void)

ADC10IFG=0;
静态无符号 char adc_samples_channel;
ADC_SAMSICS_CHANNEL =(ADC10MCTL0和0x000F);
开关(ADC_SAMESS_CHANNEL)

情况5:
asm ("NOP");
中断;

案例4:
V_Sample[0]= ADC10MEM0;对于 Voltage_R、为//ch_A5
中断;

案例3:
V_Sample[1]=ADC10MEM0; 对于 Voltage_Y、为//ch_A4
中断;

案例2:
V_Sample[2]= ADC10MEM0; 对于 Voltage_B、为//ch_A3
中断;

案例1:
I_Sample[3]= ADC10MEM0;//CH_A2表示 CURRENT_N
中断;

情况0:
asm ("NOP");
中断;

默认值:
asm ("NOP");
中断;



ADC10CTL0 &=~ADC10ENC;

ADC10CTL0 |= ADC10ENC;

// SD24B ISR

#pragma vector=SD24B_vector
_interrupt void SD24BISR (void)

unsigned char i;
SD24BIFG = 0;

I_Sampl[0]=SD_REG (SD_REG_MEMH、RI_channel);
I_Sampl[1]=SD_REG (SD_REG_MEMH、YI_CHANNEL);
I_Sample[2]= SD_REG (SD_REG_MEMH、BI_CHANNEL);

 I_ACe[3]=dc_filter (&I_DC[3]、I_Sample[3]);

for (i=0;i<3;i++)

 V_ACT[i]=dc_filter (&V_DC[i]、V_Sample[i]);
 i_Act[i]=dc_filter (&i_DC[i]、i_Sample[i]);

//和其余代码---

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

    发布源代码时、我建议您使用"插入代码、附加文件等..." 选项。
    此选项保存原始代码格式并使示例更易于阅读。

    您的应用程序应由计时器中断驱动。
    该中断应触发所有采样和 ADC 转换、并且触发应尽可能快。
    所有7个通道的采样时间应相等。

    您的设计是否基于一些 TI 应用手册?

    您已经发布了一些代码、但尚未定义、这是您遇到的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、先生、

    1-出于安全目的,我无法获取文件。

    2 -是的、我的设计基于 基于基于 MSP430F67641的能量计。

    3-我已经在使用两 个计时器(用于 KWH 脉冲生成和 DLMS 协议)。如果我要使用计时器进行 ADC10和 SD24B 同步、请告诉我如何执行该操作、因为您说所有7个通道的采样时间应该相同、但我的 ADC10样本正在运行 200ksps 时的电流   

      ADC10CTL2 = ADC10RES | ADC10DF;  

    在该设置中、ADC10SR 位不置位、因此支持200ksps 采样、

    在 SD24B 中,我将获取4ksps (4096个样本/秒),因此请告诉我如何保持所有7个通道的采样时间相同。

    如果可能、您可以为我提供简短的代码。

    谢谢。

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

    您好、Sumit、

    首先、我不是电源计量专家。

    AD1)还不错

    AD 2)我快速查看  了文档、其中指出:

    以上所有内容都意味着您对原始设计进行了大量修改。
    一旦分辨率发生变化、就扫描每条电压线 TI 假定的分辨率。
    您计划如何使用中性线电流测量的情况是未知的。

    AD 3)您无需单独的计时器即可实现 SD24_B 和 ADC10_A
    您的设置说明:
    ADC10CTL2 = ADC10RES | ADC10DF;
    是错误的。

    我对 TI 文档的引用是:ADC10由 SD24_B 触发
    以上陈述是对您最初问题的可靠答案。

    如果您同意我的观点、请将您的原始帖子标记为已解决
    如果您有任何其他问题、请随时咨询 e2e。

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

    您好、先生、

    感谢您的快速回复。

    1 -我不理解您的第3点、您说您不需要单独的计时器来实现此目的、但您之前说过您的应用应该由计时器中断驱动。

    2 -您说的   

      ADC10CTL2 = ADC10RES | ADC10DF;

      设置错误,请告诉我原因,而不是应该使用什么设置。

    3 -我的问题是我在 sd24ISR 中获取电流通道样本、在 ADC10ISR 中获取电压通道+中性电流通道样本、 我对 RMS (电压和电流)计算的整个计算是在 SD24ISR 中进行 的、但 当仪表切换为通电和断电时、电压和中性电流的 RMS 值会突然出现。我的仪表进入 LPM3模式(仪表启用电池) 在断电期间 、SIR 您能否检查我之前发送的代码(包括初始化和 ISR 部分) 、并告诉我 如何正确执行。

    4-我的发言顺序  

      ADC_SAMSICS_CHANNEL =(ADC10MCTL0和0x000F);(请在 ME 提供的代码中检查 ADC10 ISR 中的此饱和情况)

      ADC10ISR 中的值为4、2、1、0、而不是5、4、3、2、1、0 (ADC10INCH =5、这将触发通道 A5-A0)、这意味着通道号 A5和 A3未触发。

    5 -如果可能、请为我提供示例代码。

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

    您好、Sumit、

    为了允许并鼓励我们的社区提供具体反馈、请每次关注一个问题/主题。

    我看到您已根据 《使用 MSP430F67641实现低成本三相电子电表 》应用手册修改了我们的源代码。 我强烈建议返回到我们的代码、进行小幅更改、并以增量方式验证这些更改。 否则、当许多东西同时发生变化时、尝试弄清发生了什么情况会很混乱。

    此外、我强烈建议您使用 Σ-Δ ADC 通道来测量中性电流、而不是 SAR ADC 通道。 您很可能使用的是输出差分信号的电流互感器(CT)。 Σ-Δ ADC 为测量低电流提供了高分辨率、假设未发生篡改(理想情况下、如果一切都正常平衡、则不会有中性电流流动)、则在三相配置中会出现这种情况。 SAR ADC 可与电压通道良好配合、因为它们只是分压器、可降低交流电源输入电压。

    因此、 您最简单的解决方案是:(a)切换到 MSP430F6779A 器件、并将7个 Σ-Δ ADC 通道用于3个电压通道和4个电流通道;(b)利用我们新发布 的电能测量设计中心(EMDC)和软件库 、适用于基于 Σ-Δ ADC 的器件 如 F67xx 和 i20xx。 您可以在设计中心快速添加另一个用于中性电流测量的通道、生成代码、对器件进行编程以及查看结果。 EMDC 针对的是我们基于 Σ-Δ ADC 的器件、例如 MSP430F6779A 和 MSP430i2041、而不是针对使用 SAR ADC 进行计量测量的 MSP430F67641等器件。

    如果您无法切换器件、我知道、但您需要采纳我的初始建议、对 MSP430F67641的源代码进行增量更改。 同样、开发新 EMDC 工具的原因是为了减少这些类型的应用所需的工作量和时间。

    此致、

    James

    MSP 客户应用