所有由黄, 德淇发布的文章

使用 Arduino 进行杆球平衡系统的 PID 控制

使用 Arduino 进行杆球平衡系统的 PID 控制

使用 Arduino 进行杆球平衡系统的 PID 控制

通过研究杆和球系统并使用Arduino作为控制器,很容易理解PID 控制。目标是通过使用闭合控制回路方便地倾斜球,将球放置在杆的中心。

套件淘宝购买链接:

Arduino PID 控制 球 PID算法 控制原理 控制工程 经典item.taobao.com图标

5分钟总结视频(点击即可观看)

杆和球系统

它是控制工程中的经典系统。

  • 使用距离传感器,我们测量球的位置。
  • 使用Controller,通过 PID 控制,我们计算应该倾斜杆以将球定位和稳定在杆中心的角度。
  • 一个执行机构修改栏的倾向。
                                                                   杆和球系统

球位感应

我们通过使用红外光和PSD 检测器的距离传感器来做到这一点 :SHARP GP2Y0A21。

                                                                 夏普传感器

它的测量范围为 6 至 80 厘米。它在 5V 下工作,它的输出是与此特性曲线测量的距离相关的电压:

夏普传感器曲线

如果球距离传感器的距离小于 6cm,则测量结果错误。我们限制球在那个距离内的运动。

                                                                         制动

传感器信号调理

为了过滤(低通)传感器信号并获得更准确和可重复的信号,我们将在传感器输出和地之间连接一个 10μF 电解电容器。

电容滤波效应

由于我们要测量的最大电压为 3.1V,我们将使用指令将 Arduino 的电压参考设置为 3.3V:

analogReference(EXTERNAL);

我们将 AREF 引脚与 Arduino 的 3.3V 输出连接:

将模拟参考连接到 3.3V 输出

这样,Arduino 的 10 位数模转换器提供的 1024 个点将具有 3.3V 的满量程,而不是默认的 5V。因此,我们将分辨率从 5mV/ADC 提高到 3mV/ADC。

传感器校准

为了将传感器提供的张力与以厘米为单位的距离联系起来,我们将沿着杆移动球,注意 ADC 中的读数。在为 Arduino 开发软件中,包含一种操作模式,它通过串行端口连续传输传感器读数:

    if(0){// Para calibrar sensor de Distancia
      Serial.print(dist);
      Serial.print("mm     ADC: ");    
      Serial.println(measure); 
    }

沿着横杆有 9 个点就足够了。我们获得了传感器的校准曲线。

距离传感器校准

在软件中定义为:

int dcal [] = { // Calibracion de ADC a Distancia
  -193, -160, -110, -60, 0, 40, 60, 90, 120};
int ADCcal [] = {
  177, 189, 231, 273, 372, 483, 558, 742, 970};

