Pluggit_Drucksensorboard_V4.ino


1
// Ersatzboard Drucksensor für Pluggit V4
2
// https://www.mikrocontroller.net/topic/477458
3
// Eingesetzer Controller: ATTINY85 / 1MHz int
4
// Sensoren: 2 Stück Sensirion SDP-810-500Pa
5
6
// Erstellt: 15.08.21  Daniel F.
7
8
// neu V2: Testfunktion um beide Ausgänge auf 10V zu schalten
9
// neu V2: Dämpfung des Sensorsignals
10
// neu V3: PWM nun auf Pins 9&10 mit 12bit Auflösung
11
// neu V3: Nachbildung auch von der neueren SDP1000-L05-Platine wenn Pin2 auf GND gesetzt ist
12
// neu V4: Umstellung auf ATTINY85
13
14
15
const int PWM10VS1 = 3960;   //PWM(0...4095) für Justage 10V-Ausgangsspannung Sensor1 (Abgleich Analogschaltung Spannungsverstärker)
16
const int PWM10VS2 = 3960;   //PWM(0...4095) für Justage 10V-Ausgangsspannung Sensor2 (Abgleich Analogschaltung Spannungsverstärker)
17
18
#include <Wire.h>
19
20
volatile int Dac[2];
21
volatile uint8_t* Port[] = { &OCR1A, &OCR1B };
22
volatile int Cycle = 0;
23
24
// Overflow interrupt
25
ISR (TIMER1_OVF_vect) {
26
  static int rem[2];
27
  for (int chan=0; chan<2; chan++) {
28
    int remain;
29
    if (Cycle == 0) remain = Dac[chan]; else remain = rem[chan];
30
    if (remain >= 256) { *Port[chan] = 255; remain = remain - 256; }
31
    else { *Port[chan] = remain; remain = 0; }
32
    rem[chan] = remain;
33
  }
34
  Cycle = (Cycle + 1) & 0x0F;
35
}
36
37
38
void analogWrite12 (int chan, int value) {
39
  cli(); Dac[chan] = value; sei();
40
}
41
42
43
float Druck1=0.0;
44
float Druck2=0.0;
45
int PWM1=0;
46
int PWM2=0;
47
boolean SDP1000L05;
48
49
50
void setup() {
51
  // Timer/Counter1 doing PWM on OC1A (PB1) and OC1B (PB4)
52
  TCCR1 = 1<<PWM1A | 1<<COM1A0 | 1<<CS10;
53
  GTCCR = 1<<PWM1B | 1<<COM1B0;
54
  TIMSK = TIMSK | 1<<TOIE1;
55
  
56
  pinMode(1, OUTPUT);                  //PWM-Ausgang Druck1
57
  pinMode(4, OUTPUT);                  //PWM-Ausgang Druck2
58
  
59
  Wire.begin();
60
  SDP1000L05 = !digitalRead(3);         //wenn Pin3 auf GND dann eine SDP1000L05-Platine (Null=1V) nachbilden 
61
  }
62
63
64
void loop() {
65
66
  multiplexer(0);                       // Schalte I2C-Multiplexer PCA9540B auf Kanal0 (Sensor1)
67
  
68
  Druck1=(Druck1+SDP810lesen())/2.0;    // Drucksensor1 lesen und Dämpfung
69
  
70
  multiplexer(1);                       // Schalte I2C-Multiplexer PCA9540B auf Kanal1 (Sensor2)
71
  
72
  Druck2=(Druck2+SDP810lesen())/2.0;    // Drucksensor2 lesen und Dämpfung
73
74
  if (SDP1000L05) {                                                 //Nachbildung der neuen Platine mit SDP1000L05-Sensoren
75
    PWM1 = mapf(Druck1, -6.43, 146.3, PWM10VS1*0.0825, PWM10VS1/2.0);  //Druckbereich auf Ausgangssignal anpassen
76
    PWM2 = mapf(Druck2, -6.43, 146.3, PWM10VS1*0.0825, PWM10VS2/2.0);  //-6.4Pa=0.825V bis 146.3Pa=5.00V
77
78
    PWM1 = constrain(PWM1, 0, PWM10VS1/2);                          //Wertebereich PWM begrenzen, max 5.0V
79
    PWM2 = constrain(PWM2, 0, PWM10VS2/2); 
80
  }
81
  else{                                                             //Nachbildung der alten Platine mit SMI5552-003-D-Sensoren
82
    PWM1 = mapf(Druck1, -70.0, 284.0, 0.0, PWM10VS1);               //Druckbereich auf Ausgangssignal anpassen
83
    PWM2 = mapf(Druck2, -70.0, 284.0, 0.0, PWM10VS2);               //-70Pa=0.0V bis 284Pa=10.0V
84
    
85
    PWM1 = constrain(PWM1, 0, PWM10VS1);                            //Wertebereich PWM begrenzen, max 10.0V
86
    PWM2 = constrain(PWM2, 0, PWM10VS2); 
87
  }
88
89
  analogWrite12(1, PWM1);   //1=PB4 Sensor1
90
  analogWrite12(0, PWM2);   //0=PB1 Sensor2
91
92
}
93
94
void multiplexer(bool kanal){
95
  Wire.beginTransmission(0x70); // I2C-Multiplexer PCA9540B
96
  Wire.write(0x04+kanal);       // Kanal 0 oder 1
97
  Wire.endTransmission(); 
98
}
99
100
101
float SDP810lesen(){
102
  
103
  int Druck=0;
104
  
105
  // Lesebefehl an Drucksensor (SDP810) senden
106
  Wire.beginTransmission(0x25);   // transmit to device
107
  Wire.write(0x36);               // Measurement triggering
108
  Wire.write(0x2F);               // Measurement triggering
109
  Wire.endTransmission();         // stop transmitting
110
111
  delay(50);                      // Messzeit=45ms
112
113
  // 2 Bytes anfordern
114
  Wire.requestFrom(0x25, 2);      // request 2 bytes from slave device
115
116
  // und lesen
117
  if (2 <= Wire.available()) {
118
    Druck = Wire.read();          // high byte lesen
119
    Druck = Druck << 8;           // nach links schieben
120
    Druck |= Wire.read();         // low byte lesen OR high byte
121
  }
122
  return Druck/56.0;              // anpassen auf Pa (Teiler ist Normal 60, nach Korrektur mit ca 1m 4mm-Schlauch neuer Teiler 56)
123
}
124
125
126
int mapf(float x, float in_min, float in_max, float out_min, float out_max)
127
{
128
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
129
}