Hallo Leute,
ich hab folgende Hardware:
PWM Ausgang von Attiny13: PB0
1k POTI an VCC / GND, Schleifer an PB4
Nun möchte ich den Wert vom POTI per ADC abfragen und ihn prozentual als
PWM ausgeben. Also je nach POTI Stellung den Duty Cicle der PWM ändern.
Folgender Code funktioniert leider nicht, vielleicht kann mir jemand auf
die Sprünge helfen und ein bisschen was dazu sagen. Wäre nett.
ADC schrieb:> ADCSRB = ~(1 << ADTS2) | ~(1 << ADTS1) | ~(1 << ADTS0); // Free Running Mode
Also wenn Du free running nimmst, wo ist dann die passende ISR ?
while(ADCSRA&(1<<ADSC)){;};// auf Abschluss warten
92
result=ADCW;// Ergebnis muss einmal gelesen werden sonst wird die nächste Wandlung nicht übernommen
93
94
}
95
96
// ADC Einzelmessung
97
uint16_tADC_Read(uint8_tchannel){
98
99
// Kanal wählen
100
ADMUX=(ADMUX&~(0x1F))|(channel&0x1F);
101
ADCSRA|=(1<<ADSC);// eine Wandlung
102
while(ADCSRA&(1<<ADSC)){;};// auf Ergebnis warten
103
104
returnADCW;// Ergebnis zurückgeben
105
106
}
Jedoch bekomme ich immer noch kein PWM Signal aus PB0. Sobald ich aber
mit dem Finger an die Pins PB1 / PB2 komme, so bekomme ich ein PWM
Signal. Folglich muss was an meiner ADC Routine falsch sein oder?
// PWM Output definieren
set_bit(PWM_Output_DDR, PWM_Output_Bit);
// ADC Input definieren
set_bit(POTI_Input_DDR, POTI_Input_Bit);
Interessant: Eingang und Ausgang werden also
mit einer Eins im DDR gesetzt? ;)
ADMUX=~(1<<REFS0)|(1<<MUX1)|~(1<<MUX0);// VCC als Referenz, PB4 (ADC2) als Input
1
ADMUX=~(1<<REFS0);
Da ist offenbar Nachholbedarf für Bit-Arithmetik, denn keine dieser
Zeilen macht das, was von dir beabsichtigt ist. Die ADMUX-Zeile z.B.
setzt das ADLAR-Bit.
1
adc_percent=adc_in/1024*100;
2
3
pwm_value=adc_percent/100*255;
Und auch bei der Integer-Arithmetik hapert es. Dass zur Zeit überhaupt
irgendwelche unterschiedlichen Werte in pwm_value stehen, liegt an der
fehlerhaften ADMUX-Zeile. Wenn die erst mal korrigiert ist, steht da
immer nur 0 drin.
Stefan Ernst schrieb:> adc_percent = adc_in / 1024 * 100;>> pwm_value = adc_percent / 100 * 255;Und auch bei der Integer-Arithmetik
hapert es. Dass zur Zeit überhaupt
> irgendwelche unterschiedlichen Werte in pwm_value stehen, liegt an der> fehlerhaften ADMUX-Zeile. Wenn die erst mal korrigiert ist, steht da> immer nur 0 drin.
Das kommt davon wenn man noch auf dem PC denkt, wo Floatberechnungen ja
kein Problem sind. facepalm
Ok, das Problem mit dem Finger und dem Wert habe ich nun behoben. Mal
wieder ein peinlicher Fehler den man selber nicht sieht. VCC vom Attiny
nicht angeschlossen.
Jedoch gibt mein ADC immer noch nix zurück jmd eine Idee?
Hi,
mich würde interessieren wie die Umrechung in Prozent denn nun aussieht?
Würdest du den kompletten, funktinoierenden Code nochmal posten?
Danke!
Gruß
Ich habe einen viel einfacheren Weg gewählt.
Ein 10bit Wert geht ja von 0 - 1023 und ein 8bit Wert von 0 - 255. Das
einfachste zum umwandeln ist dann einfach durch 4 zu teilen.
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.