-
        

Ergebnis 1 bis 7 von 7

Thema: PWM über Poti steuern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    30.09.2013
    Beiträge
    6

    PWM über Poti steuern

    Anzeige

    Hallo zusammen

    Es handelt sich um folgendes:

    Atmega32
    externer 8 MHz Quarz
    PWM erzeugung zur ansteuerung einer MOSFET-Treiberstufe für einen 30cm RGB-Streifen (Hardwaretechnisch alles einwandfrei aufgebaut)

    Um Euch mein Problem näher schildern zu können erkläre ich euch zunächst meine IST-Situation :


    Ich habe ein C-Programm geschrieben mit dem ich in der Lage bin alle drei Timer (0,1,2) je als 8 Bit Phasencorrecte "PWM-Erzeuger" arbeiten zu lassen. Schreibe ich nun feste Werte in die Outputcompareregister der entsprechenden Timer so kann ich mir die Farben mischen wie ich es gern haben möchte.


    Nun möchte ich die PWM aber nicht durch fixxe Werte vorgeben, sondern über 3 Potis je einen Channel (OCR) ansteuern. Mein derzeitiger Stand ist der, dass ich in der Lage bin die RGB-Farben über die Potis zu verändern, aber leider eben nur, wenn ich die Potis verstelle und anschließend das Programm neu aufspiele....ich hätte es gerne so, dass ich das Programm einmal aufspiele und anschließend direkte Farbwechsel bei Analogwertänderung erzeuge. Ich habe mir schon einiges an Gedacnken gemacht, komme aber leider nicht auf meinen Denkfehler....

    Hier mein aktuelles Programm:

    ----------------------------------------------------------------------------------------------------------------------

    /*
    * RGB_Peavey.c
    *
    * Created: 09.08.2014 13:35:24
    * Author: Zille
    */

    #define F_CPU 8000000

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include "adc.h"

    // Farben der LEDs - Jede beeinflusst eine PWM des ATmega32

    uint16_t R = 0;
    uint16_t G = 0;
    uint16_t B = 0;

    void PWM_init(void)
    {
    // Ausgänge der drei Channels definieren

    DDRB |= (1<<PB3); // 8 Bit OC0
    DDRD |= (1<<PD7); // 8 Bit OC2
    DDRD |= (1<<PD5); // 16 Bit OC1A

    // Timer Einstellungen

    TCCR0 |= (1<<WGM00) | (1<<COM01) | (1<<CS00); // 1.8 Bit Timer: Phase correct PWM Mode, Clear Up - Set down OC0, prescaler 1024 | (1<<CS02)
    TCCR2 |= (1<<WGM20) | (1<<COM21) | (1<<CS20); // 2.8 Bit Timer: Phase correct PWM Mode, Clear Up - Set down OC2, prescaler 1024 | (1<<CS22)
    TCCR1A |= (1<<WGM10) | (1<<COM1A0) | (1<<COM1A1); // 16 Bit Timer: 8 Bit Phase correct PWM Mode, Clear Up -Set down OCR1A,
    TCCR1B |= (1<<CS10); // und prescaler 1024 (1<<CS12) |

    // Compareinterrupts erlauben

    TIMSK |= (1<<OCIE0) | (1<<OCIE1A) | (1<<OCIE2);

    // Interrupts generell erlauben

    sei();
    }


    int main(void)
    {
    // Initialisierungen

    ADC_Init();
    PWM_init();

    // Die drei Poti Eingänge definieren

    DDRA &= ~(1<<PA0);
    DDRA &= ~(1<<PA1);
    DDRA &= ~(1<<PA2);



    while(1)
    {
    R = (ADC_Read(0)/4);
    G = (ADC_Read(1)/4);
    B = (ADC_Read(2)/4);

    OCR0=G; //
    OCR2=R; // Rot
    OCR1A=B; // Blau inverse

    }
    }


    ----------------------------------------------------------------------------------------------------------------------------------------------



    Für jede Hilfe bin ich dankbar

    Wenn etwas fehlt an informationen dann einfach bescheid geben


    Gruß
    Geändert von Zille (19.08.2014 um 06:52 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hi,

    also zuerst fällt mir auf, dass du zwar einen 16MHz angeschlossen hast, dem Programm aber 8MHz mitteilst.
    Um etwas zu deinem eigentlichen Problem sagen zu können, müsste man wohl die ADC_INIT und ADC_READ Funktionen kennen.
    Wenn ich es richtig verstanden habe, wird nur einmalig beim Programmstart der ADC Wert eingelesen und in die PWM-Register geschrieben?
    Achja --- Code am besten in den CodeTags schreiben / hineinkopieren, ist um einiges lesbarer

    Gruß
    Chris

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    30.09.2013
    Beiträge
    6
    Hi,

    hab mich vertan, hab einen 8 MHz Quarz

    Der Analogwert wird in der While-Schleife eingelesen (adc_read) und an die OCR ausgegeben....also eigentlich ständig.
    Die Analogwerterfassung dürfte auch im Freerun stehen, heißt dass er auch ständig neu einließt....


    Wenn ich zuhause bin stelle ich die genauen einstellungen zur Verfügung.

    Gruß

  4. #4
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Hallo!

    Es geht auch ohne µC: "Der 555 erzeugt PWM-Signal" in http://www.domnick-elektronik.de/elek555.htm .
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  5. #5
    Apostel13
    Gast
    Wie soll man dazu etwas sagen, wenn Die Funktionen um die es eigentlich geht, hier nicht ersichtlich sind...?

  6. #6
    Unregistriert
    Gast
    Wie soll man dazu etwas sagen, wenn Die Funktionen um die es eigentlich geht, hier nicht ersichtlich sind...?
    Tja, da könnte mann nur sagen: scrollen, lesen, Ahhhh-sagen. Denn ich lese in der verlinkten Site "Der 555 erzeugt PWM-Signal" . . .

  7. #7
    Apostel13
    Gast
    Was für ein Unsinn. Der Fragesteller hat nicht danach gefragt ob und wie man mit einem 555'er ein PWM-Signal erzeugt, sondern wollte Hilfe bei seinem Code.

    Man kann ein PWM auch mit passiven Elementen und Transistoren erzeugen oder mit einem Schalter und einem Galeerensklaven. Das alles ist aber keine Antwort auf die eigentliche Frage. Aber es ist das nervige an solchen Foren. Antworten auf Fragen, die niemand gestellt hat.

Ähnliche Themen

  1. servoposition über adc(poti) steuern
    Von rocketman123 im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 19.02.2008, 20:57
  2. Antworten: 7
    Letzter Beitrag: 12.07.2006, 01:52
  3. Motor über Poti steuern
    Von FoCus im Forum Elektronik
    Antworten: 22
    Letzter Beitrag: 11.07.2006, 13:12
  4. Pumpe über PWM steuern
    Von Leidi im Forum Motoren
    Antworten: 7
    Letzter Beitrag: 19.05.2005, 09:09
  5. Poti über uC Steuern
    Von Superhirn im Forum Sensoren / Sensorik
    Antworten: 8
    Letzter Beitrag: 28.04.2005, 17:22

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •