Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino波发生器_Arduino_Waveform_Trigonometry - Fatal编程技术网

Arduino波发生器

Arduino波发生器,arduino,waveform,trigonometry,Arduino,Waveform,Trigonometry,我需要创建一个Arduino波形发生器,但我真的不能让它正常工作 发电机必须输出正弦波、方波、三角波和锯齿波,我让方波正常工作,我尝试了很多方法,但无法让其他方法正常工作 这是我的电路图: 这是我正在使用的代码 int led1 = 3; int led2 = 4; int led3 = 5; int led4 = 6; int display = 13; int inBtn = 8; int btnSt = 0; int btnLastSt = 0; int cont = 0; voi

我需要创建一个Arduino波形发生器,但我真的不能让它正常工作

发电机必须输出正弦波、方波、三角波和锯齿波,我让方波正常工作,我尝试了很多方法,但无法让其他方法正常工作

这是我的电路图:

这是我正在使用的代码

int led1 = 3;
int led2 = 4;
int led3 = 5;
int led4 = 6;
int display = 13;

int inBtn = 8;
int btnSt = 0;
int btnLastSt = 0;

int cont = 0;

void setup() {

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(display, OUTPUT);

  pinMode(inBtn, INPUT);

}

void loop() {
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  switch(cont){
      case 0:
            digitalWrite(led1, HIGH);    
            digitalWrite(display, HIGH);
            delay(250);
            digitalWrite(display, LOW);
            delay(250);
            break;
      case 1:
            digitalWrite(led2, HIGH);
            break;
      case 2:
            digitalWrite(led3, HIGH);
            break;
      case 3:
            digitalWrite(led4, HIGH);
            break;
  }  
  if (digitalRead(inBtn) == LOW) {
    cont++;
    delay(150);
  }
  if (cont == 4) cont = 0;

  if (btnLastSt != cont){
    btnLastSt = cont;
  }

}
其他波将进入其他“案例”中。 我很抱歉缺乏信息和研究,但在这一点上,我非常绝望(这是一项任务)

如果有人能帮我一点忙,那就太好了

更新

在格哈德的帮助下,这是我最后的电路和代码。

int-led1=3;
int-led2=4;
int-led3=5;
int-led4=6;
int显示=11;
int inBtn=8;
int btnSt=0;
int btnLastSt=0;
int cont=0;
无效设置(){
引脚模式(led1,输出);
引脚模式(led2,输出);
引脚模式(led3,输出);
引脚模式(led4,输出);
pinMode(显示、输出);
pinMode(inBtn,输入);
}
void循环(){
数字写入(led1,低电平);
数字写入(led2,低电平);
数字写入(led3,低电平);
数字写入(led4,低电平);
开关(续){
案例0:
//方格
数字写入(led1,高);
数字写入(显示,高);
延迟(200);
数字写入(显示,低电平);
延迟(200);
打破
案例1:
//锯齿形
数字写入(led2,高);
对于(int i=0;i<255;i++){
模拟写入(显示,i);
延迟(1);
}
模拟写入(显示,0);
延迟(1);
打破
案例2:
//三角形
数字写入(led3,高);
对于(int i=0;i<254;i++){
模拟写入(显示,i);
延迟(1);
}
对于(int i2=254;i2>0;i2--){
模拟写入(显示,i2);
延迟(1);
}
打破
案例3:
//正弦
数字写入(led4,高);
模拟写入(显示,10);延迟(10);
模拟写入(显示,19);延迟(10);
模拟写入(显示,45);延迟(10);
模拟写入(显示,84);延迟(10);
模拟写入(显示器,130);延迟(10);
模拟写入(显示,176);延迟(10);
模拟写入(显示,215);延迟(10);
模拟写入(显示器,241);延迟(10);
模拟写入(显示器,250);延迟(10);
模拟写入(显示器,241);延迟(10);
模拟写入(显示,215);延迟(10);
模拟写入(显示,176);延迟(10);
模拟写入(显示器,130);延迟(10);
模拟写入(显示,84);延迟(10);
模拟写入(显示,45);延迟(10);
模拟写入(显示,19);延迟(10);
打破
}  
如果(数字读取(inBtn)=低){
cont++;
延迟(100);
}
如果(cont==4)cont=0;
如果(btnLastSt!=续){
btnLastSt=续;
}
}

它并不完美,但已经足够好了,哈哈。

您的硬件设置不足以实现您想要的目标

您需要模拟输出,但使用的是数字输出。您必须添加DAC(数模转换器)()或使用PWM(脉宽调制)输出(引脚3,5,6,9-11)。这两种情况都需要在输出端增加一个LPF(低通滤波器)


对于PWM,您可以设置输出
pinMode(pin,output)
,然后可以使用
analogWrite(pin,value)
,数值范围为0-255。

这里有一些关于DAC的信息,谢谢!我设法使它正常工作。稍后我会更新这个问题,以防将来有人需要它。
int led1 = 3;
int led2 = 4;
int led3 = 5;
int led4 = 6;
int display = 11;

int inBtn = 8;
int btnSt = 0;
int btnLastSt = 0;

int cont = 0;

void setup() {

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(display, OUTPUT);

  pinMode(inBtn, INPUT);

}

void loop() {
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  switch(cont){
      case 0:
            //Square
            digitalWrite(led1, HIGH);    
            digitalWrite(display, HIGH);
            delay(200);
            digitalWrite(display, LOW);
            delay(200);
            break;
      case 1:
            //Sawtooth
            digitalWrite(led2, HIGH);
            for(int i = 0; i < 255; i++){
                analogWrite(display, i);
                delay(1);   
            }
            analogWrite(display, 0);
            delay(1);
            break;
    case 2:
            //Triangular
            digitalWrite(led3, HIGH);
            for (int i = 0; i < 254; i++){
                analogWrite(display, i);
                delay(1);
            }
            for (int i2 = 254; i2 > 0; i2--){
                analogWrite(display, i2);
                delay(1); 
            }

           break;
      case 3:
            //Sine
            digitalWrite(led4, HIGH);
            analogWrite(display, 10); delay(10);
            analogWrite(display, 19); delay(10);
            analogWrite(display, 45); delay(10);
            analogWrite(display, 84); delay(10);
            analogWrite(display, 130); delay(10);
            analogWrite(display, 176); delay(10);
            analogWrite(display, 215); delay(10);
            analogWrite(display, 241); delay(10);
            analogWrite(display, 250); delay(10);
            analogWrite(display, 241); delay(10);
            analogWrite(display, 215); delay(10);
            analogWrite(display, 176); delay(10);
            analogWrite(display, 130); delay(10);
            analogWrite(display, 84); delay(10);
            analogWrite(display, 45); delay(10);
            analogWrite(display, 19); delay(10);
            break;
  }  
  if (digitalRead(inBtn) == LOW) {
    cont++;
    delay(100);
  }
  if (cont == 4) cont = 0;

  if (btnLastSt != cont){
    btnLastSt = cont;
  }

}