为什么MSGEQ7 IC总是给出MAX输出?

问题描述 投票:0回答:1

我想使用 MSGEQ7 作为频谱分析仪。我正在使用 Arduino Uno 来控制 IC。

无论我是否将辅助引脚连接到输出,从 IC 接收到的读数始终为最大值。

我已经构建了与数据表中提供的完全相同的电路。为了方便起见,我为频谱分析仪 IC 制作了一个小 PCB。

My MSGEQ7 PCB

这是我构建的电路。看来电路没有错误。 有的话请告诉我。

与 Arduino Uno 的连接:-

我的PCB Arduino Uno **
VCC 5V
接地 接地
频闪 D3
重置 D5
输出 A5 *

(也尝试过频闪 -> 2,重置 -> 4)

实用:- VCC = 4V,GND = 0V,复位关闭 = 2.7V,选通打开 = 3.9V,选通关闭 = 0V

  1. 我发现的第一个问题是IC没有处于Power ON状态。 (用万用表检查)。当我将电容(C4)短接到 GND 时,IC 就得电了。 Arduino 提供 4.0V VCC,但这对 IC 来说很好。

  2. 我花了一段时间才意识到我的第二个错误。我仔细查看了数据表中给出的波形以读取输出。我没有使用数据表中提到的RESETSTROBE。 我检查了 Arduino Uno 生成的 STROBE 输出,它不同步。

Single Strobe Waveform

我正在检查串行打印的输出,波特率为 9600,这影响了 STROBE。

Gap between 7 segments

由于 Uno 只有 16Mhz 晶体,我无法为 RESET 产生 100 纳秒的延迟。 我已将其保持在 10 uSec。 STROBE 就像数据表中一样。 ON-->18 uSec,OFF-->54 uSec,因此完成 72 uSec 占空比。 (实际上延迟会长 2 或 3 微秒)

整个过程中,无论 Aux 连接如何,我在所有 7 个频段上的输出一直保持在 800 以上。 当我断开输出引脚和 A5 的连接时,输出降至 100 以下,但并未完全为零。有时它会变为零,但不是恒定的。

为了避免 STROBE 波形问题,我删除了印刷并仅添加了 7 个 LED。 当输出连接到 Arduino 时,所有 LED 都会打开并保持打开状态,只有在输出完全断开时它们才会关闭,即使其中一个或多个 LED 保持打开状态。

改变音量没有任何区别,播放和暂停也给出相同的输出。 我拿到了一张声卡,我可以在其中改变增益,但这并没有任何区别。

这是我正在使用的代码:-

int strobePin = 3;
int resetPin = 5;
int outPin = A5;
int OutputLevel[7];
int i = 0;
int j = 0;

void setup() 
{
    pinMode (strobePin, OUTPUT);
    pinMode (resetPin, OUTPUT);
    pinMode (outPin, INPUT);

    //Initial stage
    digitalWrite (resetPin, LOW);
    digitalWrite (strobePin, LOW);
    delay(100);

    //Start Both
    digitalWrite (resetPin, HIGH);
    digitalWrite (strobePin, HIGH);
    delayMicroseconds(10);
    //END RESET
    digitalWrite (resetPin, LOW);
    delayMicroseconds(8);

    digitalWrite (strobePin, LOW);
    delayMicroseconds(54);
    //After 18 uSec STROBE ON
    digitalWrite (strobePin, HIGH);
    delayMicroseconds(18);
    digitalWrite (strobePin, LOW);

}

void loop() 
{
  i = 0;
  j = 0;
    for(i = 0; i < 7; i++)
    {
        OutputLevel[i] = analogRead(outPin);
        delayMicroseconds(54);
        digitalWrite(strobePin, HIGH);
        delayMicroseconds(18);
        digitalWrite(strobePin, LOW);
        
    }

/*    for(j = 0; j < 7; j++)
    {
        //Controlling LEDs on OUTPUT LEVEL
    }
*/

}

  • 基本代码似乎对其他人有效,为什么我不断获得最大输出?

  • 我做错了什么?是电路有问题还是代码有问题?

  • 未连接 AUX 时,我不应该得到零吗?如果是,它应该保持为零直到我播放某些内容,还是当我将 AUX 连接到笔记本电脑或手机时它会立即改变吗?

  • 对于这个项目来说,Arduino Uno 是一个糟糕的选择吗?如果是的话,你会推荐什么?

我最好的猜测是这个问题可以用更简单的代码来解决。

我有一块 48Mhz 晶体,可以替换 Uno 上的晶体,会有什么不同吗? 我还有更多IC,所以我知道IC没有任何地方损坏。

c++ microcontroller arduino-uno spectrum
1个回答
1
投票

我不能保证以下代码能够工作,因为我没有 MSGEQ7 来测试它。但我想指出你错误地解释了时序图。

这是基于时序图的代码。

void readEQ7() {
  digitalWrite(resetPin, HIGH); // generate reset pulse
  digitalWrite(resetPin, LOW);
  delayMicroseconds(75);        // delay for meeting trs requirement

  for (int i=0; i<7; i++) {
    digitalWrite(strobePin, low); 
    delayMicroseconds(36);      // minimum to (output setting) time

    OutputLevel[i] = analogRead(outPin);

    digitalWrite(strobePin, HIGH);
    delayMicroseconds(36);     // wait for next tss (strobe-to-strobe)
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.