Guten Abend,
Ich versuche für den Anfang mit unten aufgeführten Code ein D/A Wandler
(LTC1257 12 bit) anzusteuern (0-10V ausgeben), allerdings funktioniert
das nicht zu 100% so richtig.
ich habe
als variable mit der ich bis zu 12bit an den Wandler senden will.
Jetzt ist es so, wenn ich 0x0fff sende gibt er mir 10V aus und bei
0x0000 natürlich 0V, will ich aber jetzt irgendeinen belibigen Wert
dazwischen annehmen zb. die Hälfte von (12bit 4095) 0x0800 fällt er mir
nicht wie gewüscht auf 5V sondern auf 0V
Was kann ich denn da machen das er es richtig ausgibt ?
1 | /*
|
2 | * LTC1257_2.c
|
3 | *
|
4 | * Created: 23.02.2019 17:06:43
|
5 | * Author : USER
|
6 | */
|
7 |
|
8 | /* soft_serial_01.c ATmega88 @ 16MHz */
|
9 |
|
10 | #define F_CPU 16000000UL
|
11 | #include <avr/io.h>
|
12 |
|
13 | void soft_serial (uint16_t data) // Funktion soft_serial
|
14 | {
|
15 | for (uint8_t i=0; i<=11; i++) // for-Schleife 8 mal ausführen
|
16 | {
|
17 | if (data & 1) // Wenn data an Stelle 0 = 1
|
18 | PORTD |= (1<<PD0); // Data serial = 1
|
19 | else
|
20 | PORTD &= ~(1<<PD0); // Data serial = 0
|
21 |
|
22 | PORTD |= (1<<PD1); // PD1 = 1 (CLK = low)
|
23 | PORTD &= ~(1<<PD1); // PD1 = 0 (CLK = high)
|
24 |
|
25 | data = data >> 1; // data um 1 Stelle nach rechts schieben
|
26 | }
|
27 | }
|
28 |
|
29 | int main(void)
|
30 | {
|
31 | uint16_t data = 0x0800; // data = Variable für Register 0x0FF1
|
32 | DDRD = 0xFF; // Richtungsregister PORTD = Ausgang
|
33 | PORTD = 0x04; // PD2 (RCK) = HIGH, 0x04 = 0000 0100
|
34 |
|
35 | while(1)
|
36 | {
|
37 | soft_serial(data); // Funktionsaufruf und Übergabe von data
|
38 | PORTD &= ~(1<<PD2); // PD2 = 0 (Takt = LOW für RCK)
|
39 | PORTD |= (1<<PD2); // PD2 = 1 (Takt = HIGH für RCK -> Ausgabe Schieberegister)
|
40 | }
|
41 | }
|