并且为了将存储在测量变量 中的传感器的 ADC 读数转换为dist变量中以毫米为单位的位置,我们应用以下算法:

   for(int i =0; i<8; i++){ // Aplicamos curva de Calibracion de ADC a mm 
      if (measure >= ADCcal[i] && measure< ADCcal[i+1]){
        dist = map(measure,ADCcal[i],ADCcal[i+1],dcal[i],dcal[i+1]);
      }

变量dist有负值和正值:条形左端为 -193mm,右侧为 120mm,中心为 0。由于我们的目标是将球留在中心点,因此该变量dist相当于PID 控制系统文献中使用的误差

执行器

我们将使用扭矩为 6.9 kg.cm 的 HEXTRONIK HX5010 Servo和固定在杆一端的玻璃纤维连杆倾斜杆。

伺服执行器

正如维基百科所说,我们用可变持续时间的脉冲控制伺服的旋转:

通过脉冲控制伺服位置

在这个特定的伺服系统中,0º 位置是用 0.5ms 脉冲获得的,180º 转动是用 2.3ms 获得的。

标准库(包含在 Arduino IDE 中)舵机,包括写入(角度)指令,角度是0 到 180 之间的整数,它允许我们调整舵机的位置。这是常用的指令,但由于我们希望在转动伺服时获得最大精度,因此我们将使用writeMicroseconds代替。它的语法是:servo.writeMicroseconds (μS),其中μS 是脉冲持续时间的微秒。我们将有 500(向上位置)和 2300(向下位置)之间的值,有 1800 个不同的点,而不是使用最基本的指令:write(角度)只有 180 个。

在调试和调整过程中,我们会借助水平仪计算出静止位置(水平杆)。

气泡水平

控制器

我们将使用带有 ATMEL ATMEGA328-PU 微控制器的 Arduino 克隆,类似于 Arduino UNO 或旧的原始 Duemilanove。

  • 它在其模拟输入 A0 处接收球位置的测量值。
  • 它发出脉冲以控制其数字输出 12 上的伺服。
  • 通过其 USB 连接,它发送不同的数据集用于调试或以下形式的帧:
173,173, -5, -5 $ // dist, dist, vel, vel $

由运行在Processing 中开发应用程序的 PC 接收,这将使我们能够欣赏球的位置和速度随时间变化的图表,如下所示:

加工图

作为奖励,当球距离中心小于 8 毫米时,它会打开连接到输出 13 的 LED。

5V电源

Arduino 通过其 USB 连接接收其运行所需的 5V。它的5V脚的电源不足以给舵机供电,所以我们会用一个辅助电源给它供电。不要忘记将辅助电源的地与Arduino的GND地相连!否则,伺服控制信号将没有公共参考,将无法工作。

完整系统示意图

使用 Arduino 的 Bar and Ball PID 控制方案
连接
Arduino 连接 - 面包板

PID 控制。ARDUINO 软件。

一旦我们实现了物理系统,就该为控制器提供必要的智能,以实现我们的目标:将球留在杆的中心。

测量和反应期

测量和反应序列(程序周期)不会像微控制器那样快,而是每50 毫秒(存储在周期变量中的值)。我们这样做是因为如果测量和反应周期总是相同的持续时间,PID 控制系统会更好地工作。

主频为 16MHz 的微控制器有足够的速度在不到 10ms 的时间内完成程序周期。但是在如此快速的循环中,球速度的测量会失去精度,因为循环之间球的位置差异可以忽略不计,我们将球的速度计算为连续 2 个程序循环中的位置差异。

如果我们将周期延长到 100 毫秒,速度测量会更准确,但伺服以明显的间歇方式工作。

测试后,50ms 的周期提供了可接受的球速测量值和平滑的伺服操作。

球速计算

Arduino 中实现 PID 控制软件中,我们将速度计算为球的当前位置(变量dist)与其在前一个循环中的位置(变量lastDist)之间的差异。我们将通过数字低通滤波器(平均值)来提高此测量的精度,该滤波器包括获得最后 5 个测量速度的平均值。我们将它们存储在矩阵v [] 中,并在每个程序周期中使用以下算法处理它们:

  for (int i = 0; i <level-1; i ++) {// 我们全部向左移动 
      v [i] = v [i + 1];
    }
    v [nvel-1] = (dist - lastDist); // 我们放入一个新数据
    vel = 0;
    for (int i = 0; i <nvel; i ++) {// 我们计算平均值
      vel = vel + v [i];
    }
    vel = vel / nvel;

我们将使用速度值来计算 PID 控制的微分分量。我们还通过串行端口/USB 电缆发送它,以便处理软件接收它并以图形方式表示它。

第一个近似值:比例项

如果是将球带到杆的中心,那么我们应该将杆倾斜得越多,球离中心越远,这似乎是合乎逻辑的。我们用取负值(向上)的变量pos的值来确定舵机的旋转,它决定了杆的倾斜度:

pos &amp;amp;amp;lt;0:伺服向上

和正(向下)从水平条左侧的值 0 开始:

pos&amp;amp;amp;gt; 0:伺服下降

由于我们在变量dist中有球的位置,“球离中心越远,杆越倾斜”在软件中写为:

pos = Kp * dist

其中 Kp 是一个常数。

因此,我们实现了 PID 控制的比例项。

- 别告诉我这不容易!

- 是的,当然......我们为 Kp 分配什么值。

为了给 Kp 赋值(对于后面的 Kdifferential 和 Kintegral),我们首先给它赋值:1、100、235、0.01 或任何你想要的值,我们将观察系统的行为。

我们正在寻找当球接近目标但尚未到达时足以倾斜杆的最小值。大数值让球跑得太快,然后不得不停在中间!

对于构建的系统,合适的值是 2。只有比例项,球永远不会稳定。

以下视频显示了以下效果:

- Kp = 1。太低。在点 0 附近几乎没有影响。
- Kp = 100。太高了。球加速太多。
- Kp = 2。它适用于我们的系统。

术语差异

术语“差异”作用于当前周期和前一个周期之间的位置差异。也就是说,关于球的速度,因为一次测量和下一次测量之间经过的时间总是相同的。这个时间是测量和反应周期,在我们的系统中是 50ms。

微分项在软件中写成:

pos = Kd * vel

在程序的前 3 行中,我们定义了 PID 控制的 3 个常量的值:

float Kp =0; 
float Kd = 100;
float Ki =0;

我们正在做的是使杆倾斜与球的速度相反。我们首先为 Kd 赋予任何值。

- 我可以给它值 10,这是我最喜欢的数字吗?

- 是的。前进。

点击这里即可观看

我们已经设置 Kp = 0 以便比例项不参与,并且 Kd = 10 作为起点。据观察,这是一个不足的值,因为它没有足够的反应来停止球。

我们上升到 Kd = 100:反应过度,系统不稳定。

正确的值在 10 到 100 之间。我们用 50、25 进行测试……观察系统在微分控制下的行为。可接受的值为 Kd = 35。

我们设法非常有效地阻止了球!

我们的目标是将球停在中点。通过将杆倾斜得越远,比例控制使球更靠近中心。球移动得越快,导数控制使杆倾斜得越多,并设法阻止它。现在观察到2个学期的共同作用下,定义POS伺服作为银行足球比赛:

    pos = Kp * dist + Kd * vel

这已经有效了!

比例项和导数项的组合作用是 PD 控制,足以满足许多应用。它的弱点之一是当球停在中心点附近时,它不再做出反应。由于速度为 0,微分项不起作用。由于它靠近中心点,按比例项的杆倾斜很小,可能不足以移动球。这就是这次发生的事情:

这永远不会发生在远离中心的位置,因为比例项已经有足够的实体,因此它的倾斜度会使球移动。

- 我们应该增加比例项吗?

正如我们在之前的视频中看到的 Kp = 100,高 Kp 值会导致系统不稳定。

解决方案是我们需要有一个真正的 PID 控制的字母:积分的 I。

精度:积分项

积分项考虑了球的位置(如比例项)以及它在那里的时间。更严格地说:就像微分项作用于速度(球的位置随时间的导数)一样,积分项作用于位置曲线下随时间变化的区域。

积分项

该区域取决于积分区间。如果我们连续积分曲线下的面积,积分项只会导致系统不稳定。我们只会在球距杆中心小于 4 厘米时对球的位置进行积分。当距离中心小于 8 mm 时,我们认为目标已实现,我们停止积分。如果我们超出一个间隔,我们将重置 I (I = 0)。我们在软件中写成:

int Rint = 8;
int Rext = 40;

    if(abs(dist)>Rint && abs(dist)<Rext){
      I=I+dist*Ki;
    } 
    else {
      I=0;
    }
 pos=Kp*dist+Kd*vel+I;

也就是说,当球距离中心小于 4 厘米且大于 8 毫米时,我们将取其与中心的距离,将其乘以 Ki 并将结果累积在 I 中。我们在那里呆的时间越多,我就会变得越大。
总之,积分项提供了更高的精度,但必须方便地限制其作用,否则会带来太多的不稳定性。

Arduino总程序

#include <Servo.h>
//#include <Wire.h>
//#include "IICLiquidCrystal.h"

// Connect via i2c, default address #0 (A0-A2 not jumpered)
//LiquidCrystal lcd(0);

float Kp = 3;   //2
float Kd = 1;  //35
float Ki = 0.5; //0.1
int Rint = 8;   //
int Rext = 40;  //
int aim = 0;
unsigned long time = 0; //execution time of the last cycle
unsigned long timeSerial = 0;
int period = 50;        //Sampling period in ms
int sensorPin = 0;        //Analog Pin where the Distance Sensor signal is connected
int measure;            //What the sensor measures. They are ADCs.
int dcal [] = {         //Remote ADC calibration
  -193, -160, -110, -60, 0, 40, 60, 90, 120
};
int ADCcal [] = {
  177, 189, 231, 273, 372, 483, 558, 742, 970
};
int lastDist;     //Previous value of Distance to calculate Speed
int dist;         //distance in mm with 0 in the center of the bar
int nvel = 5;       //number of velocity values over which we calculate the average
int v[5];
int vel;          //mean value of the last speed levels
float I;          //Integral Value


Servo myservo;    //create servo object to control a servo
float pos;
float reposo = 1350; //value held by horizontal bar

int ledPin = 13; //Green led pin.

void setup()
{
  analogReference(EXTERNAL);  //AREF connected to 3.3V
  myservo.attach(3);         //attaches the servo on pin X to the servo object
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);

  myservo.writeMicroseconds(reposo);
  delay(5000);

  //lcd.begin(16, 2);

}

