Robbie 发表于 2014-2-27 04:36:22

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

    因为要弄个比较特殊的频率发生器,而且要求实时显示输出状态, 第一时间就想到了arduino。 和朋友讨论后,朋友说很简单,然后写了一段程序,程序如下。


float ontime =100;
float bps =50;
float offtime =(1000000.0/bps)-ontime;
int time=0;
unsigned long currentMicros;
long previousMicros = 0;
int i=1;

void setup(){

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

void loop()

{
if(digitalRead(9)==LOW)
{
    if(ontime<750)
   {
   ontime=ontime+0.1;
   offtime =(1000000.0/bps)-ontime;
    }   
}

   if(digitalRead(8)==LOW)
{
    if(ontime>10)
   {
   ontime=ontime-0.1;
   offtime =(1000000.0/bps)-ontime;
    }
}

   if(digitalRead(10)==LOW)
{
    if(bps<1000)
   {
   bps=bps+0.05;
   offtime =(1000000.0/bps)-ontime;
    }
}

   if(digitalRead(11)==LOW)
{
    if(bps>10)
   {
   bps=bps-0.05;
   offtime =(1000000.0/bps)-ontime;
    }
}

currentMicros = micros();//read present time
time = currentMicros - previousMicros;

if(i==1)
{
if(time>ontime)
{
    previousMicros = currentMicros;//clean time difference
    time=0;
    turnoff();
    i=0;
    }
}

if(i==0)
{
if(time>offtime)
    {
      previousMicros = currentMicros;//clean time difference
      time=0;
      turnon();   
      i=1;   
    }   
}
}

void turnon()
{
digitalWrite(3,HIGH);
}

void turnoff()
{
digitalWrite(3,LOW);
}


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

但是还差显示呢。。。

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

然后,程序变成了这样。

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

const uint8_t L[] PROGMEM = {
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
};

void draw( )
{
u8g.drawStr(0,12,"Digital interrupter");
u8g.drawLine(0,20,76,20); u8g.drawLine(0,21,76,21);
u8g.drawLine(77,19,101,7); u8g.drawLine(77,20,101,8);
u8g.drawLine(102,7,127,7); u8g.drawLine(102,8,127,8);
u8g.drawStr(6,30,"bps:");
u8g.setPrintPos( 85, 30);
u8g.print(bps);
u8g.drawStr(6,45,"ontime:");
u8g.drawStr(118,45,"us");
u8g.setPrintPos( 85, 45);
u8g.print(ontime);
u8g.drawStr(6,60,"duty");
u8g.drawStr(28,60,"cycle:");
u8g.drawStr(118,60,"%");
u8g.setPrintPos( 85, 60);
u8g.print(duty);

}

void turnon()
{
digitalWrite(output,HIGH);
}
void turnoff()
{
digitalWrite(output,LOW);
}

void setup(){
pinMode(output,OUTPUT);//out put
pinMode(key_oadd,INPUT);// input +ontime
pinMode(key_osub,INPUT);// input -ontime
pinMode(key_badd,INPUT);// input +bps
pinMode(key_bsub,INPUT);// input -bps

   u8g.setFont(u8g_font_5x7);
    u8g.firstPage();
   do {
    u8g.drawBitmapP( 0, 0, 16, 64, L);
    }
   while( u8g.nextPage() );
   delay(5000);
}

void loop()
{
if(digitalRead(key_oadd)==LOW)
{
    if(ontime<750)
    {ontime=ontime+0.05;
   offtime =(1000000.0/bps)-ontime;
   duty =ontime/(1000000.0/bps)*100;//refresh
    }   
}

   if(digitalRead(key_osub)==LOW)
{
    if(ontime>10)
    {ontime=ontime-0.05;
   offtime =(1000000.0/bps)-ontime;
   duty =ontime/(1000000.0/bps)*100;//refresh
    }
}

   if(digitalRead(key_badd)==LOW)
{
    if(bps<1000)
    {bps=bps+0.05;
   offtime =(1000000.0/bps)-ontime;
   duty =ontime/(1000000.0/bps)*100;//refresh
    }
}

   if(digitalRead(key_bsub)==LOW)
{
    if(bps>10)
    {bps=bps-0.05;
   offtime =(1000000.0/bps)-ontime;
   duty =ontime/(1000000.0/bps)*100;//refresh
    }
}

currentMicros = micros();//read present time
time = currentMicros - previousMicros;

if(i==1)
{
if(time>ontime)
{
    previousMicros = currentMicros;//clean time difference
    time=0;
    turnoff();
    i=0;
    }
}

if(i==0)
{
if(time>offtime)
    {
      previousMicros = currentMicros;//clean time difference
      time=0;
      turnon();   
      i=1;   
    }   
}
if(hold==0)
   {
   u8g.firstPage( );
   do
   {
       draw( );
   }
   while( u8g.nextPage( ));
   }
}


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


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

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

hi55234 发表于 2014-2-27 12:39:40

u8g,俺心中的痛啊,这库加默认sd库是可以显示了,也能存储了,可是
~~~~

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

看楼主没用SD库,难道也是模拟口取值有问题~~~
页: [1]
查看完整版本: 【急求!!!】 一个arduino控制频率发生器的问题。