我想创建一个PWM信号。我希望频率接近38千赫兹。我对周期的理论计算是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
您无法根据C或C ++代码计算周期。您需要检查在编译程序期间生成的程序集文件。基于您的编译器(您没有提到),您可以传递一些编译器参数/开关,要求编译器保留生成的汇编文件,以便您检查生成的汇编指令。但基本上for循环会有一个跳转指令,可能需要2/3个周期而你没有计算。
我建议您稍后检查微控制器数据表中每条指令的周期数。
发布的代码(根据您的计算)每隔~7个周期切换一次输出。这次是692次。总共346个循环,但总脉冲开启时间仅为~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%。这是你想要的吗?