极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9030|回复: 1

【急求!!!】 一个arduino控制频率发生器的问题。

[复制链接]
发表于 2014-2-27 04:36:22 | 显示全部楼层 |阅读模式
    因为要弄个比较特殊的频率发生器,而且要求实时显示输出状态, 第一时间就想到了arduino。 和朋友讨论后,朋友说很简单,  然后写了一段程序,程序如下。


  1. float ontime =100;
  2. float bps =50;
  3. float offtime =(1000000.0/bps)-ontime;
  4. int time=0;
  5. unsigned long currentMicros;
  6. long previousMicros = 0;
  7. int i=1;

  8. void setup(){

  9.   pinMode(3,OUTPUT);//out put
  10.   pinMode(9,INPUT);// input +ontime
  11.   pinMode(8,INPUT);// input -ontime
  12.   pinMode(10,INPUT);// input +bps
  13.   pinMode(11,INPUT);// input -bps
  14. }

  15. void loop()

  16. {
  17.   if(digitalRead(9)==LOW)
  18. {
  19.     if(ontime<750)
  20.    {
  21.      ontime=ontime+0.1;
  22.      offtime =(1000000.0/bps)-ontime;
  23.     }   
  24.   }
  25.   
  26.    if(digitalRead(8)==LOW)
  27.   {
  28.     if(ontime>10)
  29.    {
  30.      ontime=ontime-0.1;
  31.      offtime =(1000000.0/bps)-ontime;
  32.     }
  33.   }
  34.   
  35.    if(digitalRead(10)==LOW)
  36.   {
  37.     if(bps<1000)
  38.    {
  39.      bps=bps+0.05;
  40.      offtime =(1000000.0/bps)-ontime;
  41.     }
  42.   }
  43.   
  44.    if(digitalRead(11)==LOW)
  45.   {
  46.     if(bps>10)
  47.    {
  48.      bps=bps-0.05;
  49.      offtime =(1000000.0/bps)-ontime;
  50.     }
  51.   }
  52.   
  53.   currentMicros = micros();//read present time
  54.   time = currentMicros - previousMicros;
  55.   
  56.   if(i==1)
  57.   {
  58.   if(time>ontime)
  59.   {
  60.     previousMicros = currentMicros;//clean time difference
  61.     time=0;
  62.     turnoff();
  63.     i=0;
  64.     }
  65.   }
  66.   
  67. if(i==0)
  68. {
  69. if(time>offtime)
  70.     {
  71.       previousMicros = currentMicros;//clean time difference
  72.       time=0;
  73.       turnon();   
  74.       i=1;   
  75.     }   
  76. }
  77. }

  78. void turnon()
  79. {
  80.   digitalWrite(3,HIGH);
  81. }

  82. void turnoff()
  83. {
  84.   digitalWrite(3,LOW);
  85. }
复制代码



烧上去,的确能用了。 输出达到要求。

但是还差显示呢。。。

我自己弄了U8G的库 , 然后写好开机画面, 显示的内容。

