微控制器适用于面包板上,但不适用于 PCB(已被证明是正确的)

电器工程 微控制器 引领 电路板 面包板 服装
2022-01-20 22:38:10

摘要:我有两个电路:一个在电路板上,一个在 PCB 上。我有两个微控制器:一个商业微控制器(预编程)和一个个人微控制器(我尝试用它们重新创建商业微控制器)。商业 uC 在两种电路中都可以使用,而我重新创建的 uC 仅在面包板上工作。我不明白如何一个人可以同时工作而另一个人不能。

语境

免责声明:原理图、图像、代码等所有资源都可以在下面找到。我试图尽可能彻底地回答这个问题。

我买了一个简单的电子骰子电路,只需按一下按钮即可“滚动”骰子。这使用 LED 和 uC 来完成并预先编程(见下图)。按下按钮时,LED 将闪烁,松开时,滚动的数字将保持 3 秒,直到 LED 熄灭。这非常简单,仅由 LED、电阻器、电池、按钮和 Atmel 的 ATTiny13 uC 组成。

我的目标是自己重新创建 uC 的编程并最终自己构建类似的电路(从小处开始,对吗?)。

现在,我有了商业版的原理图(见下面的第一张图片),并在我的面包板上重建了它(见下面的第二张图片)。我通过从商业版本中取出 ATTiny13 验证了这个电路(由于有插座,它是可拆卸的)并将其放入我自制的电路中。一切都完美无缺。

然后我开始编写我自己的第一个ATTiny13。我做了一些简单的 LED 闪烁测试,然后从网站上尝试了一个骰子脚本来测试它(见下面的代码)。所有这些在我的面包板上都很好用。掷骰子也会很好用。

此刻,我将它放入商业 PCB(具有相同的原理图),没有任何效果。闪烁脚本或骰子脚本都不会导致任何 LED 闪烁。按下按钮不会改变任何东西。

我想到了很多事情,这可能是一个问题,但归结为一点:“当 PCB 和面包板上的电路确实是相同的原理图并且相似时,在一个上工作的 uC 应该在其他。” 这对商业来说是正确的,但对我来说却不是。我对此感到非常困惑,我有限的电子知识现在正在赶上我。也许PCB的行为毕竟不同?我彻底检查了两个电路,它们似乎与原理图完全一样。

对于正确方向的任何帮助或提示,我感到非常高兴。目前我什至不知道要注意什么。我想我可能会在这里监督一些基本的事情。

感谢您抽出宝贵时间阅读和回复,非常感谢!

资源

基本信息

R1 - 5.6k 欧姆
R2 - 10k 欧姆
R3 R4 R6 - 15 欧姆
R5 - 120 欧姆

Vcc为三节1.5V电池(4.5V)

微控制器:ATTiny13 数据表

对于编程,我使用 Arduino IDE 和 Arduino Nano 作为 ISP(我遵循了本指南)。我使用以下设置对 ATTiny 进行编程(尽管我对这些设置的含义几乎一无所知):

BOD: 4.3V
EEPROM:保留 EEPROM
时钟: 1.2 MHz,内部 osc。
时间:禁用微型

电路原理图

电路原理图

面包板电路

面包板电路

PCB电路

PCB电路

代码

/* 
 *  The LEDs are arranged like this
 *  
 *  LED3      LED6
 *  LED2 LED7 LED5
 *  LED1      LED4
 *  
 *  
 *  
 *  AtTiny13 Pins
 *  ---------------------
 *          1_o___8 5V
 *  LED34   2_____7 LED25
 *  LED7    3_____6 LED16
 *  GND     4_____5 BTN
 *  -----------------------
 *  
 *  
 */

// The pins will be addressed using their PB Number (see above)
int pinLed16 = 1;
int pinLed25 = 2;
int pinLed34 = 3;
int pinLed7 = 4;
int pinButton = 0;
int buttonState;
long ran;
int time = 2000;

void setup ()
{
  pinMode (pinLed16, OUTPUT);
  pinMode (pinLed25, OUTPUT);
  pinMode (pinLed34, OUTPUT);
  pinMode (pinLed7, OUTPUT);
  pinMode (pinButton, INPUT);
  // This resulted in an error, so it is commented out for now.
  //randomSeed(analogRead(A3));
}

void loop()
{
  buttonState = digitalRead(pinButton);
  if (buttonState == HIGH){
    ran = random(1, 7);
    if (ran == 1){
      digitalWrite (pinLed7, HIGH);
      delay (time);
    }
    if (ran == 2){
      digitalWrite (pinLed16, HIGH);
      delay (time);
    }
    if (ran == 3){
      digitalWrite (pinLed34, HIGH);
      digitalWrite (pinLed7, HIGH);
      delay (time);
    }
    if (ran == 4){
      digitalWrite (pinLed16, HIGH);
      digitalWrite (pinLed34, HIGH);
      delay (time);
    }
    if (ran == 5){
      digitalWrite (pinLed16, HIGH);
      digitalWrite (pinLed34, HIGH);
      digitalWrite (pinLed7, HIGH);
      delay (time);
   }
   if (ran == 6){
      digitalWrite (pinLed16, HIGH);
      digitalWrite (pinLed25, HIGH);
      digitalWrite (pinLed34, HIGH);
      delay (time);
   }
  }
  digitalWrite (pinLed16, LOW);
  digitalWrite (pinLed25, LOW);
  digitalWrite (pinLed34, LOW);
  digitalWrite (pinLed7, LOW);
}
2个回答

问题在于 4.3V BOD(掉电检测器)电平与旧电池相结合。

4.3V 的 BOD 电平没有意义,因为如果电池当前仅提供 4.18V,微控制器将处于复位状态。

使用较低的 BOD 水平。

对于初学者来说,2.7V BOD 水平应该没问题。充满电的电池可能提供每节电池 1.6V (4.8V) 的电压,并且在每节电池大约 0.9V (2.7V) 时被认为是空电池。

假设您已添加缺少的旁路电容器,请尝试以下操作:

拔下 MCU 并测量插座上相对于 4-确认 8 和 1 的电压为 5V。确认 5 为 0V,按下开关时变为 5V。

然后将一个 150 欧姆的电阻从 8 跳线到 3、2、7 和 6 中的每一个,并确认每个预期的 LED 亮起。

如果一切正常,将芯片从面包板移到 PCB 上——它们看起来是不同的芯片。