Subversion Repositories BL-Ctrl

Rev

Rev 61 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 61 Rev 92
1
/*############################################################################
1
/*############################################################################
2
 + Regler für Brushless-Motoren
2
 + Regler für Brushless-Motoren
3
 + ATMEGA8 mit 8MHz
3
 + ATMEGA8 mit 8MHz
4
 + (c) 01.2007 Holger Buss
4
 + (c) 01.2007 Holger Buss
5
 + Nur für den privaten Gebrauch
5
 + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY
6
 + Keine Garantie auf Fehlerfreiheit
6
 + Keine Garantie auf Fehlerfreiheit
7
 + Kommerzielle Nutzung nur mit meiner Zustimmung
7
 + Kommerzielle Nutzung nur mit meiner Zustimmung
8
 + Der Code ist für die Hardware BL_Ctrl V1.0 entwickelt worden
8
 + Der Code ist für die Hardware BL_Ctrl V1.0 entwickelt worden
9
 + www.mikrocontroller.com
9
 + www.mikrocontroller.com
10
############################################################################*/
10
############################################################################*/
11
#include "main.h"
11
#include "main.h"
12
volatile unsigned int PPM_Signal = 0;
12
volatile unsigned int PPM_Signal = 0;
13
volatile unsigned char Timer1Overflow = 0;
13
volatile unsigned char Timer1Overflow = 0;
14
volatile unsigned char PPM_Timeout = 0, anz_ppm_werte = 0;   // Ungültig, wenn Null
14
volatile unsigned char PPM_Timeout = 0, anz_ppm_werte = 0;   // Ungültig, wenn Null
15
 
15
 
16
//############################################################################
16
//############################################################################
17
//
17
//
18
void InitPPM(void)
18
void InitPPM(void)
19
//############################################################################
19
//############################################################################
20
{
20
{
21
 TCCR1B |= (1<<ICES1)|(1<<ICNC1);
21
 TCCR1B |= (1<<ICES1)|(1<<ICNC1);
22
 ICP_POS_FLANKE;
22
 ICP_POS_FLANKE;
23
 ICP_INT_ENABLE;
23
 ICP_INT_ENABLE;
24
 TIMER1_INT_ENABLE;
24
 TIMER1_INT_ENABLE;
25
}
25
}
26
 
26
 
27
//############################################################################
27
//############################################################################
28
//
28
//
29
SIGNAL(SIG_OVERFLOW1)
29
SIGNAL(SIG_OVERFLOW1)
30
//############################################################################
30
//############################################################################
31
{
31
{
32
 Timer1Overflow++;
32
 Timer1Overflow++;
33
}
33
}
34
 
34
 
35
//############################################################################
35
//############################################################################
36
//
36
//
37
SIGNAL(SIG_INPUT_CAPTURE1)
37
SIGNAL(SIG_INPUT_CAPTURE1)
38
//############################################################################
38
//############################################################################
39
{
39
{
40
 static unsigned int tim_alt;
40
 static unsigned int tim_alt;
41
 static unsigned int ppm;
41
 static unsigned int ppm;
42
 if(TCCR1B & (1<<ICES1))   // Positive Flanke
42
 if(TCCR1B & (1<<ICES1))   // Positive Flanke
43
  {
43
  {
44
   Timer1Overflow = 0;
44
   Timer1Overflow = 0;
45
   tim_alt = ICR1;
45
   tim_alt = ICR1;
46
   ICP_NEG_FLANKE;
46
   ICP_NEG_FLANKE;
47
   PPM_Timeout = 100;
47
   PPM_Timeout = 100;
48
  }
48
  }
49
 else                      // Negative Flanke
49
 else                      // Negative Flanke
50
  {
50
  {
51
    ICP_POS_FLANKE;
51
    ICP_POS_FLANKE;
52
#ifdef  _32KHZ 
52
#ifdef  _32KHZ 
53
    ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 256) / 32;
53
    ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 256) / 32;
54
#endif 
54
#endif 
55
#ifdef  _16KHZ 
55
#ifdef  _16KHZ 
56
    ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 512) / 32;
56
    ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 512) / 32;
57
#endif 
57
#endif 
58
    if(ppm < 280) ppm = 280;
58
    if(ppm < 280) ppm = 280;
59
    ppm -= 280;
59
    ppm -= 280;
60
        if(PPM_Signal < ppm)  PPM_Signal++;
60
        if(PPM_Signal < ppm)  PPM_Signal++;
61
        else if(PPM_Signal > ppm)  PPM_Signal--;
61
        else if(PPM_Signal > ppm)  PPM_Signal--;
62
    if(FILTER_PPM)      ppm     = (PPM_Signal * FILTER_PPM + ppm) / (FILTER_PPM + 1);  // Filtern
62
    if(FILTER_PPM)      ppm     = (PPM_Signal * FILTER_PPM + ppm) / (FILTER_PPM + 1);  // Filtern
63
    PPM_Signal = ppm;
63
    PPM_Signal = ppm;
64
    if(anz_ppm_werte < 255) anz_ppm_werte++;
64
    if(anz_ppm_werte < 255) anz_ppm_werte++;
65
    ZeitZumAdWandeln = 1;
65
    ZeitZumAdWandeln = 1;
66
  }
66
  }
67
}
67
}
68
 
68
 
69
//############################################################################
69
//############################################################################
70
//
70
//
71
SIGNAL(SIG_INTERRUPT0)
71
SIGNAL(SIG_INTERRUPT0)
72
//############################################################################
72
//############################################################################
73
{
73
{
74
 CLR_INT0_FLAG;      // IntFlag Loeschen 
74
 CLR_INT0_FLAG;      // IntFlag Loeschen 
75
}
75
}
76
 
76
 
77
 
77