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 | }
|