void loop()
{
  if (millis() > timeSerial + 200)
  {
    timeSerial = millis();
//    Kp = map(analogRead(A1), 0, 1023, 0, 5000) / 100.0;
//    Kd = map(analogRead(A2), 0, 1023, 0, 400) / 100.0;
//    Ki = map(analogRead(A3), 0, 1023, 0, 300) / 100.0;

    //aim = map(analogRead(A5), 0, 1023, -20, 20);

    Serial.println();
    Serial.print("Kp:");
    Serial.println(Kp);

    Serial.print("Kd:");
    Serial.println(Kd);

    Serial.print("Ki:");
    Serial.println(Ki);

    Serial.print("Aim:");
    Serial.println(aim);

    Serial.print("Pos:");
    Serial.println(dist);
  }

  
  if (millis() > time + period) { //
    time = millis();

    //    lcd.setCursor(0, 0);
    //    lcd.print("Kp:");
    //    lcd.print(Kp);
    //
    //    lcd.setCursor(8, 0);
    //    lcd.print("Kd:");
    //    lcd.print(Kd);
    //
    //    lcd.setCursor(0, 1);
    //    lcd.print("Ki:");
    //    lcd.print(Ki);
    //
    //    lcd.setCursor(8, 1);
    //    lcd.print("Pos:");
    //    lcd.print(dist);






    //We measure DISTANCE
    measure = analogRead(sensorPin);
    measure = constrain(measure, ADCcal[0], ADCcal[8]);
    lastDist = dist; //We save the previous value of dist to calculate the speed
    for (int i = 0; i < 8; i++) { //We apply Calibration curve from ADC to mm
      if (measure >= ADCcal[i] && measure < ADCcal[i + 1]) {
        dist = map(measure, ADCcal[i], ADCcal[i + 1], dcal[i], dcal[i + 1]);
      }
    }
    //Average SPEED calculation
    for (int i = 0; i < nvel - 1; i++) { //We all move to the left to free the last one.
      v[i] = v[i + 1];
    }
    v[nvel - 1] = (dist - lastDist); //We put a new data
    vel = 0;
    for (int i = 0; i < nvel; i++) { //We calculate the mean
      vel = vel + v[i];
    }
    vel = vel / nvel;
    // Integral
    if (abs(dist - aim) > Rint && abs(dist - aim) < Rext) { //Only if it is inside (-Rext, Rext) and outside (-Rint, Rint)
      I = I + dist * Ki;
    }
    else {
      I = 0;
    }
    //We calculate servo position
    pos = Kp * (dist - aim) + Kd * vel + I;
    myservo.writeMicroseconds(reposo + pos);

    if (abs(dist) < Rint) { //If we are inside Rint turn on Led
      digitalWrite(ledPin, HIGH);
    }
    else {
      digitalWrite(ledPin, LOW);
    }

    if (1) { //Shipping for PROCESSING
      Serial.print(dist + 200);
      Serial.print(",");
      Serial.print(dist + 200);
      Serial.print(",");
      Serial.print(vel);
      Serial.print(",");
      Serial.print(vel);
      Serial.print("$");
    }
    if (0) { //Debug
      Serial.print(millis());
      Serial.print(" ms|dist: ");
      Serial.print(dist);
      Serial.print("|vel: ");
      Serial.print(vel);
      Serial.print("|Kp*dist: ");
      Serial.print(Kp * dist);
      Serial.print("|Kd*vel: ");
      Serial.print(Kd * vel);
      Serial.print("|Int: ");
      Serial.print(I);
      Serial.print("|pos: ");
      Serial.println(pos);
    }
    if (0) { //To calibrate Distance sensor
      Serial.print(dist);
      Serial.print("mm     ADC: ");
      Serial.println(measure);
    }
    if (0) { //DeBug Speeds
      for (int i = 0; i < (nvel); i++) {
        Serial.print(v[i]);
        Serial.print(",");
      }
      Serial.print("       vel:");
      Serial.println(vel);
    }
  }
}

Processing总程序

