Hallo zusammen, bin noch relativ neu im Thema Microcontroller und komme derzeit einfach nicht weiter. Ich will ganz simpel ein kleines Auto einer Linie folgen lassen, dazu habe ich mir einen Atmage32 genommen einen L293D wegen der integrierten freilafdioden für die beiden DC Motoren 2 CNY70 für die Linienerkennung und zu guter letzt 2 IS471F als Hinderniserkennung. Die Hinderniserkennung klappt tadedellos die ansteuerung des L293D ebenfalls, das Problem ist das ich vermutlich einen denkfehler habe bei der ADC wandlung. Die CNY70 geben bei weiß ca. 0.09V und bei Schwarz 1.35V raus Diese habe ich auf PA0 und PA1 gelegt. Nur mit der Auswertung mache ich wohl was falsch. Wäre schön wenn mit mal einer einen Ansatz geben könnte. #include <avr/io.h> #include <stdio.h> #include <inttypes.h> #define F_CPU 8000000UL #include <util/delay.h> #include "ADC.h" void ADC_Init(void); uint16_t ADC_Read(uint8_t channel); int main(void) { int taster=0; uint16_t adcval; // Buffervariable fuer ADC ADC_Init(); // ADC initialisieren //----Bodensensoren---------------------------------------------------- DDRA &= ~(1 << PA0); // ADC Sensor 1 DDRA &= ~(1 << PA1); // ADC Sensor 2 //----Motor Links------------------------------------------------------ DDRC |= (1 << PC0); // Ausgang Motor Treiber 1A DDRC |= (1 << PC1); // Ausgang Motor Treiber 2A //----Motor Rechts----------------------------------------------------- DDRC |= (1 << PC2); // Ausgang Motor Treiber 3A DDRC |= (1 << PC3); // Ausgang Motor Treiber 4A Sensoren--------------------------------------------------- DDRB &= ~(1 << PB3); // Eingang Abstandssensor 1 PORTB |= (1 << PB3); // Pullup PB3 DDRB &= ~(1 << PB4); // Eingang Abstandssensor 2 PORTB |= (1 << PB4); // Pullup PB4 //----PWM Ausgänge----------------------------------------------------- DDRD |= (1 << PD4); // PWm Port PD4 OC1B DDRD |= (1 << PD5); // PWM Port PD5 OC1A //----Timer 1 für PWM-------------------------------------------------- TCCR1A = (1 << WGM11) |(1<<COM1A1) |(1<<COM1B1); TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10); ICR1 = 255; while(1) { //----Schleife Abstandssensor mit Bodensensor Abschaltung und Freigabeabbruch für die Motoren if ((PINB & 1<<PINB4) && (PINB & 1<<PINB3)) // PB3 oder PB4 High { PORTC &= ~( (1<<PC0) | (1<<PC2) ); // Ausgang auf Low gesetzt PORTC |= (1<<PC1) | (1<<PC3); // Ausgang auf High gesetzt } else // PB3 oder PB4 Low { PORTC &= ~( (1<<PC0) | (1<<PC2) ); // Ausgang auf Low gesetzt PORTC &= ~( (1<<PC1) | (1<<PC3) ); // Ausgang auf Low gesetzt } // Kanal 0, Motor Regelung links adcval = ADC_Read(1); { if((adcval >=0) && (adcval <=102)) { OCR1B = 120; } und so weiter else { OCR1B = 225; OCR1A = 0; } } // Kanal 1, Einzelmessung Motor Regelung rechts adcval = ADC_Read(0); // Kanal 1, Motor Regelung rechts { if((adcval >=0) && (adcval<=102)) { OCR1A = 150; } und so weiter } else { OCR1A = 255; OCR1B = 0; } } } void ADC_Init(void) { uint16_t result; ADMUX = (1<<REFS0); ADCSRA = (1<<ADPS1) | (1<<ADPS2);= 125kHz ADCSRA |= (1<<ADEN); ADCSRA |= (1<<ADSC); while (ADCSRA & (1<<ADSC)) {} result = ADCW; } uint16_t ADC_Read(uint8_t channel) { uint8_t i; uint16_t result = 0; ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); // Auswahl des Kanals, andere Bits dabei nicht beeinflussen ADCSRA |= (1<<ADSC); while (ADCSRA & (1<<ADSC)); // Jetzt 2x die analoge Spannung and Kanal channel auslesen // und dann Durchschnittswert ausrechnen. for(i=0; i<2; i++) { ADCSRA |= (1<<ADSC); while(ADCSRA & (1<<ADSC)); result += ADCW; } result /= 2; return result; }
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.