请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 默认值:中断; } }