// Arduino: _14_HV_logger_2Ch
// VOLTAGE IN PIN Analog0
// CURRENT IN PIN Analog1
import processing.serial.*;
Serial USB;
String message = null;
int jmax = 100000; // Stored readings
int[] VminADC; // From 0 to jmax
int[] VmaxADC; // Raw values 
int[] IminADC;
int[] ImaxADC;
float[] Vmin; // From 0 to jmax
float[] Vmax; // in kV and uA
float[] Imin;
float[] Imax;
int j = 0; // Whole Register
int x = 0; // On Screen
int xpant = 1000; // Dimensions of the screen
int ypant = 800;
int mSup = 60; // Margin Sup and Inf of the trace
int mInf = 50;
int mLat = 50;
int xgraf = xpant - 2 * mLat;
int xDisplay = 30; // Beginning of the text
int yDisplay = 30;
float Cal0 = 1;
float Cal1 = 1;
float CalVEL =  300; // 
float CalPOS = 400; // 
PFont fontVerdana;
String [] com = new String [3];
void setup() {
  size(1000, 800, P3D);
  println(Serial.list());
  String portName = Serial.list()[0]; //    Puerto COM 14 
  USB = new Serial(this, portName, 115200);
  VminADC = new int [jmax];
  VmaxADC = new int [jmax];
  IminADC = new int [jmax];
  ImaxADC = new int [jmax];
  Vmin = new float [jmax];
  Vmax = new float [jmax];
  Imin = new float [jmax];
  Imax = new float [jmax];
  com = new String [3];
  fontVerdana = loadFont("Verdana-20.vlw");
}
void draw() {
  background(190);
  // New Data ***************************************************************************
  while (USB.available () > 0) {
    message = USB.readStringUntil(36); // 644,659,725,733$
    if (message != null) {    
      if (j < jmax - 2) {
        j++;
      } 
      else {
        j = 0;
      }
      message = message.substring(0, message.length()-1); // 644,659,725,733
      String[] com = splitTokens(message, ",");
      VminADC [j] = int(com[0])-200;   // Stored in VminADC[j] as ADC 
      VmaxADC [j] = int(com[1])-200;
      IminADC [j] = int(com[2]);
      ImaxADC [j] = int(com[3]);
      print(VminADC [j]);
      print("\t");
      print(VmaxADC [j]);
      print("\t");
      print(IminADC [j]);
      print("\t");
      println(ImaxADC [j]);
      Vmin [j] = VminADC [j] * Cal0;  // Stored in Vmin[j] as kV
      Vmax [j] = VmaxADC [j] * Cal0;
      Imin [j] = IminADC [j] * Cal1;
      Imax [j] = ImaxADC [j] * Cal1;
    }
  }

  //  Axis ********************************************************************************
  stroke(255);
  strokeWeight(2);
  line(mLat-10, ypant-mInf, xpant-mLat, ypant-mInf);
  line(mLat, ypant-mInf+10, mLat, mSup);
  // Reference Axis *************************************************************************************
  /*  fill(#FF1C20); // Red
   //  text("500uA", 10, (ypant-mInf)-500*(ypant-mSup-mInf)/660+4);
   stroke(#FF1C20, 20); // Red
   line(mLat, (ypant-mInf)-500*(ypant-mSup-mInf)/660, xpant-mLat, (ypant-mInf)-500*(ypant-mSup-mInf)/660);
   */
  fill(#321CFF); // Blue
  text("0", 30, mSup+(ypant-mInf-mSup)/2+4);
  stroke(#321CFF, 20); // Blue
  line(mLat, mSup+(ypant-mInf-mSup)/2, xpant-mLat, mSup+(ypant-mInf-mSup)/2);

  // Draw before 1st scroll ********************************************************************************************
  if (j <= xgraf) {
    for ( int i = 0; i < j; i ++) {
      strokeWeight(1);
      stroke(#FF1C20); // Red VELOCIDAD
      line(i+mLat, int(mSup+(ypant-mInf-mSup)/2)-Imin[i]*(ypant-mInf-mSup)/CalVEL-2, i+mLat, int(mSup+(ypant-mInf-mSup)/2)-Imax[i]*(ypant-mInf-mSup)/CalVEL+2);

      stroke(#321CFF); // Blue POSICIÓN
      line(i+mLat, int(mSup+(ypant-mInf-mSup)/2)-Vmin[i]*(ypant-mInf-mSup)/CalPOS-2, i+mLat, int(mSup+(ypant-mInf-mSup)/2)-Vmax[i]*(ypant-mInf-mSup)/CalPOS+2);
    }
  }
  // Draw with scroll **************************************************************************************************************
  if (j > xgraf) {
    for ( int i = 0; i <= xgraf; i ++) {
      strokeWeight(1);
      stroke(#FF1C20); // Red
      //      line(i+mLat, int((ypant-mInf)-Imin [j-xgraf+i]*(ypant-mSup-mInf)/660), i+mLat, int((ypant-mInf)-Imax [j-xgraf+i]*(ypant-mSup-mInf)/660));      
      line(i+mLat, int(mSup+(ypant-mInf-mSup)/2)-Imin[j-xgraf+i]*(ypant-mInf-mSup)/CalVEL-2, i+mLat, int(mSup+(ypant-mInf-mSup)/2)-Imax[j-xgraf+i]*(ypant-mInf-mSup)/CalVEL+2);
      stroke(#321CFF); // Blue
      // line(i+mLat, int((ypant-mInf)-Vmin [j-xgraf+i]*(ypant-mSup-mInf)/15), i+mLat, int((ypant-mInf)-Vmax [j-xgraf+i]*(ypant-mSup-mInf)/15));
      line(i+mLat, int(mSup+(ypant-mInf-mSup)/2)-Vmin[j-xgraf+i]*(ypant-mInf-mSup)/CalPOS-2, i+mLat, int(mSup+(ypant-mInf-mSup)/2)-Vmax[j-xgraf+i]*(ypant-mInf-mSup)/CalPOS+2);
    }
  }
  // Text Channels Readings ***************************************************************
  stroke(190);
  fill(190); // Blue
  rect(30, 12, 330, 20);
  textFont(fontVerdana, 20);
  fill(#321CFF); // Blue
  text(int(Vmin[j]) +" mm", xDisplay, yDisplay);
  textFont(fontVerdana, 10);
  //  text("+/-" + nf((Vmax[j] - Vmin[j]), 0, 1) +" kV", xDisplay + 80, yDisplay);
  textFont(fontVerdana, 20);
  fill(#FF1C20); // Red
  text(int(Imax[j]) +" mm/s", xDisplay + 200, yDisplay);
  textFont(fontVerdana, 10);
  //  text("+/-" + int((Imax[j] - Imin[j])) +" uA", xDisplay + 200 + 80, yDisplay);
}
/*void keyPressed() {
 if (key == 's' || key =='S') {
 grabar();
 }
 if (key == 'v' || key =='V') {
 Cal0 = 9.0/((VminADC [j]+VmaxADC [j])/2); // 9 kV equals 489 ADC
 println("Calibración de Tensión: "+ Cal0);
 }
 if (key == 'i' || key =='I') {
 Cal1 = 660.0/((IminADC [j]+ImaxADC [j])/2);
 println("Calibración de Intensidad: "+ Cal1);
 }
 }
 */
void grabar() {
  String[] lines = new String[j];
  for (int i = 0; i < j; i++) {
    lines[i] = str(Vmin [i+1]) + "\t" + str(Vmax [i+1]) + "\t" + str(Imin [i+1]) + "\t" + str(Imax [i+1]); // Vmin  Vmax  Imin  Imax
  }
  saveStrings("Registro.txt", lines);
  exit();
}

Digital Fundamentals 数字电子技术基础:系统方法 Thomas L. Floyd

Digital Fundamentals

数字电子技术基础:系统方法

预览版

如果您在移动设备上无法预览上面的PDF文档,您还可以点击这里访问

内容简介

《数字电子技术基础:系统方法》是世界著名优秀教材,结合数字电子技术的发展趋势,从数字电子技术系统性的角度,对数字技术和数字系统内容进行重新组织,系统阐述数字电子技术的基础知识。主要内容包括:数字电子技术的基本概念、组合逻辑、锁存器、触发器、定时器、计数器、移位寄存器、数据传输、信号处理等。

作者简介

Thomas L. Floyd,1964年获得佛罗里达大学电气工程学士学位,同年在德州仪器公司开始职业生涯,1968年获得南卫理公会大学电气工程硕士学位,之后在马丁·玛丽埃塔公司任职高级工程师,从事导弹制导系统和数字通信系统的研发。1973年,他成为瓦伦西亚社区学院的全职教师,担任新电子科技计划项目主管,负责开发课程、设计实验室及授课。1977年,他撰写了第一本世界级畅销书《Digital Fundamentals》(现已更新至第11版),同年加入北卡罗来纳州美林社区学院,并出版了第二本畅销书《Electronics Fundamentals: Circuits, Devices & Applications》(现已更新至第8版)。1983年,他开始专职写作,先后出版了《Operational Amplifiers and Linear Integrated Circuits》(现已更新至第6版)和《Electric Circuits Fundamentals》(现已更新至第8版)。近年来,除了本书之外,Floyd还出版了另外两本世界著名教材:《DC/AC Fundamentals: A Systems Approach》和《Digital Fundamentals: A Systems Approach》。

网友书评

数电讲得很详细,比国内教科书全面点。

书很好,适合初学者学习使用,内容详实,讲解到位透彻,值得拥有,推荐购买!

获取高清完整版PDF

分享地址

https://pan.baidu.com/s/1GDaSizKUos9yEtStA83ckg

Analog Fundamentals:A system approach 模拟电子技术基础:系统方法 Thomas L. Floyd

Analog Fundamentals:A system approach

模拟电子技术基础:系统方法

预览版

如果您在移动设备上无法预览上面的PDF文档,您还可以点击这里访问

内容简介

《模拟电子技术基础:系统方法》是以系统为视角的极具特色的模拟电子技术基础教材。全书共15章,内容包括:二极管及其应用、BJT、FET、多级放大器、RF放大器、功率放大器、运算放大器、特殊用途放大器、运算放大器的响应、基本运算放大器电路、有源滤波器、振荡器、定时器、稳压器、通信电路、数据转换等。全书配有习题和习题答案,便于学生牢固掌握所学知识点。本书可供工科电子类各专业的本科生、专科生使用,也可作为相关技术领域工程技术人员的参考书。

作者简介

Thomas L. Floyd,1964年获得佛罗里达大学电气工程学士学位,同年在德州仪器公司开始职业生涯,1968年获得南卫理公会大学电气工程硕士学位,之后在马丁·玛丽埃塔公司任职高级工程师,从事导弹制导系统和数字通信系统的研发。1973年,他成为瓦伦西亚社区学院的全职教师,担任新电子科技计划项目主管,负责开发课程、设计实验室及授课。1977年,他撰写了第一本世界级畅销书《Digital Fundamentals》(现已更新至第11版),同年加入北卡罗来纳州美林社区学院,并出版了第二本畅销书《Electronics Fundamentals: Circuits, Devices & Applications》(现已更新至第8版)。1983年,他开始专职写作,先后出版了《Operational Amplifiers and Linear Integrated Circuits》(现已更新至第6版)和《Electric Circuits Fundamentals》(现已更新至第8版)。近年来,除了本书之外,Floyd还出版了另外两本世界著名教材:《DC/AC Fundamentals: A Systems Approach》和《Digital Fundamentals: A Systems Approach》。

网友书评

国外经典教材,佛罗伊德的经典书籍,初学者很好入门,内容通俗易懂,全面细致,推荐购买。

获取高清完整版PDF

分享地址

https://pan.baidu.com/s/1TOD8NCKQMmFcEIgLECW0nQ

百科全书类

(提取码需购买方可获得)

书籍 作者 图片 链接 提取码
经济学书 DK Press 地址链接    购买链接   
科学书籍 DK Press 地址链接 购买链接
商业书籍 DK Press 地址链接 购买链接
文学书 DK Press 地址链接 购买链接
哲学书 DK Press 地址链接 购买链接
心理学书 DK Press 地址链接 购买链接
历史书 DK Press 地址链接 购买链接
军事史 DK Press 地址链接 购买链接
1000件物品的世界历史 DK Press 地址链接 购买链接
艺术家的绘画技巧 DK Press 地址链接 购买链接
每个人都能懂的英语 DK Press 地址链接 购买链接
人体全书 DK Press 地址链接 购买链接
坎贝尔生物学 Neil Campbell 地址链接 购买链接

电子元器件百宝箱 电子元器件实用手册

电子元器件百宝箱 电子元器件实用手册

Encyclopedia of Electronic Components Vol.3

电子元器件实用手册-传感器篇(中译本)

预览版

如果您在移动设备上无法预览上面的PDF文档,您还可以点击这里访问

获取高清完整版PDF

分享地址

Encyclopedia of Electronic Components Vol.3 电子元器件实用手册-传感器篇(中译本)
https://pan.baidu.com/s/1b69t1N3QV4_-DorodWDxaQ

Encyclopedia of Electronic Components Vol.1 电子元器件百宝箱-电源与转换

Resistors, Capacitors, Inductors, Switches, Encoders, Relays, Transistors

Encyclopedia of Electronic Components Vol.2 电子元器件百宝箱-信号处理

LEDs, LCDs, Audio, Thyristors, Digital Logic, and Amplification

Encyclopedia of Electronic Components Vol.3 电子元器件实用手册-传感器篇

Sensors for Location, Presence, Proximity, Orientation, Oscillation, Force, Load, Human Input, Liquid and ... Light, Heat, Sound, and Electricity

预览版

如果您在移动设备上无法预览上面的PDF文档,您还可以点击这里访问

如果您在移动设备上无法预览上面的PDF文档,您还可以点击这里访问

如果您在移动设备上无法预览上面的PDF文档,您还可以点击这里访问

内容简介

《爱上制作:电子元器件百宝箱(第1卷)》就如同一个收纳了多种元器件的百宝箱,在功率器件、电磁、分离半导体的大层级下,又下设多个子集,子集下分为28个元器件条目。每个条目中,分别讲解该元器件可以做什么、如何工作、演变、参数、如何使用和禁止事项。《爱上制作:电子元器件百宝箱(第1卷)》每个条目是相对独立的,你可以从任何感兴趣的章节开始阅读,寻找有用的知识点。你也可以像使用工具书一样使用它,遇到疑惑时翻阅查找。

本书是《电子元器件百宝箱(第1卷)》的续篇,它如同一个收纳了多种元器件的百宝箱,针对LED、LCD、音频、晶闸管、放大器等信号处理问题做了阐述。全书分为分立半导体、集成电路、光源与指示器、声源几个大类,每个大类再分成若干个小项目,比如二极管、比较器、定时器、解码器、LED指示器等,各个项目再从功能、工作原理、演变过程、参数、使用方法、注意事项等方面做详细介绍。

本书介绍常用电子元器件的基本信息、工作原理、使用方法、参数、注意事项等,便于初学者查找相关元器件的应用方式,本卷侧重于介绍传感器,包括GPS、磁力计、红外传感器、倾斜传感器等。作为电子元件工具书介绍它们的经典用途的同时,本书又以DIY的新角度介绍如何在项目中使用这些电子元件,可以为制作爱好者提供准确的信息,甚至当作一部工具书来使用。本书是一本全彩的电子元件百科全书,读者可以在本书中得到所有想知道的信息,并且在风格上继承和发扬了《爱上制作》系列书的生动活泼,以DIY的新角度介绍如何在项目中使用传统的电子元件。想知道如何熟练使用电子元器件吗?本丛书第三卷(共三卷)中涵盖了您在项目中会用到的传感器关键知识---包含照片、原理图和表格。通过本书您可以了解到各个器件的用途、工作方法、其中蕴含的道理、了解不同类型的衍生器件。不管是电子行业的新手还是高手,都可以在本书里探索到新的知识和技巧。1GPS11.1它可以做什么11.1.1原理图符号11.1.2GPS子模块11.2它如何工作11.3演变21.4参数21.5如何使用它21.5.0每秒脉冲输出数31.6禁止事项31.6.1静电放电31.6.2接地不良31.6.3虚焊31.6.4许可限制31.6.5搜星失败31.6.6速度或高度超出限定值32磁力计52.1它可以做什么52.1.1原理图符号52.1.2IMU52.1.3应用52.2它如何工作62.2.1磁场62.2.2地轴62.2.3线圈磁力计72.2.4霍尔效应和磁阻72.3演变72.4如何使用它82.5禁止事项82.5.1磁干扰82.5.2安装不当83物体检测传感器93.1它可以做什么93.1.0原理图符号93.2演变103.3光检测103.3.1透射型光传感器113.3.2对射型光传感器123.4磁传感器133.5簧片开关133.5.1簧片开关种类143.5.2簧片开关参数143.5.3如何使用簧片开关143.6霍尔效应传感器143.6.1霍尔效应传感器的工作原理153.6.2霍尔效应传感器的种类153.7参数153.8如何使用霍尔效应传感器153.9如何使用物体检测传感器153.9.1线性移动检测153.9.2中断检测163.9.3角度检测163.10不同传感器的优缺点汇总163.10.1光学物体检测传感器的优点163.10.2光学物体检测传感器的缺点163.10.3簧片开关的优点163.10.4簧片开关的缺点163.10.5霍尔效应传感器的优点173.10.6霍尔效应传感器的缺点173.11禁止事项173.11.1光传感器173.11.2簧片开关174被动式红外传感器194.1它可以做什么194.1.1原理图符号194.1.2应用194.2它如何工作194.2.1热释电传感器204.2.2检测单元204.2.3镜头组204.3演变224.4禁止事项234.4.1高温灵敏度衰减234.4.2检测窗口损坏234.4.3受潮235距离传感器255.1它可以做什么255.1.1原理图符号255.1.2应用255.2演变255.2.1超声波255.2.2红外线265.2.3相对优势265.3常见的超声波传感器265.3.1进口产品

网友书评
内容全面,信息丰富

可读性强,甚至都适合青少年了解电子元器件阅读,有不少实物照片和理论图示。不过应用方面介绍不多。

便于理解

非常好的电子器件分类手册。

适合初学者

如果您不熟悉电子产品,这是我推荐的第一本书。它从器件的基础开始,一直到集成电路的设计。在这个版本中,作者专注于集成电路而不是分立元件电路。对于任何一个以模拟/数字电子设备开始的人,我肯定会推荐它。到目前为止研究过的其他书籍,在没有任何理由或解释的情况下,没有太多细节的情况下,将某些东西或某些方程式抛弃了。到现在,我在这个版本中从未遇到任何此类困难。已经解释了所有的概念和方程,没有任何逻辑缺陷。

获取高清完整版PDF

分享地址

Encyclopedia of Electronic Components Vol.1 电子元器件百宝箱-电源与转换
https://pan.baidu.com/s/1CJm6j6-cSeSJU4ozldfXfA

Encyclopedia of Electronic Components Vol.2 电子元器件百宝箱-信号处理
https://pan.baidu.com/s/1Iy4HxgC8pUMpAlfVuSd7wA

Encyclopedia of Electronic Components Vol.3 电子元器件实用手册-传感器篇
https://pan.baidu.com/s/16JGGuO_Gdt2aUY8zg7YohA

如微信无法付款,请点击以下网址使用浏览器打开,使用支付宝付款获取分享码:
Encyclopedia of Electronic Components Vol.1 电子元器件百宝箱-电源与转换

https://sns.io/sell/MNFRMRSD

Encyclopedia of Electronic Components Vol.2 电子元器件百宝箱-信号处理

https://sns.io/sell/UYXTRS44

Encyclopedia of Electronic Components Vol.3 电子元器件实用手册-传感器篇

https://sns.io/sell/G4FH1PQZ

Automatic Control Systems 自动控制系统 Farid Golnaraghi Benjamin C. Kuo

Automatic Control Systems

自动控制系统

预览版

如果您在移动设备上无法预览上面的PDF文档,您还可以点击这里访问

内容简介

Automatic Control Systems provides engineers with a fresh new controls book that places special emphasis on mechatronics. It follows a revolutionary approach by actually including a physical lab. In addition, readers will find authoritative coverage of modern design tools and examples. Current mechatronics applications build motivation to learn the material. Extensive use of virtual lab software is also integrated throughout the chapters. Engineers will gain a strong understand of control systems with the help of modern examples and exercises.

作者简介

Farid Golnaraghi博士   自2006年起担任温哥华西蒙弗雷泽大学机电系统工程系主任教授。他还在SFU担任Burnaby Mountain资助主席,他的主要研究重点是智能车辆系统。在加入SFU之前,他是滑铁卢大学机械与机电工程学教授。他的开创性研究成果包括两本教科书,超过一百五十篇期刊和会议论文,四项专利和两家初创公司。

Benjamin C. Kuo博士   是伊利诺伊大学厄巴纳 - 香槟分校电子与计算机工程系名誉教授。他是IEEE的会员,并在控制系统的理论和应用研究方面获得了许多奖项。他撰写了大量论文,并撰写了10多本有关控制系统的书籍。他在工业界广泛咨询过。

网友书评

The best general book about control engineering

I had to use this book for my last semester in electrical engineering. It is really interesting, well explained and complete for a concise introduction about control engineering and design of controllers.

All you need to follow the text are basic notions in engineer's mathematics (a bit of calculus and algebra). A few chapters offer reviews of important notions (transfert functions, state variable modeling, differential equations, ...) Then, you get to the essential, control theory.

The book is well divided. First chapters cover mathematical notions you have to master in order to succeed in the next part (signal flow diagrams, block diagrams, a bit of mechanic). Then, a few chapters introduce control loops, poles and zeros interpretation (explained very well with a lot of graphs examples). A single chapter covers root loci drawing. Great explanations about controllers are complete and easy to understand. The last chapter is kept for design only with A LOT of examples for PID, phase-lag, filters, etc.

Emphasis is made on computer design with examples all along the book. The CD included offers a few useful tools to use for design with Matlab.

The author knows his subject more than anyone else. He has good experience in design and the text is well written. A must for anyone studying the subject.

获取高清完整版PDF

分享地址

https://pan.baidu.com/s/12DQJFuebHs5fs1KOsJV-Xg

如微信无法付款,请点击以下网址使用浏览器打开,使用支付宝付款获取分享码:
https://sns.io/sell/GMSFELLG

Microelectronic Circuit Design 微电子电路设计 Richard C. Jaerger Travis N. Blalock

Microelectronic Circuit Design

微电子电路设计

预览版

如果您在移动设备上无法预览上面的PDF文档,您还可以点击这里访问

内容简介

《国外电子与通信教材系列:微电子电路设计(第4版)》读者可以对现代集成电路技术建立较为全面的概念。尽管绝大多数读者最终可能并不从事集成电路设计工作,但是如果能对半导体器件原理、基本数字和模拟单元结构,以及集成电路分析方法等微电子科学基础知识有所认识,亦将有助于在电子系统设计中消除诸多隐患,从而使集成电路的应用变得更加高效、可靠。《国外电子与通信教材系列:微电子电路设计(第4版)》可作为电子与信息类各专业本科生基础课的教材或参考书,也可作为相关领域工程技术人员的参考资料。

作者简介

美国)理查德·C.耶格(Richard C.Jaeger) (美国)特拉维斯·N.布莱洛克(Travis N.Blalock) 
Richard C.Jaeger,美国奥本大学电气与计算机工程系资深教授,已退休。亚拉巴马微电子科学与技术中心(AMSTC)创建人,IEEE会士。研究兴趣包括射频电路设计、电子器件与电路中的噪声、固态电路与器件、电子封装、压阻传感器、高热熔剂冷却、低温电子学、VLSI设计等。

网友书评

内容全面

涵盖了微电子电路设计所需基础知识,主要由三个部分组成。第一部分介绍固态电子学与器件,讨论了电子学的发展与电路分析方法和微电子器件的工作原理、IV特性及SPICE模型等。第二部分为数字电路,包括数字电路的基本概念和CMOS电路、存储电路、ECL与TTL等双极型逻辑电路以及BiCMOS电路。第三部分为模拟电路,以理想运算放大器和SPICE仿真为基础介绍了不同结构运算放大器的相关特性、小信号模型、具体分析方法和集成设计技术,最后讨论了放大器的频率响应、反馈和振荡器等问题。

有利于了解现代微电子电路设计
通过学习本书可以了解现代微电子电路设计,包括模拟与数字,分立与集成,了解内部结构也有利于系统设计中对集成电路的适当选择。
可以对现代集成电路技术建立较为全面的概念
集成电路是信息社会发展的基础,培养更多高水平集成电路设计人才是目前高校微电子学科的一项重要任务。通过本书的学习,读者可以对现代集成电路技术建立较为全面的概念。尽管绝大多数读者最终可能并不从事集成电路设计工作,但是如果能对半导体器件原理、基本数字和模拟单元结构,以及集成电路分析方法等微电子科学基础知识有所认识,亦将有助于在电子系统设计中消除诸多隐患,从而使集成电路的应用变得更加高效、可靠。
思路清晰,例子丰富,有利于培养高水平电路设计人才
书中凝结了作者多年来在数字和模拟设计领域业界工作与课堂教学的宝贵经验,从基础到前沿,由浅入深,结构合理,特色鲜明。全书内容分为固体电子学与器件、数字电子学和模拟电子学三大部分。
书中所有的设计实例均采用统一的结构化求解方法,可大大加深学生对与设计中相关问题的理解,有助于对设计流程的掌握。每章的“电子应用”可令读者对电路设计与应用有更加深刻的体会,书中给出的设计要点则强调了电路设计者应牢记的重要概念。全书充分利用计算机在运算与分析,以及EDA软件,例如MATLAB、SPICE等在电路设计与分析中的应用,并在实例和章后习题中提供了许多实践机会。
进入21世纪后,中国的集成电路产业如雨后春笋般迅猛发展,集成电路人才炙手可热。引进这样一部权威著作,无疑会对在国内培养更多高水平电路设计人才起到重要的推动作用

获取高清完整版PDF

分享地址

https://pan.baidu.com/s/1RLTLiJ33RPAnFg1fOVPYCw

如微信无法付款,请点击以下网址使用浏览器打开,使用支付宝付款获取分享码:
https://sns.io/sell/E8GWCP3

Microelectronic Circuits 微电子电路 Adel S. Sedra Kenneth C.(KC)Smith

Microelectronic Circuits

微电子电路

预览版

如果您在移动设备上无法预览上面的PDF文档,您还可以点击这里访问

内容简介

这本市场领先的教科书仍然是卓越和创新的标准。建立在Adel S. Sedra和Kenneth C. Smith的坚实教学基础之上,第七版微电子电路是最好的。除了旨在反映IC技术变化的更新内容和覆盖范围外,该文本还提供了当今可用的最全面,灵活,准确和面向设计的电子电路处理方法。通过丰富的实例充分说明,并辅以更多精心设计的章末问题和实践练习,微电子电路是教授明天工程师如何分析和设计电子电路的最新资源

作者简介

网友书评

内容全面,信息丰富

文本本身非常密集。大量信息包含在段落中,这可能是为什么它比字典更重要的原因。第一本教科书我读过,我觉得我读的每一句话都是我实际上在学习的东西。

便于理解

将概念简化为简单的术语,清晰而干净地解释它们。在解释了这些概念之后,它还引入了一些实际测量值以及最常见的电压或MOSFET氧化剂厚度等。
我确信这本书被分配给许多微电子课程。它可能是一本教科书,你需要坚持一段时间,因为解释是如此彻底和精确(这是一个很好的参考)

适合初学者

如果您不熟悉电子产品,这是我推荐的第一本书。它从器件的基础开始,一直到集成电路的设计。在这个版本中,作者专注于集成电路而不是分立元件电路。对于任何一个以模拟/数字电子设备开始的人,我肯定会推荐它。到目前为止研究过的其他书籍,在没有任何理由或解释的情况下,没有太多细节的情况下,将某些东西或某些方程式抛弃了。到现在,我在这个版本中从未遇到任何此类困难。已经解释了所有的概念和方程,没有任何逻辑缺陷。

获取高清完整版PDF

分享地址

https://pan.baidu.com/s/1CJm6j6-cSeSJU4ozldfXfA

如微信无法付款,请点击以下网址使用浏览器打开,使用支付宝付款获取分享码:
https://sns.io/sell/LWN6KMSI

The Art of Electronics 电子学的艺术 Paul Horowitz Windfield Hill

The Art of Electronics

电子学的艺术

预览版

如果您在移动设备上无法预览上面的PDF文档,您还可以点击这里访问

内容简介

本书是哈佛大学的经典教材,通过强调电子电路系统设计者所需的实用方法,即对电路的基本原理、经验准则以及大量实用电路设计技巧的全面总结,侧重探讨了电子学及其电路的设计原理与应用。书中不仅涵盖了电子学通常研究的全部知识点,还补充了有关数字电子学中的大量较新应用及设计方面的要点内容。对高频放大器、射频通信调制电路设计、低功耗设计、带宽压缩以及信号的测量与处理等重要电路设计以及电子电路制作工艺设计方面的难点也做了通俗易懂的阐述。本书包含丰富的电子电路分析设计实例和大量图表资料,内容全面且阐述透彻,是一本世界范围内公认的电子学电路分析、设计及其应用的优秀教材。
本书前两版通俗易懂,已获得普遍好评并被广泛采用。2015年出版的第三版与时俱进,重写了关于微计算机与微处理器的章节,并着重修改了数字电子学、运算放大器与精度计算以及电路构造工艺等内容。对相应的表格也进行了修改和扩充。并且,书中新增了关于有源滤波器设计、开关电容滤波器、正交振荡器、低下降稳压器、开关电源、消弧电路、隔离放大器、SCR锁存电路、地电位漂移、动态功率损耗、光电子学、RS-232接口电路、调制解调器、存储器芯片、简略归零、调幅检波、电池特性和传感器的线性化等内容的章节。

作者简介

Paul Horowitz 哈佛大学物理学教授。他在哈佛任教物理学与电子学的同时,首开了哈佛的实验电子学课程,迄今已有15年了。他的研究兴趣广泛,涉猎观测天体物理学、X射线与粒子显微技术、光干涉技术测量技术以及外星人探索等研究领域。作为已有60多篇技术文章与报告的作者,他也广泛地为工业和政府有关部门做咨询顾问工作,并且是大量电子与摄影仪器的设计者。

Winfield Hill一位研究科学家,Rowland科学研究所(由Edwin land创立)电子工程室主任。研究人眼彩色视觉的生理学与表象学。他也曾在哈佛大学工作,并设计了100多种电子与科学仪器。然后,他创立了Sea Data公司,并作为首席工程师设计了50多种海洋学研究用仪器。他一直致力于深海实验,并撰写了10多篇科研技术文章。

网友书评

电子工程师必读
2015年更新的第三版,补充了自1989年第二版以来电子学领域的各种进展,删掉了过时的内容。仅那几个大师级设计的章节,比如以安捷伦34401电路为例介绍精密电路和ADC,就值这个价了。
紧跟时代的经典
买的是Z实惠版本,其实跟全新的也没两样啦。内容方面被奉为《圣经》就毋庸置疑了,关键是紧跟时代的update。当一张有比例尺的电阻实物照片出现,我就五体投地了
内容丰富
内容十分丰富全面的一本电子学方面的专业书籍,值得拥有。
物超所值
我曾拜读过paul horowitz的第二版the art of electronics这本书,拿到这本书后,我发现里面的内容有了很大的更新。
图书的品质是毋庸置疑的,大致翻了一下,它的内容丰富而不繁杂,知识排布合理。
推荐大家购买。其实这本书也不贵,少去馆子吃两顿就有了。
补习电子学宝典
电子基础不足 用经典来补 内容没什么好说的 一定优秀 eevblog adafruit大力推荐

获取高清完整版PDF

分享地址

https://pan.baidu.com/s/1uf_IPr5Wq4IXamtGMAX_lQ

如微信无法付款,请点击以下网址使用浏览器打开,使用支付宝付款获取分享码:
https://sns.io/sell/NGNYS8B9