Servus,
ich bräuchte bitte mal eure Hilfe. Bekomme den Temperatursensor nicht
zum laufen, vielleicht fällt ja jemanden von euch etwas auf..
Die Beschaltung sieht wie folgt aus:
1 | AVR läuft mit 24Mhz, keine Interrupts aktiv
|
2 | 2x 1000uF zwischen + und GND
|
3 | AVDD(14) = 3,3V
|
4 | GND(15) = GND
|
5 | PORTF1 RXD -- ESP8266
|
6 | PORTF0 TXD -- ESP8266
|
7 | PORTA1 RXD -- PC
|
8 | PORTA0 TXD -- PC
|
9 | PORTD0 LED (mit Vorwiderstand)
|
10 | PORTD1 LED (mit Vorwiderstand)
|
Nutze ich statt des Temperatursensors einen ADC Eingang erhalte ich
erwartete Werte des eingangs. Der Temperatursensor hingegen gibt immer
2047 aus.
Der Code zur Initialisierung
1 | void adc_init()
|
2 | {
|
3 | VREF.ADC0REF = VREF_REFSEL_2V048_gc;
|
4 |
|
5 | ADC0.CTRLC = ADC_PRESC_DIV4_gc;
|
6 | ADC0.CTRLA = ADC_ENABLE_bm | ADC_RESSEL_12BIT_gc | ADC_FREERUN_bm;
|
7 | ADC0.MUXPOS = ADC_MUXPOS_TEMPSENSE_gc;
|
8 | //ADC0.MUXPOS = ADC_MUXPOS_AIN0_gc; <-Testeingang mit dem es funktionierte
|
9 | ADC0.COMMAND = ADC_STCONV_bm;
|
10 | }
|
Auswertung,
mir geht es erstmal um den rohen ADC Wert, die Berechnung ist mir
vorerst wurst und steht so im Datenblatt beschrieben, nehme es aber hier
trotzdem mit zwecks der Vollständigkeit.
1 | void adc_temperature(Adc *adc)
|
2 | {
|
3 | if(adc->count == 0)
|
4 | {
|
5 | //ADC0.COMMAND = ADC_STCONV_bm; <- nicht benötigt da Freerun
|
6 | adc->count = 1;
|
7 | }
|
8 | if(adc->count == 1)
|
9 | {
|
10 | if(ADC0.INTFLAGS & ADC_RESRDY_bm)
|
11 | {
|
12 | adc->adc_raw = ADC0.RES;
|
13 | adc->temp = SIGROW.TEMPSENSE1 - adc->adc_raw;
|
14 | adc->temp *= SIGROW.TEMPSENSE0; // Result will overflow 16-bit variable
|
15 | adc->temp += 0x0800; // Add 4096/2 to get correct rounding on division below
|
16 | adc->temp >>= 12; // Round off to nearest degree in Kelvin, by dividing with 2^12 (4096)
|
17 | adc->result = adc->temp - 273;
|
18 | adc->ready = 1;
|
19 | adc->count = 0;
|
20 | }
|
21 | }
|
22 | }
|
Aufruf im main()
1 | static Adc adc = { 0 };
|
2 | adc_init();
|
3 |
|
4 | while(1)
|
5 | {
|
6 | if(adc.ready)
|
7 | {
|
8 | uart_string(calca32(adc.result)); //Convertierung Int zu String, Ausgabe 2047
|
9 | uart_string("\r\n\r\n");
|
10 | adc.ready = 0;
|
11 | }
|
12 | else { adc_temperature(&adc); }
|
13 |
|
14 | }
|
Habe irgendwann mal im Internet gesucht und als Referenz diese Seite
gefunden:
https://github.com/microchip-pic-avr-examples/avr128da48-using-12-bit-adc/blob/master/avr128da48-using-12-bit-adc/ADC_Temperature_Measurement/main.c
Die machen es fast genauso aber bei mir hald ohne Funktion..
Danke euch.
BG
Stored