EDA365电子论坛网

标题: 德国MK项目BLDC电调程序的源码! [打印本页]

作者: kinidrily    时间: 2019-1-23 13:46
标题: 德国MK项目BLDC电调程序的源码!
德国MK项目BLDC电调程序的源码!
. k4 ?7 q4 Z; `# d# E  K& k" `/ J  r3 K; z7 i: l
#include "main.h"6 _7 q3 ~8 V( z1 e6 Z
unsigned int  PWM = 0;
" \$ e) m* Q5 g9 y" Tunsigned int  Strom = 0; //ca. in 0,1A5 t, E# r1 ?! }
unsigned char Strom_max = 0;
5 H) y8 G% \  C- C  t$ [' w% ^7 q7 Eunsigned char Mittelstrom = 0;' s  k, d$ i  ?" A; y( Z
unsigned int  Drehzahl = 0;  // in 100UPM  60 = 6000! }% N' j8 Q" }1 g) a5 Y
unsigned int  KommutierDelay = 10;
7 X: l, l: B/ [6 r. Tunsigned int  I2C_Timeout = 0;
6 y" y7 D8 {+ e+ D7 v3 junsigned char SIO_Timeout = 0;
% h" A1 A% @& t7 t. v4 Vunsigned int  SollDrehzahl = 0;' a/ m* C+ L% v4 \- t' e
unsigned int  IstDrehzahl = 0;
3 v( D; U4 @! X! `2 {. h4 w7 j. ~unsigned int  DrehZahlTabelle[256];//vorberechnete Werte zur Drehzahlerfassung
7 B* P7 n: y$ m3 M9 d% B0 vunsigned char ZeitFuerBerechnungen = 1;
5 r9 f) F# I: u' ~unsigned char MotorAnwerfen = 0;  T( ?! o, ^- O$ b  ?4 M1 K9 F
unsigned char MotorGestoppt = 1;
7 i9 |0 |: O% z8 B3 Bunsigned char MaxPWM = MAX_PWM;" J' p$ N( z, U5 D2 z6 _# H
unsigned int  CntKommutierungen = 0;. d6 l9 J- X' k# Z! q1 U
unsigned int  SIO_Drehzahl = 0;* i' U3 R& J4 M& q. J( Y' r8 q
unsigned char ZeitZumAdWandeln = 1;! }: Y0 s! [" M! R2 Q) ]: W7 q" y" E$ y
0 n( H2 i3 A$ n
//############################################################################8 r. B5 |1 Q5 g) V
//% ~2 `- Z& i( O3 x3 Y, H
void SetPWM(void)
* N' n4 ]- C0 l( k. J9 z5 {! T& m//############################################################################
/ I+ X6 k; F9 Y$ C0 l3 [7 f{
& h& u! k: @9 P$ R    unsigned char tmp_pwm;
% \& e( [' G. O/ q9 c& h8 _& x    tmp_pwm = PWM;. x. j* g- d8 q  ?
    if(tmp_pwm > MaxPWM)    // Strombegrenzung% o! q2 k8 N- P$ v$ ?
        {) j. J7 m& v( @; c* Q2 k
        tmp_pwm = MaxPWM;
4 D9 Q( K+ y# c6 \+ X1 Z        PORTC |= ROT; & N, p2 j) t' G- ]( e3 e
        } # T+ `. H* B, J8 d; h
    if(Strom > MAX_STROM)   // Strombegrenzung$ ~, X' `1 y+ p
        {
+ ]" `6 }( U. Y. T        OCR1A = 0; OCR1B = 0; OCR2  = 0;
3 e1 r# J% V" ~# p3 d" @* C) b+ P        PORTC |= ROT; 9 K& o5 Y0 H& W4 F6 @
        Strom--;* t0 J* B0 S! Q
        }* f; D: R& o4 y! ]* V
    else
$ j0 J/ p1 a' A# I: S        {; v; e- D. _: O9 x! P
        #ifdef  _32KHZ + v* P  @  b+ I4 W8 u* h8 S1 C
        OCR1A =  tmp_pwm; OCR1B =  tmp_pwm; OCR2  = tmp_pwm;
6 t  [: _' W- T+ c        #endif
2 I# ]# Y. \. B        #ifdef  _16KHZ
1 U4 I- b3 M4 r& f        OCR1A = 2 * (int)tmp_pwm; OCR1B = 2 * (int)tmp_pwm; OCR2  = tmp_pwm;) S/ P1 R$ E! X+ k" p' S$ W
        #endif . {% y+ |6 H/ p' @
        }% ~- \: F* v/ Z' A: t
}
1 i" {3 A/ Z  t2 D//############################################################################
! {4 |% I" a1 `  g//
! r2 O9 x# S- ]; `; ovoid PWM_Init(void); F+ C( U2 E6 ~" w
//############################################################################
5 s: e0 u( P) S! N8 |{" S% z4 @- [0 G8 c
    PWM_OFF;( A3 g1 X0 ~, g1 n& ]. H9 u5 i3 c7 }
    TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (1 << WGM12) |
" V9 a  t# y1 x! ~; R& {3 {5 P             (0 << WGM13) | (0<< ICES1) | (0 << ICNC1);
" j2 E* H+ R' U6 I- U6 o; _) L}
: @, t3 ^& v  X$ [//############################################################################
2 J1 f( h, h8 z//2 J- v3 l  }  _6 T
void Wait(unsigned char dauer)  D' R1 t- r! `1 Q
//############################################################################
1 s& i' r# t: b2 v. m! v& c{
6 [9 P/ n$ {  E6 ~    dauer = (unsigned char)TCNT0 + dauer;' I3 m0 \9 G- ]# w
    while((TCNT0 - dauer) & 0x80);! K3 F( ?- Q6 k  {  Q3 d
}
7 B! Z3 O! d8 n+ v+ n4 Y//############################################################################
/ p5 t- H6 K- u8 Z9 c//
& p/ w- t! Q+ k0 Xvoid Anwerfen(unsigned char pwm)
  E9 u; Z, Z4 ^# e//############################################################################4 k+ T% ]' Q7 K" x0 i4 W
{, o% W5 e9 r7 E. D0 L
    unsigned long timer = 300,i;
# S( D4 S" Y, j; T    DISABLE_SENSE_INT;- Z% E3 I1 w  W  V& W0 U
    PWM = 5;: w1 U2 }: y' M+ [7 l
    SetPWM();
0 |( a9 D  A& e! M  F! g    Manuell();  K4 I0 X0 E' K
    Delay_ms(200);3 S0 u9 c, j7 j6 Q
    PWM = pwm;, M* ]5 w' t1 d6 ^" h/ D  _5 M
    while(1)
+ K' b1 t8 J" `4 p1 X" w0 L/ u5 ?        {
, d! ]7 o, ^4 S* R        for(i=0;i<timer; i++)
5 Z4 Y, S& B: B& n3 z4 t8 L            {  E$ D% d: C! s2 V
            if(!UebertragungAbgeschlossen)  SendUART();
2 O4 M- N5 j1 k1 ^3 @5 O. N8 D            else DatenUebertragung();* A3 A8 ]& J# T. q' X( R
            Wait(100);  // warten* o: O+ c/ H- F" L9 J
            }
3 V% J4 n+ f2 @; b        timer-= timer/15+1;1 R! \, t6 ?; ^3 e
        if(timer < 25) { if(TEST_MANUELL) timer = 25; else return; }
) L' p1 ]1 i5 x& ?; H5 M) s7 x        Manuell();
; u% u1 H9 n8 s$ }: @3 q$ u. x        Phase++;; G2 \2 d9 P! Q( e
        Phase %= 6;! [: r& n% n% s/ U+ V
        ADConvert();" @+ x+ }6 n- q  y  k7 G$ M" r
        PWM = pwm;& `  x: [1 k' H4 J
        SetPWM();4 Q; [+ J$ i6 `/ x8 F! b
        if(SENSE) 4 h7 }! r8 U# v0 Y# e5 G  D
            {& J3 k& o( z* B8 x% p
            PORTD ^= GRUEN;& T+ s  _$ R0 X% H
            }
% H' C, V! P% Y! m" Q* r+ v! T        }
2 X$ C$ K% A; S7 p3 X, h  T}
# S3 L' E( e0 ]$ i2 O" j) g( q7 X) @//############################################################################
) f5 L6 P  c2 [% B//
8 D0 q  q, u( V. B$ ~unsigned char SollwertErmittlung(void)' ~. N9 A, {$ J9 F
//############################################################################
7 F* G4 [; a- p- X' K- Q{
* _& t3 [; B( [2 b# A8 t# d    static unsigned int sollwert = 0;4 c* q7 D- |1 ^8 e$ \0 m' C
    unsigned int ppm;  _8 y, m# [9 l) b2 W
    if(!I2C_Timeout)   // bei Erreichen von 0 ist der Wert ungültig" w$ `  D8 @$ n$ f1 K
        {
1 _/ |' b3 F1 y% P7 e6 m        if(SIO_Timeout)  // es gibt gültige SIO-Daten
2 t# Q# B& q& @) L            {% c/ Q( [' b" d) k, I& E
            sollwert =  (MAX_PWM * (unsigned int) SIO_Sollwert) / 200;  // skalieren auf 0-200 = 0-255
: w5 E9 Y" O, O            }
6 ]0 I- B3 F( Y6 b1 n        else5 s, z: x1 Q2 n! g( U6 w
            if(PPM_Timeout)  // es gibt gültige PPM-Daten
3 B  d1 Z. Y; |( b, E8 J% d. I7 N                {
, H. C- b" W0 n4 ~0 W$ B                ppm = PPM_Signal;! B7 I' L) W8 _. z6 ^
                if(ppm > 300) ppm =   0;  // ungültiges Signal/ l2 d9 n# ]* v% i( f
                if(ppm > 200) ppm = 200;8 {4 X7 N6 H8 C! i, d: y
                if(ppm <= MIN_PPM) sollwert = 0;% x/ ?7 r  k! [' m
                else 0 E3 C/ Z& R9 r$ H0 O
                    {$ S' Z9 y2 i5 x2 {" ~* ?: m( Z
                    sollwert = (int) MIN_PWM + ((MAX_PWM - MIN_PWM) * (ppm - MIN_PPM)) / (190 - MIN_PPM);
( F1 H- i0 X& g( N1 m                    }6 w, K4 W4 B; X+ S( b
                PORTC &= ~ROT;
7 y. f: T4 V* T$ p" q                }% c9 h- C0 d* F* r, _# n
            else   // Kein gültiger Sollwert4 ?5 d2 I4 L# w$ f8 P1 Q
                {
4 t2 [' r$ i* e1 |                if(!TEST_SCHUB) { if(sollwert) sollwert--; }   + M: X' T; j, M% [, ^; U4 G9 v
                PORTC |= ROT; ) s. |$ [% s9 o, A
                }
- {) t0 @$ o% g        }2 C9 a2 e9 M  I7 n' s$ k) `5 |8 G
    else // I2C-Daten sind gültig
* v: c$ R* B- O        {, ^) `+ O! `) N: m1 v
        sollwert = I2C_RXBuffer; 2 b. g2 k$ i; y7 U
        PORTC &= ~ROT;; ?  i  P& r! }
        }  n2 a/ `' i# ~6 s& X2 @3 z
    if(sollwert > MAX_PWM) sollwert = MAX_PWM;. _4 [) g+ o0 j: C7 ?1 P
    return(sollwert); : F6 ^! _& {: G* j" `/ d
}
% V# Z( C+ E4 s+ ivoid DebugAusgaben(void)
7 u2 \6 I8 `& H, _{2 Y" U# z" P, P  ~% x
    DebugOut.Analog[0] = Strom;7 K% `* Z' K4 i8 J  c# k
    DebugOut.Analog[1] = Mittelstrom;
: w# e* {2 I( H    DebugOut.Analog[2] = SIO_Drehzahl;4 E# f' n" H& }2 O9 B- ?  h
    DebugOut.Analog[3] = PPM_Signal;
& E, M; y. s9 O! |: z  w}
9 u+ u! G0 E$ z; ?
1 F$ ]8 \# _# E6 ?. w//############################################################################
( h1 l6 P% `/ _1 ]% }, @2 {, P3 m. R2 ~//Hauptprogramm
3 w4 i% e3 a+ ]; Y2 Lint main (void)3 U' f3 a3 m# k' g9 L1 a. n
//############################################################################0 G5 a! N9 S1 g
{
  t5 B. y( b' ]: W# k    char altPhase = 0;  `! k5 p- G7 E, ?
    int test = 0;8 f- q4 u4 q4 b$ E$ j5 D2 n3 E
    unsigned int MinUpmPulse,Blink,TestschubTimer;- r# m6 c7 U( P# B2 H  O
    unsigned int Blink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;( _( Q- E5 r2 Q* F" e
    DDRC  = 0x08;& m$ ?- T8 n* ]% p0 l) R# Z
    PORTC = 0x08;9 i  v. }/ K0 d
    DDRD  = 0xBA;* t4 r4 @0 P$ B3 N* s4 H  b
    PORTD = 0x80;
" a, g0 z2 F; L9 D9 Y    DDRB  = 0x0E;
4 ]9 I. _7 j* K7 p    PORTB = 0x31;
' O" s3 ~* s7 `6 H2 Z0 y4 P    1 Q/ D% ]2 y8 f! a8 P8 y+ g7 Z
    UART_Init();
8 x, b3 b$ v0 n2 A    Timer0_Init();; ]; w# I' ^# M* G/ Y0 N2 ^
    sei ();//Globale Interrupts EinschaLTEn
! k; z& A, C$ v    ( s9 Z8 n5 |, N' }
    // Am Blinken erkennt man die richtige Motoradresse
, r; T6 P( j, K  D* O& _& b# J    for(test=0;test<5;test++)0 h! F" T. j$ m
        {
! c2 v2 s$ C7 n. X6 }* Q2 P        if(test == MOTORADRESSE) PORTD |= GRUEN;7 f% x0 Z! i( f
        Delay_ms(150);
/ Z8 a( }4 O7 r- u; w        PORTD &= ~GRUEN;0 `9 V$ F5 h3 @7 v; S
        Delay_ms(250);0 ^! s# Q% f8 R* |
        }       ) W& M: u" S0 x- j
    Delay_ms(500);  G  c; d) H- B. x9 {: z; V
   
$ M+ u" {6 X. r" c    UART_Init();
1 y* |: H3 Z# D; p* A" L8 G) t    PWM_Init(); , j! K! b. X+ r2 F0 n1 O$ t
    InitIC2_Slave(0x50);                            . V5 P' m" B+ i; ]% `% C
    InitPPM();1 c8 }9 s! t4 m) M; C, y
    Blink             = SetDelay(101);    0 w. {* t7 C" _# ^; _
    Blink2            = SetDelay(102);
' [; D2 l5 v# x% t3 d. q- `* A# g    MinUpmPulse       = SetDelay(103);
7 h- ], \$ @: X4 O+ T0 J- g    MittelstromTimer  = SetDelay(254);. i$ b/ e) e) P3 n9 s2 y
    DrehzahlMessTimer = SetDelay(1005);- e" x3 d, B* l/ Y
    TestschubTimer    = SetDelay(1006);
* j5 E) \5 d, y  d    while(!CheckDelay(MinUpmPulse));) L) T! `6 @5 v. l) U5 p. `
    PORTD |= GRUEN;
& c) c, z* c) X; X( y. C$ ?    PWM = 0;- k( I9 U$ |! k8 U6 o* w' o4 C' U: s
    SetPWM();
4 F. |! J  f" u) z1 L$ t% _- I. {$ \    SFIOR = 0x08;  // Analog Comperator ein0 J' c& l& e' U( v
    ADMUX = 1; 3 G$ ]0 p, {8 B1 R& j
    MinUpmPulse = SetDelay(10);0 c* S/ I1 x6 e% b& Q
    DebugOut.Analog[1] = 1;. a; N; e2 C/ R; `7 a7 h1 B9 X
    PPM_Signal = 0;( F2 m& z% @5 k  o" f* ?' n
    // zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung
5 R# e7 A' z( @1 B) l3 Q6 _    if(TEST_MANUELL)    Anwerfen(TEST_MANUELL);  // kommt von dort nicht wieder5 E: [: l  ?3 b0 d. y/ R' k) {2 j
    while (1)1 {0 H$ g3 F1 d) i2 M5 m4 f- N7 X
        {
  I4 y3 Q8 a( l4 i6 _" s" q6 i& j# X        if(!TEST_SCHUB)   PWM = SollwertErmittlung();
9 z5 ?$ P4 v" K% k% v( U        //I2C_TXBuffer = PWM; // Antwort über I2C-Bus
( v$ }+ p. Y) e5 w, Q; ]& @        if(MANUELL_PWM)   PWM = MANUELL_PWM;
% ^/ D) h* d7 {1 V; [* _8 O' z        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
. V7 [. s# L" d0 s- j, n' X        if(Phase != altPhase)   // es gab eine Kommutierung im Interrupt
( `' O; g$ ^: Q: U! q            {( [5 f; @3 ~1 O8 F/ D6 Q
            MotorGestoppt = 0;
) L" c* f, h/ e% I            ZeitFuerBerechnungen = 0;    // direkt nach einer Kommutierung ist Zeit
; N; a0 V& B  e5 e( V" U            MinUpmPulse = SetDelay(50);  // Timeout, falls ein Motor stehen bleibt
1 }% a; ?" i$ R8 j! W. @6 [            altPhase = Phase;' I9 ~# S. D2 n. s# ?9 {& B+ [
            }
1 _# y) D5 z) R& V2 l4 n% [" c! c        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$ D9 Q7 s' p% Y        if(!PWM)    // Sollwert == 0# P. V+ s; X+ s# q  O% S
            {
) c% q4 y6 T% }2 \. x            MotorAnwerfen = 0;      // kein startversuch! @0 y  \( Y4 Y+ \
            ZeitFuerBerechnungen = 0;& E6 M3 O, C* L" F- Y, \3 S# o
            // nach 1,5 Sekunden den Motor als gestoppt betrachten 7 @9 `5 ^+ W* P# M" u: N
            if(CheckDelay(DrehzahlMessTimer)) 8 @" V, z- J" I
                {9 V9 J* `3 ]: E  z. O
                DISABLE_SENSE_INT;
2 n' g  l9 U% t8 }' X% q9 e                MotorGestoppt = 1;  
/ X7 O* K/ B- W" |                STEUER_OFF;+ L. m5 l; d: S
                }
& B6 ?! q1 Z/ Y8 p5 Y$ u6 [            }/ B5 F+ W; S6 z
        else
0 d4 f; z6 ^: C9 f; q% U            {# X$ ]* \$ J2 W
            if(MotorGestoppt) MotorAnwerfen = 1;        // Startversuch
- t1 U1 w  \# p- N' z1 b5 ]5 Y  _$ y            MotorGestopptTimer = SetDelay(1500);
  G. ]! u$ r5 K            }
# u. u# P8 A; g! y; a        if(MotorGestoppt && !TEST_SCHUB) PWM = 0;' b/ P  }( X/ B+ T, ^: N8 ?
        SetPWM();* Y; b3 U+ D9 m" i/ e9 t
        // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* d( @/ L- n& R) n( s- ]9 k
        if(!ZeitFuerBerechnungen++)0 j) e! R; t% M! i& U* a
            {
% f, H% t9 A& M            if(MotorGestoppt) PORTD |= GRUEN; //else PORTD &= ~GRUEN;$ W6 Y8 J9 t) {' d* `
            if(SIO_DEBUG)) z  x3 y. w' t
                {
5 h3 S8 y0 g/ S6 V                DebugAusgaben();  // welche Werte sollen angezeigt werden?
/ }2 h/ N% Y# k1 Y/ m) R                if(!UebertragungAbgeschlossen)  SendUart();
) l4 a! C) X3 W0 S! i                else DatenUebertragung();
) q: m1 E) z! l7 p                }9 |: t* u! H# n- {2 q. k6 _7 g* n/ P
            // Berechnen des Mittleren Stroms zur (langsamen) Strombegrenzung: v2 U( H+ t' b( p* Q+ o- n+ o
            if(CheckDelay(MittelstromTimer))   
, C1 R7 a4 ]; n5 ~" E( H                {' _# i$ G) Q  e2 m2 r* ^" J
                MittelstromTimer = SetDelay(50); // alle 50ms3 X  ?* ?, @& U$ {* W
                if(Mittelstrom <  Strom) Mittelstrom++;// Mittelwert des Stroms bilden+ }4 S9 l9 c: y, S. o9 u
                else if(Mittelstrom >  Strom) Mittelstrom--;. W9 h3 u! m1 m8 g- y/ ]
       : M4 A/ C* A) V- J
                if(Mittelstrom > LIMIT_STROM)// Strom am Limit?& p* E! s% t4 L9 M8 A7 u6 d+ O. X1 u
                    {
0 e: L0 e: H; Y3 D                    MaxPWM--;// dann die Maximale PWM herunterfahren
- ^  D: L+ I8 I; ?7 P) t: N                    PORTC |= ROT;
* @% r' |2 q4 b( f- y3 c/ k                    }- }) R# u* V1 n  p
                else
