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:MSP430G2553

Guru**** 2587365 points
Other Parts Discussed in Thread: MSP430G2553

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

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

器件型号:MSP430G2553

工具/软件:Code Composer Studio

我是 MSP430G2553的初学者、我必须生成载波频率(三角形)为2.5kHz 的 SPWM、调制频率为50Hz (正弦)、调制指数为0.9、我尝试通过在 CCSV5中编写以下代码(如下所示)来生成 SPWM 但是、它没有为我提供所需的输出。 有人能不能帮助我弄清楚这一点。

#include

#define pwmPeriod 400//载波2.5kHz、基准50Hz。 PWM 周期为0.4ms。


const unsigned int phalfcycle[25]={764,787,809,830,871,887,900,911,921,927,930,927,9921,911,900,887,871,830,809,787,764};
unsigned int pulsecounterA0 = 0;
unsigned int pulsecounterA1 = 0;

void main (void)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT

//Calibrate DCO for 1MHz operation
BCSCTL1 = CALBC1_1MHz;
DCOCTL = CALDCO_1MHz;

P1OUT &= 0x00;//将所有引脚设置为低电平
P2OUT &= 0x00;

P1DIR |= BIT2 + BIT6;// PWM 输出
P2DIR |= BIT1 + BIT2;

P1SEL |= BIT2;
P2SEL |= BIT1;

TACCR0 = pwmPeriod - 1;//将 PWM 周期设置为0.4ms、SMCLK 的400-1个时钟周期
TA1CCR0 = pwmPeriod - 1;

TACCTL0 = CCIE;//为 CCR0启用计时器 A0中断
TA1CCTL0 = CCIE;

TACCTL1 = OUTMOD_2;//针对计时器 A0 CCR1复位/置位
TA1CCTL1 = OUTMOD_6;


TACTL = tassel_2 + MC_1 + TACLR;// Timer_A0控制寄存器、SMCLK = 1MHz、上行模式。 启动计时器
TA1CTL = tassel_2 + MC_1 + TACLR;

_BIS_SR (LPM0_Bits + GIE);//输入 LPM0、带中断

//计时器 A0中断服务例程
//#pragma 是一个包罗万象的预处理器指令、用于扩展预定义指令尚未涵盖的编译器的功能。
//在此代码中,编译器(和链接器)被告知我们将为 TIMER0_A0_VECTOR 创建 ISR。
#pragma vector=TIMER0_A0_VECTOR
_interrupt void Timer_A0 (void)

//TACCTL1 = OUTMOD_7;

IF (pulsecounterA0 < 25)

TACCR1 = phalfcycle[pulsecounterA0];
pulsecounterA0 = pulsecounterA0 + 1;

其他

P1SEL ^=(BIT2 + BIT6);
pulsecounterA0 = 0;


//计时器 A1中断服务例程
//#pragma 是一个包罗万象的预处理器指令、用于扩展预定义指令尚未涵盖的编译器的功能。
//在此代码中,编译器(和链接器)被告知我们将为 Timer1_A0_vector 创建 ISR。
#pragma vector=Timer1_A0_vector
_interrupt void Timer_A1 (void)

IF (pulsecounterA1 < 25)

TA1CCR1 = phalfcycle[pulsecounterA1];
pulsecounterA1 = pulsecounterA1 + 1;

其他

P2SEL ^=(BIT1 + BIT2);
pulsecounterA1 = 0;

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

    phalfcycle[]中的所有值都大于 pwmPeriod。 当 TAxR 等于 CCRn 时、PWM 机制会执行某种操作、这种情况永远不会发生。

    此外、我不太清楚为什么您在 ISR 中 fiddling PxSEL、但我将其留给您。