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.

[参考译文] MSP430G2231:MSP430和过零检测器

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/712680/msp430g2231-msp430-and-zero-crossing-detector

器件型号:MSP430G2231
主题中讨论的其他器件:CC2530MSP430FR2311MSP430FR2000MSP430G2211MSP430G2452MSP430G2553

大家好、

我´m´m 使用 MSP430、对这款出色的微控制器印象非常深刻。 我已经对8051和德州 CC2530/31有了一定的了解。

我想使用过零检测器在触发波和正弦波之间进行同步、以便在 PWM 电路中使用它来调光超过110/220V 60Hz 的负载。

我之前没有使用过零检测器(ZCD)、我想了解如何在 MSP430中实现它。

我´m ZCD 至4n25光耦合器、如下所示:

我认为我需要使用:

通过计时器产生延迟的中断、并在 TRIAC 上启动触发波之后产生延迟。

有人可以共享一部分代码或、以帮助我如何使用 INT 或其他过程实现它?

您可以看到我的调光器代码下面使用 P1.3和 P1.3引脚:

#include

int main (void){
WDTCTL = WDTPW + WDTHOLD;

P1DIR |= BIT2;  
P1REN |= BIT3;  
P1OUT |= BIT3;
P1SEL |= BIT2;
TA0CCR0 = 1000;  
TA0CCTL1 = OUTMOD_7;
TA0CCR1 = 0;  
TA0CTL = tassel_2 + MC_1;

while (1)

if ((P1IN & BIT3)!= BIT3){
_DELAY_CYCLES (200000);
TA0CCR1 = TA0CCR1 + 100;  
如果(TA0CCR1 > 1000){TA0CCR1 = 0;}


返回0;

此致、

Alex

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

    尊敬的 Alex:

    感谢您发帖。 您似乎在正确的轨道上想要使用中断和计时器。 我看到您使用的 while ()循环和 delay 函数不是最佳的。 您是否在 CCS 内的 TI Resource Explorer 中为 MSP430G2231查看过我们的代码示例? 有几个展示了边沿检测中断的示例(如'msp430g2xx1_p1_04.c')、您可以将这些示例与适用于您的应用的多个计时器示例之一小心地结合使用。

    此外、确保将光耦合器上拉的电压源不超过 G2231引脚的最大输入电压。

    我很高兴您对 MSP430G2231印象深刻! 感谢您的反馈。 我想让您了解一下我们较新的 FRAM 器件、如 MSP430FR2000和 MSP430FR2311。 去年、我们用简短的摘要和代码示例围绕25个基本微控制器功能展开了工作。 您可以在下面的产品文件夹中找到它们。 查看我们的综合电子书。

    MSP430Tm超值系列传感功能代码示例

    只需0.25美元即可增强简单的模拟和数字功能(电子书)

    此致、

    James

    MSP 客户应用

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

    ´m James、我对 MSP430和丰富的可用技术资料印象非常深刻。 非常感谢!

    我深入了解了 TI 的大量材料并将其用于研究、我在空调室内单元 A 中发现了一个在电机驱动器中具有过零检测器的子系统模块。 如您所见、下面的 PIC 模式:

    但在空调室内机参考设计中、我找不到要研究的过零检测器代码的特定代码。 您能帮我找到一个包含 ZCD 代码部分的.c 文件吗?

    www.ti.com/.../ductless_aircon_indoor_system

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

    大家好、我正在配置我的器件以实现 ZCD。

    我已经了解了如何配置 Comparator_A 和中断、但现在我有一个基本的疑问:如何在 MSP430G2211中配置16MHz 时钟。  

    我在数据表中看到了 DCO 设置 频率(15、3)、该频率代表15、25MHz、我没有找到频率为16MHz 的可用库、因为我们有1MHz 的库(BCSCTL1 = CALBC1_1MHz);

    -是否可以在 MSP430G2211中达到16MHz?

    -有些机构可以帮助提供代码示例、我如何使用 BCSCTL1和 DCOCTL 特殊寄存器来配置它?

    此致、

    Alex

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

    如果您的电路板上有32kHz 晶体、则可以使用示例 msp430g2xx1_DCO_flashcal.c 来制作您自己的 CALDCO_16MHz。 如果参考是其他速度、您可以调整原理。

    在需要时、您可以通过 P1.4将 SMCLK 输出到示波器、并使用调试器调整 DCOCTL/BCSCTL1。 (有点痛苦、但您只需执行一次。)

    是否需要使用 G2211? G2553具有4倍的校准 DCO 值、包括16MHz。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、您好、非常感谢!

    我已经安装了一个外部32KHz 晶振、并且成功地调整了16MHz 频率。  

    现在、我仍然尝试构建我的 ZCD 信号以包含在我的调光器中。

    太棒了!

    Alex

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

    Bruce、您好、您好。

    我仍然在调光器件中工作、我已经成功地:

    >设置时钟(16MHz)、

    >使用 LVTT 构建 ZCD 电路(3、3V)

    >来构建 PWM 机制以触发 TRIAC

    但是、我正在定义一个比较器_A、以准备在正弦波和 PWM 方波之间启动正弦波所需的延迟阶段。  

    但我遇到了比较器_A 的问题、我定义了:外部信号(P1.1) CARSEL、内部基准为0、5VCC CAREF_2和 INTERRUPT.CAIE。 我在 P1.1 (P2CA4)上使用 来测试、+VCC 或 GND 并且一直达到中断(P1.0 LED 被切换)。

    您能帮助解决这个问题吗?

    #include 
    
    
    void main (void)
    {
    // Commaparator A settings - set P1.0 if P1.1 >0.5*Vcc
    WDTCTL = WDTPW +WDTHOLD;// Stop WDT
    CACTL1 = CAON +CARSEL +P2EF_2;// CAON = Enable comp、Ccc_2 = 0.5*VCAF、CARSEL1 =>+ CAC2;// CACCOL =
    +CCOMP 1
    = CAC2;// CACCOL = 1 = CACCOL =+CACCOMP 1 | CACCOL //启用输出滤波
    器 P1DIR |= 0x01;// P1.0输出,定义 P1OUT 必需
    //设置中断
    CACTL1 |= CAIE;//设置比较
    器_BIS_SR (LPM3_BITS + GIE)的中断;//输入 LPM3,启用中断
    }
    
    // Comp_A 中断服务例程-- 切换 LED
    #pragma vector=COMPARATORA_Vector
    __interrupt void Comp_A_ISR (void)
    {
    //CACTL1 ^= CAIDA;//切换中断边沿 Borda de subou dida。
    //CACTL1 |= CAIES;//设置下降沿
    CACTL1 &=~CAOUT;//设置上升沿
    CACTL1 &=~CAIFG;//清除中断标志
    //_DELAY_CYLES (200000);
    P1k ^= 0x01;//切换 P1.0
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Alex、您好!

    您的输入信号是否始终是数字(VCC 或 GND)还是模拟信号? 我假设它是模拟输入信号、因为您正在使用比较器。 输入信号是否为正弦信号? 您提到您的 ZCD 已经在工作、因此我想知道您是否不能使用该实现来同步 PWM 信号并且不需要比较器。 如果您可以提供更多的背景信息或高级图、这会很有帮助。

    此致、

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

    大家好、James、非常感谢您的帮助。

     我n´t 数字输入信号(5V 或0v)在比较器 A 代码之前进行测试、在工作之后、我计划在同一引脚上连接 ZCD 输出引脚、但正如我说过的、我没有成功!

    我的 ZCD 电路、它与我在第一个帖子中包含的内容类似、但我进行了一些调整、以便在3、3V 电压下工作。

    我计划使用以下算法来同步 PWM 信号与正弦波形信号:

     >定时器已设置但已禁用

    >在引脚上检测到过零

    >定时器从0开始计数

    >比较器设置为"延时至开启"值

    >计数器达到比较器值

    >比较器打开 TRIAC 栅极

    等等... 
    
    如果您有另一种方法可以使 PWM 信号与正弦波形信号同步、而不使用比较器 A、您可以与我共享它吗?

    BR、
    Alex

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

    Alex、您好!

    再看一下 ZCD 电路、您将得到一个数字输出信号(PWM)、其占空比基本为50%(假设没有直流偏移、则正弦波的一半为正弦波、另一半为负)和可变脉冲宽度(基于交流周期)。 我不明白您所谓的"将 PWM 同步到正弦波"是什么意思。 ZCD 将引入传播延迟、以及 MSP430检测到 PWM 边沿的速度、 但它是一致的-这意味着转换之间的有效差异不应受到传播延迟的影响(它在脉冲的开始和结束处、因此它会减去)。 如果您询问如何测量 PWM 开/关时间(应与前面提到的几乎相同)并将其与频率/过零相关联、那么在捕获模式下使用计时器模块应该很容易实现( 在用户指南中进行了介绍)。 我认为您根本不需要比较器模块。

    此致、

    James

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

    大家好、James、非常感谢您的帮助。  

    您建议我成功地仅使用中断(端口 P1矢量)和特定的电子电路来实现 ZCD 检测。 我现在正在调整时钟、 TRIAC 的延迟会在½波周期内关闭。

    但现在这是我的问题、我使用 MSP430G2452和 SMCLK 时钟方法以16MHz 运行 MSP430。 但在将其设置为一起时、我有一些不一致、计时器 A 也用于生成 PWM 波信号。 如您所见、下面的 SMCLK 模式使用相同的寄存器(用于形成 PWM 波形) TA0CTL 和其他寄存器。

    我需要将我的 MSP430G2452更改为其他具有内置16MHz DCO 的 MSP430、l 如 MSP430G2553、或者我可以将捕捉模式和相关寄存器更改为其他通道、如 TA0CCTL2?

    //用于形成 PWM 波形
    
    的时钟设置 TA0CCR0 = 1000;//计时器计数到这个值。
    TA0CCTL1 = OUTMOD_7;
    TA0CCR1 = 0;// PWM 周期、即0us。
    TA0CTL = tassel_2 + MC_1;
    
    //配置时钟模块- MCLK = 1MHz */
    
    用于(I = 0;I < 0xFFE;I++);// XTAL 稳定延迟
    j = 0;//重置指针
    
    SET_DCO (Delta_16MHz);//设置 DCO 并获取
    SCCAL_DATA = TBCL+;常量 TL1+= TBCL+
    
    
    FLASH_ptrA =(char *) 0x10C0;//指向段 A
    FCTL2 = FWKEY + FSSEL0 + FN1;//闪存时序发生器 FCTL1
    = FWY + ERASE;//设置擦除位
    FCTL3 = FKEY + LOCKA;//清除锁定& LOCKA
    位=*闪存 //虚拟写入以擦除闪存段 A
    FCTL1 = FWKEY + WRT;//设置 WRT 位以进行写入操作
    Flash_ptrA =(char *) 0x10F8;//指向校准常数的开头
    (j = 0;j < 8;j++)
    * Flash_ptrA++= FWCO_DATA[j];/ FWCTL1
    =校准闪存 //清除 WRT 位
    FCTL3 = FWKEY + LOCKA + LOCK;//设置 LOCK & LOCKA 位
    
    void SET_DCO (unsigned int Delta)//将 DCO 设置为选定的频率
    {
    unsigned int Compare、Oldcapture = 0;
    
    BCSCTL1 = DIV_3;// ACLK = LFXT1CLK/8
    TACT_CC1 + CAP = 0; // cap、ACLK
    TACTL = tassel_2 + MC_2 + TACLR;// SMCLK、CONT-MODE、清除
    
    while (1)
    {
    while (!(CCIFG & TACCTL0));//等待直到发生捕捉
    TACCTL0 &=~CCIFG;//捕获、清除标志
    比较= TACCTL0
    =捕获/获取捕获的电流;//比较 // SMCLK 差异
    Oldcapture = TACCR0;//如果
    
    (Delta = Compare
    )中断、则保存捕获的电流 SMCLK;//如果相等、则保留"while (1)"
    ;如果(Delta < Compare)
    {
    DCOCTL-;// DCO 过快、如果
    (DCOCTL = 0xFF)、则减慢它的速度// DCO 是否在 DCO 下?
    如果(BCSCTL1 & 0x0F)
    BCSCTL1--;//选择较低的 RSEL
    }
    否则
    {
    DCOCTL++;// DCO 太慢,如果
    (DCOCTL = 0x00)// DCO 是否回滚?
    如果((BCSCTL1 & 0x0F)!= 0x0F)
    BCSCTL1+;//选择更高的 RSEL
    }
    TACCTL0
    = 0;//停止 TACCR0
    TACTL = 0;//停止 Timer_A
    BCSCTL1 &&=~DIV_3;// ACLK = LFXT1CLK
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Alexander argollo"]您建议我成功地仅使用中断(端口 P1矢量)和特定电子电路来实现 ZCD 检测。 我现在正在调整时钟、并在 ½波周期内关闭 TRIAC 的延迟。[/quot]

    很棒! 查看您的代码、我不会动态调整您的 DCO 频率。 相反、我强烈建议固定 DCO 频率并使用计时器来调整 TRIAC 在 ZCD 输入周期内的开启/关闭时间。 这种方法应该更容易、更稳定。

    很高兴看到端口中断能够检测到 ZCD 检测-这是一项很好的工作! 现在、假设您希望 TRIAC 的输出信号恰好等于 ZCD 周期的一半。 使用端口中断、您可以首先将端口中断配置为在上升沿触发。 然后、当发生这种情况时、打开 TRIAC。 在此之后、您需要立即在代码中将端口中断重新配置为在下降沿触发。 然后、当该中断触发时、您将关闭 TRIAC。

    假设您希望脉宽小于输入 ZCD 周期的一半、则需要使用计时器。 将端口中断配置为在来自 ZCD 输入的上升中断上触发后、在中断触发时启动计时器并打开 TRIAC。 然后、当计时器中断在特定延迟后触发时、关闭 TRIAC 输出。 然后、重新开始等待下一个上升沿输入。

    这有道理吗? 也许我缺少一些东西。 请参阅下图、以说明我所描述的内容。 同样、我建议使用固定 DCO 频率。

    [引用 user="Alexander argollo"]我需要将 我的 MSP430G2452更改为 其他具有 DCO 且频率为16MHz 的 MSP430,例如 MSP430G2553,或者我可以将捕获模式和相关寄存器更改为另一个通道,如 TA0CCTL2?

    如果您的设计中有一个可以更改 MCU 的位置、我强烈建议您从 G2xx 切换到我们较新的 FRAM 器件。 具体而言、类似的 MSP430FR2311也是16MHz、具有两个计时器模块。 如果此器 件不适合您的应用、则在从 MSP430F2xx 和 MSP430G2xx 系列迁移到 MSP430FR4xx 和 MSP430FR2xx 系列应用手册的表1中有一个很好的比较表。

    从根本上说、您的方法不会改变、但本应用手册中将介绍一些细微的更改。 如第3.1节所述、FRAM 的一些优势包括其固有的非易失性存储器(因此即使在断电期间也能保留其内容)、写入前无需擦除、并且具有更长的写入寿命。

    此致、

    James

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

    你为我写了一个漂亮的技术文字!!!

    你会有疑问吗?
    实际上、我的 MCU G2452无法将 DCO 频率固定在16MHz、我需要使用 DCOCTL 寄存器对其进行校准。 我´m 对吗?

    在正极情况下、为了缩短上市时间并保留我的实际 Launchpad、我可以在不使用校准方法的情况下修复 DCO?

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

    我不知道您之前共享的代码对 DCO 执行的操作、但我想它是手动校准 DCO、而不是使用 DCOCTL 寄存器。 "固定频率"是指您可以将 DCO 配置为在启动后以固定频率运行。 您可以使用 MSP430G2553、它能够提供16MHz DCO 频率。 我可能不理解您在做什么、但如果它在没有振荡器故障的情况下工作、那么它应该是好的。

    此致、

    James
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我读取此代码时、每次程序启动时、都会重新计算 DCO 常量并将它们存储在闪存中。

    我不建议您每次启动程序时都执行此操作。 这些常数反映了制造变化、并且不会从一个运行到下一个运行发生显著变化。 这样做会过早(不必要)磨损闪存。

    相反、您应该执行一次并删除代码。 然后、在启动时、将常量从闪存复制到 DCOCTL/BCSCTL1 -这是您使用 TI CAL 值的方式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、我´ll 关闭这个帖子。 我成功地理解了 ZCD 方法!

    ´ll 需要、我会打开一个新的、以便更好地了解用于 PWM 波形的时钟和频率分频方法。

    感谢大家的帮助。

    BR、

    Alex