PWM Dimmer.....

Dieses Thema im Forum "MSP430 Mikrocontroller" wurde erstellt von The_Scientist, 20. Mai 2013.

  1. The_Scientist

    The_Scientist Neues Mitglied

    Registriert seit:
    26. Februar 2011
    Beiträge:
    91
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Sprachen:
    BascomAVR, C, Assembler
    Also, dass ich in meinem Alter noch mal was jungfraeuliches bekomme....naja zumindest das Forum fuer die 430er :rolleyes:

    Ich wollte einen kleinen PWM-Dimmer meine 12V Halogen Beleuchtung in der Galarie bauen.

    Lange, lange, habe ich diese LaunchPads hier rumfliegen sowie rund 3 Dutzend der kleinsten der MSP430er (MSP430G2001).

    Hier mal mein Erguss (ein Schelm wer boeses dabei denkt) fuer das Programm....

    Code:
    [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055] 
    [/COLOR][/SIZE][/COLOR][/SIZE][/B]
    #include <msp430.h> 
    int pw, old;
    void pulsewidth(int pw);
    int checkbutton(void);
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;
        BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
        DCOCTL = 0x00;
        __delay_cycles(100000);
        DCOCTL = DCO0 + DCO1;
        BCSCTL1 = XT2OFF + DIVA_0 + RSEL0 + RSEL1 + RSEL2 + RSEL3;
        BCSCTL3 = XT2S_0 + LFXT1S_2 + XCAP_1;
        P1OUT = BIT3 + BIT7;
        P1SEL = BIT1 + BIT4 + BIT6;
        P1DIR = BIT1 + BIT4 + BIT6;
        P1REN = BIT3 + BIT7;
        P1IES = 0;
        P1IFG = 0;
        P2OUT = 0;
        P2DIR = 0;
        P2IES = 0;
        P2IFG = 0;
        pw=25;
        for(;;)
        {
            old = pw;
            while(old==pw)
            {
                pw=checkbutton();
            }
            pulsewidth(pw);
        }
    }
    void pulsewidth(int pw)
    {
         TACCTL0 = CM_0 + CCIS_0 + OUTMOD_0 + OUT;
         TACCTL1 = CM_0 + CCIS_0 + OUTMOD_7;
         TACCR0 = 50;
         TACCR1 = pw;
         TACTL = TASSEL_2 + ID_0 + MC_1;
    }
    int checkbutton(void)
    {
        int math1, math2;
        unsigned long z;
        math1 = P1IN;
        math2 = math1 |= 247;
        if(math2 == 247)
            {
            pw++;
            }
        math1 = P1IN;
        math2 = math1 |=127;
        if(math2 == 127)
            {
            pw--;
            }
        if(pw>50)
            {
            pw=50;
            }
        if(pw<1)
            {
            pw=1;
            }
        for(z=0;z<1000000;z++)
                    {
                    }
        return(pw);
    }
    An P1.3 und P1.7 haengen die beiden Taster (Up / Down)
    und an P1.1 liegt das PWM Signal an, welches ich dann entsprechend einem Leistungs FET zugefuehrt habe...

    Geht sicherlich auch besser...aber funktioniert...und sehr preiswert....der Controller liegt bei run 0,30 EUR !!!

    LG

    Klaus
     
  2. The_Scientist

    The_Scientist Neues Mitglied

    Registriert seit:
    26. Februar 2011
    Beiträge:
    91
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Sprachen:
    BascomAVR, C, Assembler
    Irgendwie mag er den Code nicht!

    Also irgendwas habe ich falsch gemacht beim einfuegen des Codes...

    hier mal ohne CODE-Tags


    #include​

    <msp430.h>
    int​
    pw, old;
    void​
    pulsewidth(int pw);
    int​
    checkbutton(void);
    int​
    main(void){WDTCTL = WDTPW | WDTHOLD;BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;DCOCTL = 0x00;__delay_cycles(100000);DCOCTL = DCO0 + DCO1;BCSCTL1 = XT2OFF + DIVA_0 + RSEL0 + RSEL1 + RSEL2 + RSEL3;BCSCTL3 = XT2S_0 + LFXT1S_2 + XCAP_1;P1OUT = BIT3 + BIT7;P1SEL = BIT1 + BIT4 + BIT6;P1DIR = BIT1 + BIT4 + BIT6;P1REN = BIT3 + BIT7;P1IES = 0;P1IFG = 0;P2OUT = 0;P2DIR = 0;P2IES = 0;P2IFG = 0;pw=25;for(;;){old = pw;while(old==pw){pw=checkbutton();}pulsewidth(pw);}}
    void​
    pulsewidth(int pw){TACCTL0 = CM_0 + CCIS_0 + OUTMOD_0 + OUT;TACCTL1 = CM_0 + CCIS_0 + OUTMOD_7;TACCR0 = 50;TACCR1 = pw;TACTL = TASSEL_2 + ID_0 + MC_1;}
    int​
    checkbutton(void){int math1, math2;unsigned long z;math1 = P1IN;math2 = math1 |= 247;if(math2 == 247){pw++;}math1 = P1IN;math2 = math1 |=127;if(math2 == 127){pw--;}if(pw>50){pw=50;}if(pw<1){pw=1;}for(z=0;z<1000000;z++){}return(pw);}
     
  3. The_Scientist

    The_Scientist Neues Mitglied

    Registriert seit:
    26. Februar 2011
    Beiträge:
    91
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Sprachen:
    BascomAVR, C, Assembler
    Und wieder keine Zeilenumbrueche....

    Der Editror mag mich nicht!

    Wenn ich unten Enter druecke lande ich oben in der 3 Zeile :-(
    Und die Umbrueche mag er auch nicht.....

    Also als File...


    Den Anhang main.c betrachten
     
  4. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.202
    Zustimmungen:
    121
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Hallo Klaus,

    versuche einmal den Code zuerst in einen anderen Editor zu kopieren, dann davon wieder in die Zwischenablage und danach hier ins Forum. Den Umweg muss ich selber auch manchmal gehen, je nachdem wo der Code herkommt. Du kannst übrigens auch deine Beiträge editieren ("bearbeiten").

    Dirk :ciao:

    EDIT: ich habe den Code im ersten Beitrag noch einmal eingefügt, jetzt ist er richtig formatiert.
     
  5. The_Scientist

    The_Scientist Neues Mitglied

    Registriert seit:
    26. Februar 2011
    Beiträge:
    91
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Sprachen:
    BascomAVR, C, Assembler
    Vielen Dank

    Hallo Dirk,vielen Dank fuer die Hilfe. Bearbeiten funktioniert bei mir nicht, dann springt der Cursor nicht in die naechste Zeile wenn ich Enter druecke...Jetzt auch wieder nicht?!(10x Enter und nix geht)...Ab und zu bekomme ich graue Haare mit dem Editor hier(10x Enter wieder nix)....Ich habe Windows 7 x64 Ultimate, IE 10.0.9200.16576 und Java auch in der letzten Version...Manchmal klappt alles und dann wieder wie jetzt....LG Klaus
     
  6. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.202
    Zustimmungen:
    121
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Hallo Klaus,
    meine Konfiguration ist ähnlich, nur dass ich grundsätzlich keinen MS IE nutze (nur zum Testen. Webentwickler hätten es einfacher, wenn es den nicht geben würde :)). Vielleicht liegt es an irgendeiner Konfiguration bei dir, Plugin oder sonstwas.

    Dirk :ciao:
     
  7. The_Scientist

    The_Scientist Neues Mitglied

    Registriert seit:
    26. Februar 2011
    Beiträge:
    91
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Sprachen:
    BascomAVR, C, Assembler
    Komisch

    Es ist halt komisch...

    mal klappte es (wie jetzt - ohne Neustart des Browsers seit dem letztem Beitrag)

    und manchmal nicht...

    Eigentlich habe ich ALLE PlugIns deaktiviert! Mag den kram...macht den eh schon langsamen IE nur noch lahmer...

    Habe oefter das Problem. Manchmal gebe ich einfach auf und machen eine Re-Login ins Forum und dann klappts...ist aber halt nervig....

    LG

    Klaus
     
  8. The_Scientist

    The_Scientist Neues Mitglied

    Registriert seit:
    26. Februar 2011
    Beiträge:
    91
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Sprachen:
    BascomAVR, C, Assembler
    Der Fehlerteufel

    Also da hat doch der Fehlerteufel zugeschlagen....:mad:

    Das PWM Signal liegt natuerlich an Pin 1.6 an!!!!

    Ich habe jetzt 12 Stueck davon in meinem Haus verbaut und die funktionieren super!

    ABER ACHTUNG! Die I/O Ports der TI's sind nicht so kraeftig wie die der AVR's!
    Ich habe mir einen halbwegs zerschossen! Funktioniert immernoch, verbraucht jetzt aber mehr Strom und wird warm.....
    Also eigentlich nicht mehr wirklich zuverlaessig..daher auch ausgemustert!

    Aber bei einem Preis von 0.30USD/Stueck kann kein Tiny mithalten - zumal das PWM super einfach funktioniert durch die zwei Compare Register.....

    Werde da Programm aber noch erweitern, so dass beim erreichen des unteren Ende, die Lampe ausgeschaltet wird......
    Kommt in den naechsten Tagen dann online....

    LG

    Klaus
     
  9. The_Scientist

    The_Scientist Neues Mitglied

    Registriert seit:
    26. Februar 2011
    Beiträge:
    91
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Sprachen:
    BascomAVR, C, Assembler
    Ich habe fertig....

    Hier nun der neue Code....

    PWM Ausgang : P1.6
    On/Off Ausgang : P1.0
    PWM-Frequenz : ca. 300kHz

    Jetzt ist der kleine Kerl aber auch randvoll.....musste den alten Code etwas aufraeumen....

    Code:
    #include <msp430.h> 
    unsigned char pw, old, math1;
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;
        BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
        DCOCTL = 0x00;
        DCOCTL = DCO0 + DCO1;
        BCSCTL1 = XT2OFF + DIVA_0 + RSEL0 + RSEL1 + RSEL2 + RSEL3;
        BCSCTL3 = XT2S_0 + LFXT1S_2 + XCAP_1;
        P1OUT = BIT0 + BIT3 + BIT7;
     P1SEL = BIT1 + BIT4 + BIT6;
     P1DIR = BIT0 + BIT1 + BIT4 + BIT6;
     P1REN = BIT3 + BIT7;
     P1IES = 0;
     P1IFG = 0;
        pw=25;
        for(;;)
        {
         old = pw;
         while(old==pw)
         {
          math1 = P1IN;
          math1 |= 247;
          if(math1 == 247)
           {
           pw++;
           }
          math1 = P1IN;
          math1 |=127;
          if(math1 == 127)
           {
           pw--;
           }
          if(pw>50)
           {
           pw=50;
           }
          if(pw<1)
           {
           pw=1;
           math1 = P1IN;
           math1 &= 1;
           if(math1 == 1)
           {
           P1OUT ^=1;
           }
           }
          if(pw==1)
              {
           math1 = P1IN;
           math1 &= 1;
           if(math1==1)
               {
            P1OUT ^= 1;
            }
              }
          if(pw >=2)
              {
           math1 = P1IN;
           math1 &= 1;
           if(math1==0)
               {
            P1OUT ^= 1;
               }
              }
          __delay_cycles(1000000);
         }
         TACCTL0 = CM_0 + CCIS_0 + OUTMOD_0 + OUT;
         TACCTL1 = CM_0 + CCIS_0 + OUTMOD_7;
         TACCR0 = 50;
         TACCR1 = pw;
         TACTL = TASSEL_2 + ID_0 + MC_1;
        }
    }
    
    
    Als Compiler habe ich CodeComposerStudio von TI in der Version 5.3.0.00090 verwendet...

    Sobald das untere Ende erreicht ist (PW=1), wird der Ausgang P1.0 auf low gesetzt...alles PW => 2 ... P1.0 = high...


    LG

    Klaus
     
  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden