Hallo jawo3,
der Code soll stellvertretend sein (merke gerade, dass nicht der rp6, sondern der Asuro gemeint war, deshalb müssten evtl. die Register-Einstellungen geändert werden).
Ersteinmal die Spannungsteiler - Berechnunge (ohne Spannungsteiler darf höchstens bis zur Referenzspannung gemessen werden):
https://www.roboternetz.de/phpBB2/ze...ler+berechnung
Variable:
Code:
uint8_t bPortd,adc;
float adc_result;
char puffer_tostr[20];
init (Register setzen):
Code:
void adc_init(void)
{
ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Teilungsfaktor 73.728 <= X <= 294,912 ---> X=128
/* ADMUX &=~ ((1<<REFS1) | (1<<REFS0)); // ---> Referenzspannung off */
}
messen:
Code:
float adc_Kanal_messen(uint8_t mux)
{
adc_result = 0;
ADMUX = mux; // Kanal waehlen und VCC=Referenzspannung
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung starten
while ( ADCSRA & (1<<ADSC) ) {;} // auf Abschluss der Konvertierung warten
adc_result = ADCW; // ADCW muss einmal gelesen werden
adc_result = 0; // Dummy -> adc_result nullen
for( adc=0; adc<4; adc++ ) // 4x eine ADC-Wandlung durchführen
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {;} // auf Abschluss der Konvertierung warten
adc_result += ADCW; // Wandlungsergebnisse aufaddieren
}
adc_result /= 4; // Summe durch vier teilen = arithm. Mittelwert
adc_result = adc_result*(5.00/1023); // 5,00 Volt nach Spannungswanlder gemessen -> wenn kein Spannungsteiler verwendet = Endergebnis
return adc_result;
}
auslesen (zB. im main-Teil):
Code:
adc_Kanal_messen(1); // PORTA1 auswählen
adc_result=adc_result*5.00736; // 5,00736 = bei den gewählten Widerständen bester Wert (vom Spannungsteiler)
dtostrf(adc_result,2,2,puffer_tostr); // float to string umwandlung -> LCD und UART Ausgabe (verständlich Zeichen)
/*
lcd_gotoxy(0,1);
lcd_puts("Spannung: ");
lcd_puts(puffer_tostr);
lcd_puts(" Volt \n\r");
*/
Habe den Code nochmal besser kommentiert (am besten in einen Editor wie Programmers Notepad kopieren -> besser lesbar).
Die LCD Kommandos wurden ausgeklammert.
Der Code oben ist für einen Atmega32 (Register könnten andere sein).
Wie o.g. ist es hier recht gut erklärt:
http://www.mikrocontroller.net/artic...l_Converter.29
Gruß
Stefan
Lesezeichen