" E7 T2 x( M& Q$ B  t7 y( f' z                    {
# y) |% x7 ?4 f' G                    if(MaxPWM < MAX_PWM) MaxPWM++;4 w: n* w! Y) I
                    }
: c3 x3 n- X( K% u- r$ Y1 R1 y                }
$ m7 h& p1 b, z6 }            if(CheckDelay(DrehzahlMessTimer))   // Ist-Drehzahl bestimmen" c6 x. N  H1 F- `- O
                {2 f* P' h% E. l4 y6 V$ D. q. q
                DrehzahlMessTimer = SetDelay(10);
* v( g* u7 z0 A                SIO_Drehzahl = (6 * CntKommutierungen) / (POLANZAHL / 2);
2 p( M9 o, i* u! z9 s                CntKommutierungen = 0;& ?0 U' j+ b0 I2 G/ y, z# m( N
                if(PPM_Timeout == 0) // keine PPM-Signale
1 j0 ^1 V7 j! a  p" D& o; H                ZeitZumAdWandeln = 1;8 ?; w/ N4 c5 V$ U* ?
                }
+ K8 A# D; z1 }$ g, u5 p8 z/ G
4 \) O7 u& i* A' N/ I; y, V6 L, A            if(CheckDelay(TestschubTimer))  
/ P& x8 N" \5 [! S1 B" F                {8 d+ l5 @$ V' P, y
                TestschubTimer = SetDelay(1500);
: V0 i( T  \8 V; h  G                if(TEST_SCHUB)
9 r8 T% O7 j- \) H# p  I' B                    {  J/ Z( U1 b$ R$ P
                    switch(test) 4 l6 c& _, ]( N
                        {
6 ^5 \5 _& }/ J" X8 a: s                        case 0: PWM = 50; test++; break;
  S  W  B' h6 u- |% f                        case 1: PWM = 130; test++; break;( X3 S$ {% `8 P" D' d4 k
                        case 2: PWM = 60;  test++; break;
1 }' v( `4 ]6 Z( O- {+ N5 q! @                        case 3: PWM = 140; test++; break;2 w5 j* a$ V0 a& b1 Q
                        case 4: PWM = 150; test = 0; break;
: ^+ o% Q! g- l2 K; W                        default: test = 0;9 n8 z' a$ ^4 p+ \& b) F9 M8 O
                        }