然后,程序变成了这样。

  1. #include <U8glib.h>
  2. U8GLIB_ST7920_128X64_4X u8g(A0, 13, 12);
  3. int hold=0;
  4. float ontime =100;
  5. float bps =10;
  6. float offtime =(1000000.0/bps)-ontime;
  7. float duty =ontime/(1000000.0/bps)*100;
  8. int time=0;
  9. unsigned long currentMicros;
  10. long previousMicros = 0;
  11. int i=1;
  12. int output=3;
  13. int key_oadd=9;
  14. int key_osub=8;
  15. int key_badd=10;
  16. int key_bsub=11;

  17. const uint8_t L[] PROGMEM = {
  18. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  19. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  20. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  21. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  22. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  23. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  24. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  25. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  26. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  27. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xF4,0x71,0x74,0x22,0x18,0x83,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x45,0xEF,0x75,0xF6,0xD3,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x44,0x4F,0x75,0xF6,0x99,0xEF,0xFF,0xFF,0xFF,
  28. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x45,0xCF,0x04,0x76,0x3C,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x45,0xEF,0x75,0xF6,0x9E,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x44,0x71,0x75,0xE2,0xD8,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  29. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  30. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x12,0x00,0x87,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,
  31. 0x44,0x00,0x02,0x00,0x82,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x42,0x47,0x97,0xB8,0x82,0x59,0xE6,0x2A,0xA2,0x59,0xC6,0x28,0x00,0x00,0x00,0x00,0x42,0x48,0x92,0x04,0x82,0x64,0x89,0x33,0x22,0x64,0x89,0x30,0x00,0x00,0x00,0x00,0x42,0x48,0x92,0x1C,0x82,0x44,0x8F,0x22,0x22,0x44,0x8F,0x20,0x00,0x00,0x00,0x00,
  32. 0x42,0x48,0x92,0x24,0x82,0x44,0x88,0x22,0x22,0x44,0x88,0x20,0x00,0x00,0x00,0x00,0x44,0x49,0x92,0x24,0x82,0x44,0x88,0x22,0x26,0x44,0x88,0x20,0x00,0x00,0x00,0x00,0x78,0x46,0x91,0x9C,0x87,0x44,0x67,0x22,0x1A,0x78,0x67,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
  33. 0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  34. };

  35. void draw( )  
  36. {
  37. u8g.drawStr(0,12,"Digital interrupter");
  38. u8g.drawLine(0,20,76,20); u8g.drawLine(0,21,76,21);
  39. u8g.drawLine(77,19,101,7); u8g.drawLine(77,20,101,8);
  40. u8g.drawLine(102,7,127,7); u8g.drawLine(102,8,127,8);
  41. u8g.drawStr(6,30,"bps:");
  42. u8g.setPrintPos( 85, 30);
  43. u8g.print(bps);
  44. u8g.drawStr(6,45,"ontime:");
  45. u8g.drawStr(118,45,"us");
  46. u8g.setPrintPos( 85, 45);
  47. u8g.print(ontime);
  48. u8g.drawStr(6,60,"duty");
  49. u8g.drawStr(28,60,"cycle:");
  50. u8g.drawStr(118,60,"%");
  51. u8g.setPrintPos( 85, 60);
  52. u8g.print(duty);

  53. }

  54. void turnon()
  55. {
  56.   digitalWrite(output,HIGH);
  57. }
  58. void turnoff()
  59. {
  60.   digitalWrite(output,LOW);
  61. }

  62. void setup(){
  63.   pinMode(output,OUTPUT);//out put
  64.   pinMode(key_oadd,INPUT);// input +ontime
  65.   pinMode(key_osub,INPUT);// input -ontime
  66.   pinMode(key_badd,INPUT);// input +bps
  67.   pinMode(key_bsub,INPUT);// input -bps

  68.    u8g.setFont(u8g_font_5x7);
  69.     u8g.firstPage();  
  70.    do {
  71.     u8g.drawBitmapP( 0, 0, 16, 64, L);
  72.     }
  73.    while( u8g.nextPage() );
  74.    delay(5000);
  75. }

  76. void loop()
  77. {
  78.   if(digitalRead(key_oadd)==LOW)
  79.   {
  80.     if(ontime<750)
  81.     {ontime=ontime+0.05;
  82.    offtime =(1000000.0/bps)-ontime;
  83.    duty =ontime/(1000000.0/bps)*100;//refresh
  84.     }   
  85.   }
  86.   
  87.    if(digitalRead(key_osub)==LOW)
  88.   {
  89.     if(ontime>10)
  90.     {ontime=ontime-0.05;
  91.    offtime =(1000000.0/bps)-ontime;
  92.    duty =ontime/(1000000.0/bps)*100;//refresh
  93.     }
  94.   }
  95.   
  96.    if(digitalRead(key_badd)==LOW)
  97.   {
  98.     if(bps<1000)
  99.     {bps=bps+0.05;
  100.    offtime =(1000000.0/bps)-ontime;
  101.    duty =ontime/(1000000.0/bps)*100;//refresh
  102.     }
  103.   }
  104.   
  105.    if(digitalRead(key_bsub)==LOW)
  106.   {
  107.     if(bps>10)
  108.     {bps=bps-0.05;
  109.    offtime =(1000000.0/bps)-ontime;
  110.    duty =ontime/(1000000.0/bps)*100;//refresh
  111.     }
  112.   }
  113.   
  114.   currentMicros = micros();//read present time
  115.   time = currentMicros - previousMicros;
  116.   
  117.   if(i==1)
  118.   {
  119.   if(time>ontime)
  120.   {
  121.     previousMicros = currentMicros;//clean time difference
  122.     time=0;
  123.     turnoff();
  124.     i=0;
  125.     }
  126.   }
  127.   
  128. if(i==0)
  129. {
  130. if(time>offtime)
  131.     {
  132.       previousMicros = currentMicros;//clean time difference
  133.       time=0;
  134.       turnon();   
  135.       i=1;   
  136.     }   
  137. }
  138. if(hold==0)
  139.    {
  140.      u8g.firstPage( );  
  141.      do
  142.      {
  143.        draw( );
  144.      }
  145.      while( u8g.nextPage( ));
  146.    }  
  147. }
复制代码



然后,做出来效果是这样,


虽然显示是正常了,可是输出完全不是这么一回事(无输出? 或者各种奇怪的输出。。。)。。。   
朋友说是要加上中断了,不然12864的刷新会影响输出。。。

大神求救\("▔□▔)/!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-2-27 12:39:40 | 显示全部楼层
u8g,俺心中的痛啊,这库加默认sd库是可以显示了,也能存储了,可是
~~~~

模拟口读取的值就走样了~~~~

看楼主没用SD库,难道也是模拟口取值有问题~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 20:17 , Processed in 0.059257 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表