Forum: Mikrocontroller und Digitale Elektronik ADC 0,5-5v statt 0-5v für Dimmer


von Markus M. (iceagekommt)


Lesenswert?

Hallo zusammen,
Mein Aquaristik-computer hat einen 1-10V Ausgang will damit meine Lampe 
dimmen. Habe einen Spannungsteiler eingesetzt und somit 0,5-5v die ich 
an PA0 bzw PA1 eingebe und dann der MC ein PWM Signal für meine 
Konstantstromquelle ausgeben lasse!
Das Programm funktioniert soweit bis auf das der ADC von 0-5V aufteilt.
Das heist im Klartext:
Bei 0% in meinem Aquarium Computer = 0v LED glimmt ganz leicht.
Bei 1% schießt er dann sofort 0,5v rein und die LED leuchtet dann ja 
schon mit ca. 10%(5v/100x10=0,5v)

Wie bekomme ich es jetzt hin das der ADC von 0,5 - 5V ausgeht und nicht 
wie bis jetzt von 0-5v???????

Verwende einen Atmega 8535 TAkt 8 MHz
Referenzspannung 5v

Hoffe es kann jemand helfen.

#include <avr/io.h>
#include <stdio.h>

unsigned char adc_read8(char channel);

int main(void)
{

  //PD4,5 output
  DDRD = (1<<DDD4) | (1<<DDD5);

  //TIMER 1
  ICR1 = 255;
  TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<< WGM11);   //Fast PWM, TOP = 
ICR1, Clear on Compare Match
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1 << CS12);     //Fast PWM, 
Prescaler 256


  //ADC
  ADMUX = (1<<REFS0) | (1<<ADLAR);       //VRef = AVCC
  ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADEN);       // 125 kHz @ 8 
Mhz, ADC enabled
  ADCSRA |= (1<<ADSC);
  while (ADCSRA & (1<<ADSC));

  unsigned int i = 0;
  while(1)
  {
    if (~i)
    {
      OCR1A = adc_read8(PA0);
      OCR1B = adc_read8(PA1);

    }
    i++;
  }
}

unsigned char adc_read8(char channel)
{
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
  ADCSRA |= (1<<ADSC);
  while (ADCSRA & (1<<ADSC));
  return ADCH;
}

von holger (Gast)


Lesenswert?

>Wie bekomme ich es jetzt hin das der ADC von 0,5 - 5V ausgeht und nicht
>wie bis jetzt von 0-5v???????

Zieh die 0,5V einfach von deinem ADC Ergebnis ab.

von Markus M. (iceagekommt)


Lesenswert?

Danke für die Antwort aber wie soll ich das im Programm umsetzen??

: Bearbeitet durch User
von H.Joachim S. (crazyhorse)


Lesenswert?

if ADC >= 25
   ADC=ADC-25
   PWM=ADC*11/10
else PWM=0

Pseudocode :-)

von Mike (Gast)


Lesenswert?

Markus Mois schrieb:
> Wie bekomme ich es jetzt hin das der ADC von 0,5 - 5V ausgeht und nicht
> wie bis jetzt von 0-5v???????

Indem du das ADC Wandlungsergebnis noch einmal umrechnest, bevor du den 
Wert zum Steuern der PWM verwendest.
Das einfachste wäre die schon vorgeschlagene Nullpunktverschiebung 
(Offset). Damit die Steuerung bei geringer Helligkeit nicht zu stufig 
wird und zu schnell hell wird, kann man auch z.B. eine Tabelle mit 
Interpolation verwenden, mit der man eine beliebige Kennlinie (ADC Wert 
-> Helligkeit) realisieren kann.

von Markus M. (iceagekommt)


Lesenswert?

Muss leider sagen das ich Leihe bin wo genau soll ich den Pseudocode 
einsetzen?? Muß ich sonst noch was am Proramm ändern?
Danke schon mal!

: Bearbeitet durch User
von H.Joachim S. (crazyhorse)


Lesenswert?

ne, oder?

unsigned int temp;

temp=adc_read8(PA0);
if (temp>25)
   temp=(temp-25)*11/10;
else temp=0;
OCR1A=temp;

Und (fast) dasselbe noch mal für OCR1B.
Zum Berechnen brauchst du eine 16bit-B´Variable (temp), weil du sonst 
bei der Multiplikation einen Überlauf hättest.

von Markus M. (iceagekommt)


Lesenswert?

H.Joachim Seifert schrieb:
> ne, oder?
Kann auch nichts dafür bin schon über ne Woche am rumsuchen und versteh 
immer noch Bahnhof.

: Bearbeitet durch User
von Markus M. (iceagekommt)


Lesenswert?

Habs mit rein und es funzt wunderbar. Dank Euch!

von Mike (Gast)


Lesenswert?

Markus Mois schrieb:
> Muss leider sagen das ich Leihe bin

Markus Mois schrieb:
> Habs mit rein und es funzt wunderbar. Dank Euch!

Prima, dass es so einfach mit geliehenem Code geht ;-)

von Markus M. (iceagekommt)


Lesenswert?

Mike schrieb:
> Markus Mois schrieb:
> Muss leider sagen das ich Leihe bin
>
> Markus Mois schrieb:
> Habs mit rein und es funzt wunderbar. Dank Euch!
>
> Prima, dass es so einfach mit geliehenem Code geht ;-)

Hab natürlich Laie gemeint! Ja es gibt freundliche Forum Mitglieder die 
gerne helfen! Alleine bin ich zu unerfahren bring zwar in bascom ein 
bißchen was zustande aber mehr auch nicht. Und nein falls du meinst ich 
hab ihn irgendwo einfach rauskopiert. Er wurde von einem Forum Mitglied 
für mich ausgearbeit!

von H.Joachim S. (crazyhorse)


Lesenswert?

Du solltest dennoch versuchen zu verstehen, was da so im einzelnen 
passiert, wenn du irgendwas in der Richtung weitermachen willst.
Bist du mehr der Aquarianer, für den das nur eine funktionierende 
blackbox ist (also Lösung eines Problems ist die primäre Aufgabe, ohne 
wissen zu wollen, was dahinter steckt) ist das auch in Ordnung.

von Markus M. (iceagekommt)


Lesenswert?

danke für die ehrlichen Worte!Will natürlich was in die Richtung weiter 
machen da mich das ganze Thema sehr interessiert und fasziniert! Aber es 
ist nicht so einfach wenn man von 0 anfängt.
LED blinken lassen lauflicht usw. bring ich schon hin. Aber für die 
Dimmersteuerung hab ich einfach nicht gewusst wie ich ansetzen soll!

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.