【问题标题】:Arduino wave generatorArduino波形发生器
【发布时间】:2018-04-16 02:37:45
【问题描述】:

我需要创建一个 Arduino Wave Generator,但我真的无法让它正常工作。

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

这是我的电路:

这是我正在使用的代码

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;
  }

}

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

如果有人能在这方面帮助我,那就太好了。

更新

在 Gerhard 的帮助下,这是我的最终电路和代码。

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;
  }

}

虽然不完美,但已经足够了哈哈。

【问题讨论】:

标签: arduino waveform trigonometry


【解决方案1】:

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

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

对于 PWM,您可以设置输出 pinMode(pin, OUTPUT),然后可以将 analogWrite(pin, value) 用于 0 - 255 范围内的值。

【讨论】:

  • 谢谢!我设法让它正常工作。我稍后会更新这个问题,以防将来有人需要它。
猜你喜欢
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 2011-11-16
  • 1970-01-01
相关资源
最近更新 更多