Forum: Mikrocontroller und Digitale Elektronik Problem mit CNY70 und Motorregelung


von Marcel M. (hurrykane)


Lesenswert?

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
Noch kein Account? Hier anmelden.