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.

[参考译文] MSP 低功耗微控制器论坛

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1480927/msp-low-power-microcontroller-forum

器件型号:MSP430FR2476

工具与软件:

您好!

我想使用计时器 A3.0作为 PWM 输出。 为此、我定义了以下内容:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void pwmTempLuefter(real outpwm) {
real vCCR0;
P4DIR |= BIT1;
P4SEL0 |= BIT1;
PM5CTL0 |=LOCKLPM5;
vCCR0 = 65500;
TA3CCR0 = (uint16)vCCR0;
TA3CCTL1 = OUTMOD_6; // CCR1 reset/set
TA3CCR1 = (uint16)(vCCR0*outpwm); // CCR1 PWM duty cycle
TA3CTL |= TASSEL__SMCLK | MC_3 | ID_3 | TACLR;// |TAIE;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

例如、TIMERB0上的 PWM 正常工作。 计时器 A3.0有何不同?

有人能在这里帮助我吗?

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

    "输出模式2、3、6和7对输出单元0来说是无用的、因为 EQUn = EQU0。"

    但是、虽然您配置的引脚用于 A3.0、但您配置的输出单元用于 A3.1。

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

    尊敬的 David:

    首先,非常感谢你的答复。
    您说我为3.1定义了 PWM。 不知怎么地、我无法在我的思维中看到错误。 它应该如何正确? 提前感谢。

    此致

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

    > TA3CCTL1 = OUTMOD_6;// CCR1复位/设置

    OUTMOD 是生成输出信号的源、按照编码、它在 TA3.1 (CCR1/CCTL1)(在 P4.0而非 P4.1上)上实现该功能。

    最简单的补救方法是切换到使用 P4.0 (P4DIR/P4SEL/接线)。  

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

    您好!

    这是否意味着、如果我写入 TA3CCTL0 = OUTMOD_6、则该值会在 TA3.0上输出?

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

    您将获得输出、但它不会很有趣(常量)。 正如 David 在《用户指南》中引用的(上述)所指出的那样、tax.0对于(可变) PWM 没有用处。 它可以生成50%的占空比(OUTMOD=4)、仅此而已。

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

    您好!

    Danke zunächst für ñ a Die Antwort. Dann sollte ich 也是一个 TA3.2 DIE PWM ausgeben。 ICH würde è s es Dann wie foldg umsetzen:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    void pwmTempLuefter(float outpwm) {
    float vCCR0;
    P3DIR |= BIT7;
    P3SELC |=BIT7;
    PMM_unlockLPM5();
    vCCR0 = 65500;
    TA3CCR1 = (uint16_t)vCCR0;
    TA3CCTL2 = OUTMOD_6; // CCR1 reset/set
    TA3CCR2 = (uint16_t)(vCCR0*outpwm); // CCR1 PWM duty cycle
    TA3CTL |= TASSEL__SMCLK | MC_3 | ID_3 | TACLR ;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    "怎么样?

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

    对不起她的英语,

    您好!

    感谢您的回答。 然后我应将 PWM 输出到 TA3.2。 然后、我将按以下方式执行:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    void pwmTempLuefter(float outpwm) {
    float vCCR0;
    P3DIR |= BIT7;
    P3SELC |=BIT7;
    PMM_unlockLPM5();
    vCCR0 = 65500;
    TA3CCR1 = (uint16_t)vCCR0;
    TA3CCTL2 = OUTMOD_6; // CCR1 reset/set
    TA3CCR2 = (uint16_t)(vCCR0*outpwm); // CCR1 PWM duty cycle
    TA3CTL |= TASSEL__SMCLK | MC_3 | ID_3 | TACLR ;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我是否理解正确?

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

    是的、这是一般想法。

    OUTMOD=6实际上是切换/置位、而不是复位/置位。 这两者是相同的、从第二个周期开始。

    ---

    未经请求:

    > P3SELC |=BIT7;

    我很确定这将在您希望 PSEL=01时设置 PSEL=11。 我建议您坚持:

    > P3SEL0 |=BIT7;

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

    早上好、

    感谢您发送编修。
    尽管进行了更改、但仍然没有获得适当的 PWM。 对于 MSP430FR2476 40引脚外壳、还有其他需要考虑的因素吗? (Re 映射或类似工具)。
    我现在还有另一个‘问题'端口3.0和3.3无法切换。 是否有任何限制? 例如、我已经看到、P3.0在开发底板上完全没有引出。

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

    您在 P3.7上看到了什么? [悬空? 卡在0? 卡在1?] 我建议您使用调试器["寄存器"视图]来查看 TA3CCR0和 TA3CCR2中实际上包含的内容。 P3.7是 TA3.2的未重新映射目标[参考数据表(SLASEO7C)表9-16]。 (我认为这就是你选择它的原因。)

    您如何切换 P3.0/.3? 您在引脚上看到了什么?

    未经请求:  

    > PMM_unlockLPM5();

    我建议您将其移至 main ()。 这并不是说这不起作用、而是对错误的邀请、因为在你调用此函数之前、你真的不能信任任何 GPIO、并且系统的所有其他部分都需要知道这一点。

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

    您好!

    首先、端口3.0/3.3按如下方式初始化:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <msp430.h>
    #include "driverlib.h"
    #include "global.h"
    vInitSystem(){
    WDT_A_hold(WDT_A_BASE);
    initClock();
    initGPIO();
    }
    void initClock(){
    CS_initClockSignal( CS_FLLREF, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
    CS_initClockSignal( CS_ACLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
    CS_initFLLParam param = {0};
    CS_initFLLCalculateTrim( CS_MCLK_DESIRED_FREQ_IN_KHZ, CS_MCLK_FLLREF_RATIO, &param );
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    主程序如下所示:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <msp430.h>
    #include "driverlib.h"
    #include "global.h"
    void main(){
    WDT_A_hold(WDT_A_BASE);
    initSystem();
    while(1){
    _NOP();
    TogglePort3();
    delay_ms(250);
    }
    }
    // ------------------------------------------------------------------------------------------
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    寄存器中也可以看到切换操作、但示波器上的线始终保持为高电平。 该引脚通过一个上拉电阻器进行连接。 它应该实际工作(就像它以前在其他项目中多次工作一样)。

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

    我没有看到您描述的在 Launchpad 上运行此代码的行为。  我的示波器在 P3.3上看到~2Hz 方波。

    我合并了两个片段,并编辑最少,以使它构建。 我在 P3.3上放置1K 到3.3V。  

    我不确定我们的做法有何不同。

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

    早上好、

    嗯、我想它可以是我的电路板。 我在项目中使用了许多其他功能(I2C、RS485等)。 这是一个非常复杂的项目,我可以想象有很多互动。 当然、我已经将我的示例写在一个单独的项目中、但电路保持不变。 我几乎不能想象任何其他东西。
    我要非常感谢你的支持。 很高兴能够与他人交流想法。 我祝愿你和在这里作出贡献的每个人都有一个美好的星期。