但是我不明白我的代码如何正常工作:)
(我的时钟频率是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
答案 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%。这就是你想要的吗?