, U7 i: E4 ~) g/ E% X5 H                    }
" j/ f# M+ G$ m+ e                }
1 |7 N! E0 U4 _9 z! M, R            // Motor Stehen geblieben* D; x7 p! z; v" _2 x! b  k
            if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen)
6 O# s1 M$ S7 H/ A; T- r2 a* B& w# o                {
0 x7 b4 n* F6 Q- ?) @6 S5 F                MotorGestoppt = 1;   
( {9 _/ {8 l3 ~: F  S- q                DISABLE_SENSE_INT;/ P# A! c8 G/ C- k1 b
                MinUpmPulse = SetDelay(100);         
$ Y8 ^/ x& {0 E8 K: W                if(MotorAnwerfen)
1 Q/ x( a4 Z: t3 E+ z  ~4 b                    {# ~' Q: `8 r6 h7 r/ f
                    PORTC &= ~ROT;
# U- S# U# g! j" D& _: c; `                    MotorAnwerfen = 0;
7 D$ B1 B! C" F  `% M                    Anwerfen(10);8 U0 f4 M0 ^! g5 `
                    PORTD |= GRUEN;
% W' H( ]- _4 {" @' S  H- @                    MotorGestoppt = 0;   
/ c* z, c4 q7 v" @# ^                    Phase--;
/ ~. v2 y& J5 |) }9 y                    PWM = 1;) }- i' N% |' [* Y+ [: n" X- }# Z
                    SetPWM();! B2 V# N6 t* J, E
                    SENSE_TOGGLE_INT;4 [2 \7 d3 ?( ^( y% a  \1 K0 J
                    ENABLE_SENSE_INT;
. [& a, r' f! i* j, f) w2 u                    MinUpmPulse = SetDelay(100);
5 f" n' ~5 G$ x3 z* g% U  B                    while(!CheckDelay(MinUpmPulse)); // kurz Synchronisieren
; ]0 x# c! |! U& ~6 g                    PWM = 10;
; w! \0 I, o7 a2 H% I3 s                    SetPWM();
8 }' P1 B& _' k2 O" D3 K' y& I                    MinUpmPulse = SetDelay(200);; ?: h# J( C6 k+ d3 I. s% n
                    while(!CheckDelay(MinUpmPulse)); // kurz Durchstarten
) F$ e' R& a  J! f! R                    MinUpmPulse = SetDelay(1000);1 \/ j( u) q7 Q4 N
                    altPhase = 7;
! k- H  e" @0 a/ Y3 Z) C                    }$ N9 t4 q  O- U' r8 x
                }
* o7 a1 K- X  P# U% b3 ~5 R            } // ZeitFuerBerechnungen' K: J9 O" }+ c9 }2 h. I
        } // while(1) - Hauptschleife" p8 @# y* O$ Q: }' B, i) |% C3 f" z
}$ o3 x, q2 }3 F1 q( k2 E0 l9 U% S
这个是部分的源码 有想要了解的就去下载看吧
$ _+ }" }" b" V3 U5 F" N. o7 t. u下载:
/ Q7 D3 M1 P2 E+ P
, D9 p1 @- O1 j5 L1 n
( _- ?; @% E( n# C% ^0 ~/ E
作者: cat12620    时间: 2019-1-23 15:29
谢谢分享
作者: wzhzn    时间: 2019-2-23 20:17
谢谢,学习!0 ?( j6 o  F( r3 J3 Q" D9 o7 K8 m

作者: aaron_he    时间: 2019-6-15 19:32
谢谢分享,学习参观
作者: 2679609    时间: 2019-6-19 10:26
我想下载
作者: nyszx    时间: 2019-6-25 16:34
看一下啥情况
作者: lcszhl    时间: 2019-6-25 17:49
路过
作者: cdwlll    时间: 2019-7-25 14:25
正好需要,很感谢
; ?; u$ _4 `, I! M7 Z
作者: xj891110    时间: 2019-8-5 14:20
谢谢分享,学习参观!
作者: ryann    时间: 2019-8-22 22:27
好东西,顶一下+ |  v4 m$ v1 G$ Z3 w9 r; R% \
8 u% v4 y6 F* N# \  M/ S

作者: shiyongzhu    时间: 2020-3-5 20:43
谢谢分享,感谢楼主。9 ~) B" C4 n) d6 V) u

作者: rm10b0    时间: 2020-3-10 10:02
这里没看到控制算法?
8 e- P- a! C4 a- `
作者: jiaman520    时间: 2020-3-27 15:48
谢谢分享,学习参观
作者: vashonchen    时间: 2020-4-7 20:13
谢谢分享,学习参观
# ^! T; ~3 N9 a5 L
作者: 放烟花飞过海    时间: 2020-5-24 21:48
德国人但是
作者: lixiang_wx    时间: 2020-7-5 13:22
感谢谢分享,看看是否可用
; V; [$ o# N! H* j
作者: emanages    时间: 2020-7-31 14:05
感谢分享DDDDDDDDDDDDDDDDDDDDDDDDDD
4 ~$ q/ n2 d. B9 E; z; U
作者: colcol    时间: 2020-8-10 23:32
看看                     
, x/ I; g* G% ^7 W
作者: 风中沙    时间: 2020-8-28 13:49
可以
作者: ixiaoxian    时间: 2020-9-14 16:54
good
作者: ixiaoxian    时间: 2020-9-15 10:21
谢谢分享,是用什么编译器?
作者: 阿牛叔    时间: 2020-10-5 17:28
xuexiyixia
作者: chengc31    时间: 2020-12-4 10:40
很好,看看
作者: yupw24    时间: 2021-1-22 17:44
感谢分享!感谢分享!感谢分享!
1 j/ O  C' ^, F) |( K& Q
作者: love2008    时间: 2021-4-19 21:24
这个是几点版本0 Q" |  d9 u$ g' _0 T( p2 D

作者: marks_liu11    时间: 2021-5-31 18:00
好文章。 感谢分享!感谢分享!感谢分享
作者: ryann    时间: 2021-8-31 15:39
感谢分享!
# E7 g4 K  ]1 S' u, P4 ]
作者: devilzhang412    时间: 2021-9-1 17:21
初学,谢谢!
作者: ryann    时间: 2021-9-3 16:05
感谢分享!!!# I" L+ c# [8 x, X

作者: wtf2014    时间: 2021-10-11 20:16
太好了
作者: kobewgq    时间: 2021-10-20 17:38
谢谢分享,学习参观!, g3 c5 @0 w, n, L0 l6 J9 m

作者: weishiding    时间: 2021-11-26 23:37
kankan
作者: clgoal    时间: 2021-12-18 14:14
好东西,可惜注释是德语
作者: sjzwangjh    时间: 2022-1-26 23:30
好东西。看看。
作者: polo70    时间: 2022-7-7 18:08
很需要看看5 f6 H! ?7 L' V3 A

. a) K3 F& ]  ?: |" v9 K  M# x
作者: 107485133    时间: 2022-12-5 11:15
谢谢分享!, D8 U4 x2 r7 e/ |; H

作者: rete0786    时间: 2022-12-12 17:40
谢谢分享
作者: rete0786    时间: 2022-12-12 17:42
这个有对应的原理图和PCB文件吗?
作者: star2002star    时间: 2025-3-18 17:33
谢谢分享,学习参观/ y! x* F& N+ H9 o7 [6 S





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2