打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
arduino 制作简易频率计

以下通过端口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);

}


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Arduino教程 Lesson 13:彩灯调光台
PS2手柄遥控Arduino小车
write()与print()一个写入,一个从串口输出
Arduino和非Arduino板串口通信教程
Arduino 语法
Arduino串口的使用——与计算机交流
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服