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.

[参考译文] CCS/MSP430G2553:PWM 代码不能降低 LED 的强度

Guru**** 2589245 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/626118/ccs-msp430g2553-pwm-code-doesn-t-lower-intensity-of-led

器件型号:MSP430G2553

工具/软件:Code Composer Studio

我尝试在 MSP430 launchand 上使用 PWM 来提高/降低红色 LED 的强度、但由于某种原因、我的代码不会使 LED 变化强度。 我想使用我的 Timea.c 更改 PWM 信号。 我可以看到、唯一可能导致问题的原因是 TACCR0和 TACCR1的值之间存在差异。 现在 、当 TACCR1 应该是另一种时、它大于 TACCR0。 有人能帮助解决这个问题

这是我的 timerA.c 文件

#include "LED.h"
#include "timerA.h"

void ConfigureTimerA (void)
{
TA0CTL =(MC0 | TACLR);
TA0CTL |=(tassel_2 |ID_2 | MC_1);
//将值分配给时间 A0;捕获/比较寄存器0
TA0CCR0 = TA0CC499


;TA0CCTL1 = TA0CC0
|启用 TA0CC0 | TA0CCTR1;TA0CC0 = TA0CCTR1
= TAIE;
}
无符号整型方向= 0;
#pragma vector = TIMER0_A0_VECTOR
// CCIFG0
的中断服务例程__INTERRUPT void Timer0_A0_routine (void)
{

//光源最小值
if (TACCR1 =0)
方向= 0;
//光最大值
否则、如果(TACCR0 == TACCR1)
方向= 1;
//在最小增加占空比时亮起
if (DIRECTION ==0)
TACCR1 --;
//最大减小占空比时的光
否则、如果(DIRECTION = 1)
TACCR1+;

}

#pragma vector = TIMER0_A1_vector
// CCIFG1和 TAIFG 的中断服务例程
__interrupt void Timer0_A1_routine (void)
{
switch (TAIV){
case TA0IV_NONE:
break;
case TA0IV_TACCR1:// CCIFG1中断
TO_OFF_LED1;
break;

case TA0IV_TAIFG:// TAIFG 中断
turn _ON_LED1;

break;
default:for (;);//不能}


这是我的主文件

#include 
#include "LED.h"
#include "button.h"
#include "timerA.h"

//全局变量
char LEDBit = LED1;

//函数原型
void ConfigureClockModule (void);

void main (void)
{
//停止看门狗计时器,并配置时钟模块。
WDTCTL = WDTPW + WDTHOLD;
ConfigureClockModule();

//初始化与 LED 关联的端口引脚,然后关闭 LED。
InitializeLEDPortPins();


//配置计时器 A 以生成所需的中断。
ConfigureTimerA();

enable_interrupts ();

//无限循环
while (1){

}
}
void TimeDelay (unsigned int delay、unsigned int resolution){
无符号 i;
TA0CTL =(MC_0 |TACLR);
TA0CCR0 =分辨率;
TA0CTL =(tassel_2|ID_2|MC_1);

对于(i=0;i 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为你对"方向"的定义(解释)是向后的。 当 TACCR1达到0时、您继续递减(至65535)而不是递增(高达1)。 尝试撤销决定:

    if (TACCR1 =0)
    方向= 1;
    否则、如果(TACCR0 == TACCR1)
    方向= 0;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢! 它发挥了作用
    您是否知道当光线强度增加时如何停止闪烁?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您谈论的是 LED 接近关闭时发生的"干扰":这是使用 PWM 时的一个一般问题
    占空比接近0%和/或100%。 它没有通用解决方案。 (我要提到:这就是 CLLD 的原因
    但 G2553没有 TimerB。)

    它与定时器(TA0R)和比较寄存器(CCR1)之间的竞争有关--如果 TA0R 已经计数过的话
    CCR1、它不会触发、相位会反转。 软件执行更新需要有限的时间、这是相关的
    时间窗口接近0%(或100%)。

    当使用软件 PWM (您的情况)时、CCR0/TAIFG/CR1中断的相对优先级会使这一问题变得更加复杂-
    您永远无法确定它们的发生顺序。

    我建议:
    1) 1)更新 CCR1 (而不是 CCR0)中断中的 CCR1、因为它始终"未命中"。 [这适用于硬件和
    软件 PWM。]
    2)对于软件 PWM:观察如果同时指示 TAIFG (ON)和 CCR1 (OFF)中断、则会对 LED 产生净影响
    为空。

    我刚开始键入、然后为 Timer0_A1_routine 输入了这个[可能有更巧妙的编码]:

    _interrupt void Timer0_A1_routine (void)
    {
    unsigned on、off;//(16位)
    关闭= TA0CTL 和 TAIFG;
    ON = TA0CCTL1 & CCIFG;
    IF (开和关)
    {
    //不执行任何操作
    TA0CTL &=~TAIFG;
    TA0CCTL1 &=~CCIFG;
    }
    否则(关闭)
    {
    TO_OFF_LED1;
    TA0CTL &=~TAIFG;
    }
    如果(开)则为其他
    {
    TON_LED1;
    TA0CCTL1 &=~CCIFG;
    }
    其他
    {
    // hh? 我们为什么会来这里?
    用于(;;);
    }
    IF (ON)// CCR1
    {
    //在最小增加占空比时亮起
    if (DIRECTION ==0)
    TACCR1 --;
    //最大减小占空比时的光
    否则、如果(DIRECTION = 1)
    TACCR1++;
    }
    }