PIC 18F4620 PWM ausschalten

OP #2809484
Lesenswert?
• ▲
▼
Hallo,

ich habe vor ein paar Tagen angefangen mich in der µC Programmierung zu 
versuchen. Und jetzt habe ich ein Problem mit der PWM, genauer gesagt 
mit dem Ausschalten dieser.

Ich will mit dem PWM Ausagng einen LED-Strip dimmen, der in Abhängigkeit 
von der Umgebungshelligkeit automatisch angeschalten wird (genauer 
gesagt ist es einer dieser LED-Solarlampen blos in groß^^). Das 
anschalten und dimmen funktioniert auch problemlos blos mit dem 
ausschalten hapert es.

Folgendes Problem:
Es ist dunkel LED Strip und LED1 (Kontroll-led) geht an und ich kann 
dimmen.
Wenn ich jetzt in der höchsten Helligkeitsstufe bin und es "hell" wird 
bleibt der Stripe nach wie vor an aber die Kontroll-led geht aus. Wenn 
ich z.b. in der 50% Duty-Cycle Stufe bin kann es sein, dass der Stripe 
ausgeht wenns "hell" wird...es ist aber wahrscheinlicher, dass der 
Stripe auf 100% Helligkeit springt. Je kleiner der DC desto größer ist 
die Chance, dass der Stripe das macht was er soll. Die Kontroll-led 
reagiert aber immer richtig.

So wahrscheinlich blickt jetzt kein Mensch was ich eigentlich will aber 
ich versuchs trotzdem mal. :D

Hoffe ihr könnt mir helfen :)

P.S. Ich bin wie gesagt sehr frisch dabei und nehme viele Funktionen die 
ich nicht selbst geschrieben haben geschweige denn voll und ganz 
verstehe.  Falls ich hier also kompletten Mist mache..sorry :D

Edit: ich gehe vom PWM Ausgang direkt auf das Gate von einem IRFZ46N der 
mir 12V durchschaltet (vllt ist das ja von Bedeutung). Wenn ich die 
PWM:Init() auskommentiere funktioniert alles wies funktionieren 
soll..natürlich dann ohne Dimmmöglichkeit.
1
//=========================================================================
2
int dc = 1;      //duty_cicle für PWM
3
#include "picus_ge_00.h"
4

5
//=========================================================================
6
#include "helpers.c"
7

8
========================================================================
9
void main(void)
10
{
11
    unsigned char spannung;
12
    unsigned char licht;
13
    int x=1;    //Laufvariable Taster 1
14
    int y=1;      // Laufvariable Taster 2
15
    init();
16
    PWM_Init();
17
      
18
while(1)
19
  {
20
  licht = getRC();
21
  PWM_Frequenz((unsigned int)2000);
22
    spannung = getTemp();
23
    if (spannung >= 134)
24
      {        
25
        if (licht > 120)
26
          {
27

28
            PWM_ON ();
29
            Ton_Out = 1;
30
            LED1 = Ton_Out;  
31
                      
32
          }
33
      }
34
    if (licht < 90)
35
      {
36

37
        PWM_OFF  ();
38
        delay_ms (15);
39
        Ton_Out = 0;
40
        LED1 = Ton_Out;
41
      }
42

43
      
44
    if (spannung <= 130)
45
      {
46

47
        PWM_OFF  ();
48
        delay_ms (15);
49
        Ton_Out = 0;
50
        LED1 = Ton_Out;
51
      }
52

53

54

55
[...]
56

57
    if (Taster2==1) 
58
      {
59
          delay_ms (200);
60
          y++;    
61
      }      
62

63

64
  switch (y)    // Duty-Cycle switchen
65
    {
66

67
    case 1:    {
68
            dc=1;    //duty_cycle = 100%
69
            
70
            break;
71
          }      
72
          
73
    case 2:    {
74
            dc=2;    //duty_cycle = 50%
75
            
76
            break;
77
          }            
78
          
79
    case 3:    {  
80
            dc=5;    //duty_cycle = 20%
81
            
82
            break;
83
          }
84
      
85
    case 4:    {  
86
            dc=20;    //duty_cycle = 5%
87
            
88
            break;
89
          }
90

91
    default:   {
92
            dc=1;    //duty_cycle = 100%
93
            y=1;
94
            
95
            break;
96
          }                
97
}
98
  
99
} 
100

101
} //end main()


PWM config:
1
void PWM_Init(void)
2
{
3
  unsigned int Duty_Cycle = 0;
4
  // set PWM Period
5
  //PWM period = [(PR2) + 1] • 4 • TOSC• (TMR2 prescale value)
6
  //PWM frequency = 1/PWM period
7
  PR2 = 0;
8
  //set PWM duty cycle 
9
  Duty_Cycle = 0;
10
  CCPR2L = Duty_Cycle;
11
  //set Output Pin RB3 
12
  TRISBbits.TRISB3 = 0;
13
  //set Timer2 Prescaler = 16
14
  T2CONbits.T2CKPS0 = 1;
15
  T2CONbits.T2CKPS1 = 1;
16
  //Timer2 OFF
17
  T2CONbits.TMR2ON = 0;
18
  //set CCP2 for PWM operation
19
  CCP2CON = 0b00001100;
20

21
}
22

23
void PWM_ON(void)
24
{
25
  T2CONbits.TMR2ON = 1;  // Timer2 On
26
}
27

28
void PWM_OFF(void)
29
{
30
  T2CONbits.TMR2ON = 0;  // Timer2 Off
31
}
32

33
void PWM_Frequenz(unsigned int i)
34
{
35
  #define a (1/10000000)    //Periode quarz_Takt  
36
  PR2 = (unsigned char)((1/i)/(4*a*16))-1; //PR2 = [ PWM_Periode / (4 x Tocs(CPU Takt periode) x TM2PS) ] -1
37
  CCPR2L =  PR2/dc;    //CCPR2L=PR2/(1/PWM duty cycle)
38
}
Gast #2809656
Lesenswert?
• ▲
▼
Im CCP2CON legst du fest, dass das CCP/PWM-Modul den
Ausgang steuert.
Also must du dir diese Aufsicht zurückholen bevor
du was machen kannst.
Normalerweise reicht es, den Pin beim Konfigurieren
passend einzustellen und zum Ausschalten dann nur die
Aufsicht zu wechseln. Der Timer kann ruhig weiterlaufen.

hans

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.