www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Gleitkomma Datentyp?


Autor: Fztz Tztrz (Firma: tztz) (kkkko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe eine variable mit:

uint16_t x = 0;

und bekomme oft gleitkommawerte z.B.:

 x = ADC()/1000 = 1 //bei adc =1000
oder

x = ADC()/1000 = 0.5 //bei adc =500

welcher datentyp wird verwendet um auch gleitkommazahlen zu lesen. oder 
wie trickst ihr?

grüse

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
float? oder double? ;)

Autor: Der Beobachter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
float

Autor: Der Beobachter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hat sich einer vorgedrängt.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Fztz Tztrz (Firma: tztz) (kkkko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bins nochma…
ich bednutze den adc channel und lege zurzeit eine spannung von 0 bis 5 
V an den ADC0.
Habe mal einen multimeter drangehangen und der adc scheint sich bei <1,5 
V aufzuhängen. Von 1,55 V bis ca. 5V arbeitet er ganz normal aber unter 
1,55 macht er plötzlich gar nix mehr. Weiss jemand woran das liegen 
könnte?
Habe mein AVCC auf VCC gelegt und über einen 100 nF zum GND geschaltet.

dachte bisher es würde am datentyp liegen :(

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie groß ist denn deine Auflösung? Ich setze mal 1000 mit 1024 gleich, 
dh. 10Bit.
Wenn du 12 Bit Auflösung hast, dann sind 2Bit nach der Division übrig.
5/4 = 1,25V pro Bit. Ab da ist nix mehr mit Wert. Rest kann vom Offset 
und der Genauigkeit abhängen. Wenn dann rechne mit float.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benjamin S. wrote:

> und der Genauigkeit abhängen. Wenn dann rechne mit float.

Oder versuch die Berechnung umzustellen.
Division schiebt man so weit wie möglich in einer Fomral nach rechts. 
Aber aufpassen, dass Zwischenmultiplikationen nicht überlaufen können.

Am besten aber, du zeigst erst mal dein Programm.

Autor: Fztz Tztrz (Firma: tztz) (kkkko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

die auflösung ist 10 bit, ich benutze einen atmega8L.

hier ist der code:

ich schaffe es immernoch nicht unterhalb von 2 volt mit dem adc was 
einzulesen..nur von 2volt bis ca 5 volt liest er. aber darunter geht gar 
nix.

#include <avr/io.h>
//#ifndef F_CPU
/* prevent compiler error by supplying a default */

//#define F_CPU 1000000UL
//#endif
#include <util/delay.h>


uint16_t adc_val = 0;

//::::ADC kanal auslesen::::///////////////////////////////////////////////////////////////

uint16_t ReadADC(uint8_t mux)
{
  uint8_t i;
  uint16_t result;
 
  ADMUX = mux;                                      // Kanal waehlen (ADC0)
  ADMUX |= (0<<REFS1) | (1<<REFS0);                 // AVCC als Referenzspannung nutzen
  ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);                
  ADCSRA &= ~((1<<ADPS0) | (1 << ADFR));                                            
 

//// First Read Out um den ADC warmlaufen zu lassen ////////////////////////////////
  ADCSRA |= (1<<ADSC);                              // Start ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {
     ;                           
  }
  result = ADCL;
  result += (ADCH << 8);                      // ADCW muss einmal gelesen werden,                 
  result = 0;                             // Ergebniss löschen

//// Eigentliche Messung , Nur eine Messung///////////////////////////////////////////////////////////
  
  for( i=0; i<1; i++ )
  {
    ADCSRA |= (1<<ADSC);            
    while ( ADCSRA & (1<<ADSC) ) {
      ;   
    }
  result = ADCL;
      result += (ADCH << 8);         
    }
    ADCSRA &= ~(1<<ADEN);             
 
    //result /= 4;                    
 
    return result;
}

///// Delay function (delay needs a constant value/////////////////////////////////////////////////////

void delay(uint16_t ms)
{
  uint16_t i;

  for(i=0; i< ms; i++)
    _delay_ms(0.1);
}

///////////////////////////////////////////////////////////////////////////////////////

int main()
{

DDRD |= (1 << PD0) | (1 << PD1);      
DDRD &= ~((1 << PD4));    



while(1)  
{
  adc_val = (ReadADC(0)/30);    //0...1000 : Umrechnung z.B. adc wert = 1000 -> (1000/30) Multipliziert mit _delay_ms(0.1) = ca. 3,3 ms Maximal
    
  
//:::::::::::::::::::::::::::::::::<< Blink LED >>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://////
  
  if ( (PIND & (1<<PIND4)))  //wenn Schalter ON
  {  
    PORTD |= (1<<PD0);     
    delay(adc_val); 
    PORTD |= (1<<PD1);
    delay(adc_val);
    PORTD &= ~(1<<PD0);
    delay(adc_val); 
    PORTD &= ~(1<<PD1);
    delay(adc_val);
    
  }
  else PORTD &= ~(1<<PD0);



}//while

return 0; 

}//main()

zusatz Frage: werden alle ADC werte für das delay verwendet oder nur 
nach der nächsten abfrage? zum beispiel wenn der adc den ersten wert 
ausliest, von mir aus für 1ms...dann dauert das blinken 4 ms mit ein und 
ausschaltphasen.....d.h im endeffekt dass zu diesem zeitpunkt 
wahrscheinlich ein anderer wert als 2 ms gelesen wird oder? oder 
arbeitet das delay wirklich jeden einzelnen gemessenen wert ab?
P.S.: Bin laie in diesem gebiet...

Autor: Fztz Tztrz (Firma: tztz) (kkkko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nobody knows? :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.