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.

[参考译文] MSP430F2619:MSP430F2619:测量占空比

Guru**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/799036/msp430f2619-msp430f2619-measure-duty-cycle

器件型号:MSP430F2619

我使用此代码来读取 PWM 的占空比。

将引脚 P4.1连接到 P1.2后、如果占空比为50%、则 P1.0上的 LED 将亮起、但这种情况从未发生。

PWM 工作正常、我使用示波器进行测试

请帮助。

#include 
unsigned char Count、first_time;
unsigned int REdge1、REdge2、FEdge;

int main (void)
{
unsigned int period、ON_PERIOD;
unsigned char DutyCycle;
WDTCTL = WDTPW + WDTHOLD; //停止 WDT

P1DIR |= BIT0; // P1.0/LED 输出
P1OUT &=~BIT0; // LED 关闭

//
if (CALBC1_8MHZ=0xFF)//如果校准常数被擦除
{
while (1); //不加载,陷阱 CPU!!
}
DCOCTL = 0; //选择最低 DCOx 和 MODx 设置
BCSCTL1 = CALBC1_8MHZ; //将 DCO 设置为8MHz
DCOCTL = CALDCO_8MHZ;
*/
P4DIR |= BIT1; // P4.1输出
P4SEL |= BIT1; // P4.1 TBX 选项

P1DIR &=~BIT2; // P1.2/TA1输入捕捉
P1SEL |= BIT2; // TA1选项选择


TBCCR0 = 128; // PWM 周期
TBCCTL1 = OUTMOD_6; // CCR1复位/设置
TBCCR1 = 64; // CCR1 PWM 占空比

TBCTL = TBSSEL_2 + MC_3; // ACLK、向上计数模式


TACCTL1 = CAP + CM_3 + CCIE + SCS + CCIS_0;
// TA0CCR1捕捉模式;CCI1A;两者
//上升沿和下降沿;中断使能
TACTL |= tassel_2 + MC_2 + TACLR; // SMCLK、控制模式;启动计时器

计数= 0x0;
FIRST_TIME = 0x01;

while (1)
{
_bis_SR_register (LPM0_bits + GIE);//输入 LPM0
__no_operation(); //用于调试器
//退出 LPM0
// IF (TACCTL1和 COV) //检查捕捉溢出
// while (1); //永久循环

周期= REdge2 - REdge1; //计算周期
ON_PERIOD = Fedge-REdge1; //打开期间
DutyCycle =((unsigned long) ON_PERIOD* 100/周期);
if (DutyCycle!= 50)
{

P1OUT &=~BIT0;
}
其他
{

P1OUT |= BIT0;
}
}






/********* //
TA0_A1中断矢量
#pragma vector = TIMER0_A1_vector
__interrupt void TIMER0_A1_ISR (void)
{

switch (__evo_in_range (TAIV、0x0A)
){
案例 TAIV_NONE:

中断; //向量0:无中断
案例 TAIV_TACCR1: //向量2:TACCR1 CCIFG
// P1OUT |= BIT0;
IF (TACCTL1和 CCI) //捕捉输入引脚状态
{
//捕获上升沿
如果(!Count)
{

REdge1 = TACCR1;
count++;
}
其他
{
REdge2 = TACCR1;
计数= 0x0;
__BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE);//返回 main 时退出 LPM0
}

IF (FIRST_TIME)
first_time = 0x0;
}
其他
{
//捕获下降沿
if (!first_time)
{
// P1OUT |= BIT0;
FEdge = TACCR1;
}
}
中断;
案例 TAIV_TACCR2:break; //向量4:TACCR2 CCIFG
案例 TAIV_6:中断; //向量6:保留 CCIFG
案例 TAIV_8:中断; //向量8:保留 CCIFG
案例 TAIV_TAIFG:中断; //向量10:TAIFG
默认值:中断;
}
}

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

    >IF (DutyCycle!= 50)
    这容易受到舍入/截断错误的影响。 尝试:
    > if (DutyCycle < 49 || DutyCycle > 51)//不是50%(或多或少)?
    ------------------
    > TBCCR0 = 128;// PWM 周期
    更具体地说:我认为您获得的是 DutyCycle = 49。 尝试:
    >TBCCR0 = 128-1;// PWM 周期

    ------------------  

    未经请求的:128个 CPU (MCLK=SMCLK)时钟来执行这种大量计算并不是很重要。 注意超支情况。

    [编辑:我第一次有反向测试的感觉]

    [编辑:添加了有关 CPU 周期的注释。]