Hallo Leute,
ich habe folgendes Problem:
Ich möchte mit meiner Magnetsteuerung (s. Datenblatt im Anhang) eine
Spannung messen, die von einer Kraftmessdose erzeugt wird. Als
Analogeingang nehme ich den ADC5 des Microcontrollers.
Ich habe dazu ein C-Programm geschrieben (siehe Anhang). Als
Referenzspannung für den ADC Converter habe ich die internen 2,56 V des
Microcontrollers genommen.
Gemäß meinem Programm soll die Lampe auf dem Mirkocontroller leuchten,
sobald eine Spannung von >= 2,5 V an dem Analogeingang ADC5 (Komport
Link 2 auf der Magnetsteuerung) gemessen wird.
Mein Problem ist, dass sie sofort leuchtet, sobald nur die geringste
Spannung (z.B. Finger ranhalten) an dem Eingang anliegt.
Hat da vllt. jemand eine Idee, woran dies liegen könnte? Ich weiß auch
nicht, an welchen Analogeingang ich die Kraftmessdose noch anschließen
kann, da sämtliche Analogeingänge von der Magnetsteuerung belegt weden
:/..
1 | #include <avr/io.h>
|
2 | #define F_CPU 8000000UL
|
3 |
|
4 | void ADC_Init(void)
|
5 | {
|
6 | // die Versorgungsspannung AVcc als Referenz wählen und ADC0 als Input Kanal auswählen:
|
7 | //ADMUX = (1<<REFS0);
|
8 | // oder interne Referenzspannung als Referenz für den ADC wählen:
|
9 | ADMUX = (1<<REFS1) | (1<<REFS0);
|
10 |
|
11 | // Bit ADFR ("free running") in ADCSRA steht beim Einschalten
|
12 | // schon auf 0, also single conversion
|
13 | ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) ; // Frequenzvorteiler auf 128 stellen; TFmin = 40M TFmax= 160
|
14 | ADCSRA |= (1<<ADEN); // ADC aktivieren
|
15 |
|
16 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
17 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
18 |
|
19 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
20 | while (ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung warten
|
21 | }
|
22 | /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
|
23 | Wandlung nicht übernommen. */
|
24 | (void) ADCW;
|
25 | }
|
26 |
|
27 | /* ADC Einzelmessung */
|
28 | uint16_t ADC_Read( uint8_t channel )
|
29 | {
|
30 | // Kanal waehlen, ohne andere Bits zu beeinflußen
|
31 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
|
32 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
33 | while (ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung warten
|
34 | }
|
35 | return ADCW; // ADC auslesen und zurückgeben
|
36 | }
|
37 |
|
38 | int main( void )
|
39 | {
|
40 | uint16_t adcval;
|
41 | ADC_Init();
|
42 | DDRD |= (1<<4);
|
43 |
|
44 | do {
|
45 | adcval = ADC_Read(5); // Kanal ADC5 auswählen
|
46 | if (adcval >= 1000)
|
47 | {
|
48 | PORTD |= (1<<4);
|
49 | }
|
50 | else
|
51 | {
|
52 | PORTD &= ~(1<<4);
|
53 | }
|
54 | } while( 1 );
|
55 | }
|