我不明白如何设置PWM信号的周期

时间:2019-04-25 21:53:41

标签: c msp430 pwm

我想创建一个PWM信号。我希望频率接近38 kHz。我对周期的理论计算是26.3微秒。所以我选择26微秒。而且我可以观察到我的信号。

但是我不明白我的代码如何正常工作:)

(我的时钟频率是1MHz,所以我的时钟信号是1微秒)

if((P1IN & BIT3)!=BIT3)  { // if button is pressed

for(i=0;i<692;i++){   // pwm signal's duration is 9ms
P2OUT^=0x01;       // switch from 1 to 0 or vice versa
__delay_cycles(4);   
}
P2OUT=0x00;
}

我的计算是:

i <692,i ++,P2OUT ^ = 0x01; //共3个周期

__ delay_cycles(4); //总共4个周期

所以4 + 3 = 7。但是我很困惑,因为我认为应该是13而不是7

(这是我的信号) https://e2e.ti.com/cfs-file/__key/communityserver-discussions-components-files/166/f0fd36b0_2D00_bebd_2D00_4a31_2D00_b564_2D00_98962cf4749e-_2800_1_2900_.jpg

2 个答案:

答案 0 :(得分:1)

您不能基于C或C ++代码计算周期。您需要检查在程序编译过程中生成的汇编文件。根据您的编译器(您没有提到),您可以传递一些编译器参数/开关,以要求编译器将生成的汇编文件保留在原位,以供您检查生成的汇编指令。但基本上for循环会有一条跳转指令,该指令可能需要2/3个周期,而您没有计算出该值。

我建议您稍后从微控制器数据表中检查每条指令的周期数。

答案 1 :(得分:0)

发布的代码(根据您的计算)每7个周期切换一次输出。并做了692次。总共346个总周期,但是总脉冲ON时间仅为〜7个周期。建议:

if((P1IN & BIT3)!=BIT3)  
{ // if button is pressed
    // start pwm signal
    P2OUT = 0x01;

    for(int i=0; i< (9*1000);i++) // may need to be adjusted   
    {                  // so pwm signal's duration is 9ms
        _delay( 1 ); 
    }

    // stop pwm signal
    P2OUT=0x00;

    // wait for button to be released
    while( P1IN & BIT3)!=BIT3 ){;}
}

我不熟悉您的微控制器的PWM详细信息,但是,大多数微控制器都有一个初始化功能来设置PWM计时器的计数速度及其开始/终止计数,以及是否重复以及输出是方波还是递升。或降压信号以及ON.vs.OFF时间的百分比。

但是,发布的代码表明PWM只是常规的GPIO位。

发布的代码表明PWM开启百分比为50%。这就是你想要的吗?