以下通过端口5输出PWM信号,用D2口进行检测。测试发现,
利用analogWrite(pin,val)输出pwm信号时,
当val=0,f=0hz,当val=100,f=980hz t=1.02ms,当val=25,f=980hz,t=1.02ms
占空比=val/255 *100%
本次实验没有输入信号时,f=50hz,t=20ms
调用analogWrite()函数后, 对应的针脚会输出一个稳定的,指定占空比的方波.(在这个针脚下一次调用analogWrite() ,
或者调用digitalRead()或者 digitalWrite(),针脚的输出会改变为相应的函数执行), PWM信号的频率近乎于490Hz.
测试效果如图:
int divider[6]={0,1,8,64,256,1024};
int prescaler = 5;
double count =0;
double middle = 0;
char x = 0;
ISR(TIMER_OVER_vect)
{
if(prescaler<4)
{
prescaler++;
}
}
void interrupt()
{
if(!x)
{
count = TCNT1;
TCNT1 = 0X000;
TCCR1B = prescaler;
attachInterrupt(0,interrupt,FALLING);
}
else
{
middle =TCNT1;
attachInterrupt(0,interrupt,RISING);
}
x= ~x;
}
void setup()
{
Serial.begin(9600);
TIMSK1 = 0x01;
TCCR1A =0x00;
attachInterrupt(0,interrupt,RISING);
analogWrite(5,75);
}
void loop()
{
Serial.print("Freq: ");
Serial.print(16000000.0/divider[prescaler]/count);
Serial.print(" HZ\t\tDuty: " );
Serial.print(middle/count*100);
Serial.print(" %\t\tlperiod: ");
Serial.print(0.0000625*divider[prescaler]*count);
Serial.print(" ms\t\tH-time: ");
Serial.print(0.0000625*divider[prescaler]*middle);
Serial.print(" ms\t\tL-time: ");
Serial.print(0.0000625 * divider[prescaler]*(count - middle));
Serial.println(" ms");
if(prescaler>1)
{
prescaler--;
delay(255);
}
delay(1000);
}
联系客服