[电子技术]电压显示


20141207_200846

直接使用AVR的ATMega328,也就是说不使用Arudino。
上传程序使用USBASP,之后没有使用FT232RL之类的。
因为实施的方法是先在别的板子上调试(对,实际上是Arudino),然后再上传到实际集成电路中。这样的方法对AVR的芯片都可以,一般语法没有太大区别。

上传时的图

20141207_155957

做一个简单的D13 LED测试。

20141207_163014

电压显示使用ATMega328自带的模拟输入。使用一个简单的分压电路做出一个可调电路,实际上就是测量变阻器两边的电压。
数字显示,使用4位数字显示。实际使用三位。没有驱动芯片。直接用4路(实际是3路)选择数字,74HC595控制每个数字的显示。也就是靠视觉残留显示出来。

没连线时的图。

20141207_201513

连好线了。

20141207_200909

相比于一开始做Arduino,现在已经熟练很多了。靠这种实验板到实际电路的转换,如果现在这块面包板是PCB的话,也算是一种成品吧。

实际代码

#define PIN_DATA 6
#define PIN_LATCH 8
#define PIN_CLOCK 10

#define PIN_D_2 4
#define PIN_D_3 3
#define PIN_D_4 2

byte digits[] = {252, 96, 218, 242, 102, 182, 190, 224, 246, 238};

void setup() {
  Serial.begin(9600);
  
  pinMode(PIN_DATA, OUTPUT);
  pinMode(PIN_LATCH, OUTPUT);
  pinMode(PIN_CLOCK, OUTPUT);
  
  pinMode(PIN_D_2, OUTPUT);
  digitalWrite(PIN_D_2, HIGH);
  
  pinMode(PIN_D_3, OUTPUT);
  digitalWrite(PIN_D_3, HIGH);
  
  pinMode(PIN_D_4, OUTPUT);
  digitalWrite(PIN_D_4, HIGH);
}

void loop() {
  // read voltage
  int analogValue = analogRead(0);
  float voltage = 0.0048 * analogValue;
  byte numbers = voltage * 100;
  
  for(byte i = 0; i < 20; i++) {
    displayNumber(numbers / 100, true, PIN_D_2);
    displayNumber((numbers % 100) / 10, false, PIN_D_3);
    displayNumber(numbers % 10, false, PIN_D_4);
  }
}

void displayNumber(byte n, bool withPoint, byte pin) {
  digitalWrite(pin, LOW);
  digitalWrite(PIN_LATCH, LOW);
  shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, digits[n] + (withPoint ? 1 : 0));
  digitalWrite(PIN_LATCH, HIGH);
  delay(10);
  digitalWrite(pin, HIGH);
}