找回密码
 注册
关于网站域名变更的通知
查看: 4647|回复: 38
打印 上一主题 下一主题

德国MK项目BLDC电调程序的源码!

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-23 13:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
德国MK项目BLDC电调程序的源码!) E0 x1 y  V' t/ |& X7 p
# u3 n0 ?. R4 x7 q! W
#include "main.h"
. x1 |" }* i! K) f0 [6 aunsigned int  PWM = 0;
# {+ W" I7 q+ ?+ \8 vunsigned int  Strom = 0; //ca. in 0,1A4 D0 U) N4 X5 u, J+ G( s1 W
unsigned char Strom_max = 0;
0 ?' V+ U  X3 S9 [" E* kunsigned char Mittelstrom = 0;
$ y/ B  M& C* m4 n0 g- Eunsigned int  Drehzahl = 0;  // in 100UPM  60 = 6000% {! C9 z+ U" ?, [! u# `6 ^
unsigned int  KommutierDelay = 10;& U: K: C( p  w; Z2 E
unsigned int  I2C_Timeout = 0;
$ x$ X1 t; e6 r; |; f, Eunsigned char SIO_Timeout = 0;6 Y7 T! W! r+ U6 c) V
unsigned int  SollDrehzahl = 0;2 [. b( C9 M* u( P% b, J2 Y$ b- K- c" E- V
unsigned int  IstDrehzahl = 0;
3 `2 }  G# L; A3 ounsigned int  DrehZahlTabelle[256];//vorberechnete Werte zur DrehzahleRFassung
1 O' K. o$ S7 y1 H9 \$ v+ bunsigned char ZeitFuerBerechnungen = 1;
( r0 I& f& |# y/ K9 s: aunsigned char MotorAnwerfen = 0;5 A- \& v9 v: ?5 M! b
unsigned char MotorGestoppt = 1;8 S6 Q7 q4 l0 J* t# N$ W7 h# b
unsigned char MaxPWM = MAX_PWM;
# A" B& s: L! |% c) ?: E, d$ k' Funsigned int  CntKommutierungen = 0;
# T6 T, S9 B& p* ?unsigned int  SIO_Drehzahl = 0;
6 s$ y0 A8 n; y5 e# [& l  L( h9 U7 D3 Sunsigned char ZeitZumAdWandeln = 1;
: P3 }' ?2 y- o0 a8 U
  @6 C6 y5 Y. j//############################################################################
) w! ]8 z/ Y0 m% T//" o: ~% {5 S# R: N7 ]
void SetPWM(void)+ t8 @! G; P! d9 P
//############################################################################- X/ ]/ s" r" h
{
$ G; X  u3 B2 j$ j1 `0 Z    unsigned char tmp_pwm; 3 z+ _0 m# G3 K. {+ P8 d4 I, w& C0 P
    tmp_pwm = PWM;
4 g) Z( B" U  l" f# ^, ~    if(tmp_pwm > MaxPWM)    // Strombegrenzung/ s+ O# |$ H' R$ ]& w
        {$ H0 q3 k4 _& |  p, O1 y! ~$ `
        tmp_pwm = MaxPWM;4 _* l: N# `+ h+ [! N" `; D9 ?7 W) X3 Y
        PORTC |= ROT;
% q* N# c+ x5 I: u* O        } ! B1 F6 Y" z: o
    if(Strom > MAX_STROM)   // Strombegrenzung
  `) E: f: E/ i4 X0 D$ H        {
/ {( V$ I+ w3 N& Q6 \        OCR1A = 0; OCR1B = 0; OCR2  = 0;  R2 e, s# t1 |& [( \$ P& g
        PORTC |= ROT; 9 l5 h( C; I: c* |. u% O
        Strom--;
9 O- [  h" H* B- h- _" ^' s0 u, m        }4 m  |- [; t9 }! k
    else
; u( X3 h- n; P$ x        {
3 `/ S* [# \: {9 \, N: J        #ifdef  _32KHZ * l8 ]1 M% o. {% _
        OCR1A =  tmp_pwm; OCR1B =  tmp_pwm; OCR2  = tmp_pwm;
# F1 e' b, J( A- g' c: k, p        #endif
# _" V+ e1 B6 g! ^+ \) B& h        #ifdef  _16KHZ
( K$ i- x2 z5 S4 M4 P        OCR1A = 2 * (int)tmp_pwm; OCR1B = 2 * (int)tmp_pwm; OCR2  = tmp_pwm;7 b1 A% \% `# [! p
        #endif 0 C0 }: z7 w' T2 E1 N
        }, ~/ ?3 o3 s. }8 M3 A) b( c
}
. C; o3 i$ x, z- E& a1 u//############################################################################
+ P: m3 y3 s7 l! E& R3 U//
7 s' V- Q7 S8 c$ m/ S/ L* W! Z$ evoid PWM_Init(void)
% g. u3 M9 E( Q//############################################################################
5 \1 d/ n: ~1 B# \* T{
0 F" y- D4 M8 G5 S3 S8 f" s    PWM_OFF;1 v$ v* j  [6 L# R
    TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (1 << WGM12) | ! R5 d) E. D, k, |
             (0 << WGM13) | (0<< ICES1) | (0 << ICNC1);  q0 h- a( L& D- T
}
5 L5 `+ i: B9 o- t3 l! g//############################################################################
: k3 o# V& z$ X1 R//& X6 w$ e5 Y# p6 s1 `- O$ n. x
void Wait(unsigned char dauer)+ y) K* I2 m$ p/ q$ T9 {) h
//############################################################################& t& H4 l: a$ D- s
{1 e9 Y. f' S# m5 _( {; p) h
    dauer = (unsigned char)TCNT0 + dauer;4 k# |9 ?' s) r# n. a
    while((TCNT0 - dauer) & 0x80);8 \% ^; o. U& m1 U: ]7 Q+ e- y4 y
}& x0 \: }. q& K# ~
//############################################################################/ s4 ?$ M- P( _9 a. a" m. g
//
/ A! _' A7 q) Bvoid Anwerfen(unsigned char pwm)
. e, Y% A- t$ O0 G6 L. n+ Y: B' c  h//############################################################################
/ p) u- y% [( D$ q/ w{  g. G, w, p3 z+ i7 M  J
    unsigned long timer = 300,i;
! q  \6 R0 ~) j+ t    DISABLE_SENSE_INT;
$ J6 \2 L! R: R4 M$ N8 K" `    PWM = 5;
3 R3 Q$ @7 a: y( b* f7 i% K! h5 H& d    SetPWM();
! A( L. Z4 |' p/ w$ w  _( c    Manuell();
) D" c% i1 K9 t& w2 w: O, n; \    Delay_ms(200);8 D4 Q0 M8 ~( k% H% z: J5 ?
    PWM = pwm;& G+ @3 ~# j9 J2 b, h+ X& c
    while(1)
% L' ], ~% T( ^4 T. ^" V        {
% `, @/ [3 `, e        for(i=0;i<timer; i++)
& Y( X' A$ \" J" L0 K; N& f4 U0 N            {. R) Q9 x, I; T& g8 C: n/ E
            if(!UebertragungAbgeschlossen)  SendUART();
; l$ B- T$ Y: X            else DatenUebertragung();
) h+ F( l, D. T# \            Wait(100);  // warten
! f6 N/ [, E7 m1 r) B8 L. M2 P: R+ m            }
6 z4 X. G# j. s/ ~9 n6 U        timer-= timer/15+1;
  A# N4 X* m% a% x! `# G+ B        if(timer < 25) { if(TEST_MANUELL) timer = 25; else return; }
/ E1 y* o" z2 X% l        Manuell();
4 O/ H3 D0 ^8 U0 i# ?% C        Phase++;
( M" U$ j6 `" U/ R0 V8 F. {7 _  r! o        Phase %= 6;. l( E* z/ u  u; e2 Z7 R/ y8 j
        ADConvert();
9 i( t* P% A9 i5 V7 S2 l        PWM = pwm;
  K. s# Q3 a# E        SetPWM();- W: L# Y5 \2 k! @8 V+ P" V
        if(SENSE) 9 s0 Y/ w7 w" q! b  q- o) `0 U
            {
; {5 B4 l$ [, `            PORTD ^= GRUEN;1 U/ v% S& q! I6 X. D, K  X" i
            }
7 u1 J- u" C1 b) `+ t; S        }
9 K- |& n3 O0 R+ s}: V- z* o8 i# ?! p! i9 J7 b3 @
//############################################################################2 P+ t4 H9 ~( ?) \0 W
//* M$ D8 B" f; g! d$ a! R: H" T
unsigned char SollwertErmittlung(void)
- D% S  X. N$ ?2 X  e//############################################################################; y( ~' l7 m3 Y# k  F% O1 V! |, n% Z
{
/ P( l* W3 y' u1 U4 v3 y    static unsigned int sollwert = 0;
  H! g" r: C+ s4 d2 B    unsigned int ppm;  Q6 s) J& Y; F" I
    if(!I2C_Timeout)   // bei Erreichen von 0 ist der Wert ungültig
0 I& a  X/ l8 K1 `0 J# o4 R+ @        {; M8 J: p; V5 L  P% Y
        if(SIO_Timeout)  // es gibt gültige SIO-Daten
/ \7 U8 A3 Y4 a) I5 A% n9 B1 p# ?! X            {# M7 s" c/ U; k. z3 ?; {2 P
            sollwert =  (MAX_PWM * (unsigned int) SIO_Sollwert) / 200;  // skalieren auf 0-200 = 0-2557 }# ]0 C6 y9 s
            }1 @: G+ M1 t# b% l0 u  n3 F
        else' f: T6 {: m; `6 V: k
            if(PPM_Timeout)  // es gibt gültige PPM-Daten$ ]2 k$ X' e* p6 T( }3 G7 N
                {& N1 @, ]7 A3 f$ ^
                ppm = PPM_Signal;1 A! s* J/ q/ I- Q( R; V( e
                if(ppm > 300) ppm =   0;  // ungültiges Signal
$ x5 m( x. F* D                if(ppm > 200) ppm = 200;
- Y* E4 W/ P# \: F' i5 p! ?4 K6 G8 j                if(ppm <= MIN_PPM) sollwert = 0;
* T1 G3 `/ P8 m                else % K- k! \8 R' z: |' f$ {7 g2 @
                    {8 L3 l  O" ?7 D
                    sollwert = (int) MIN_PWM + ((MAX_PWM - MIN_PWM) * (ppm - MIN_PPM)) / (190 - MIN_PPM);: s  |' J- X$ d$ A2 n9 @- ^6 V
                    }
2 v2 g3 x+ [6 G3 {( I                PORTC &= ~ROT;
) T. w5 n- e' T! N, _# {                }* I, ~% N7 K8 \$ Q% Q
            else   // Kein gültiger Sollwert5 {8 u# U  o7 b8 U+ V
                {
1 A, @1 }1 A: ?# h                if(!TEST_SCHUB) { if(sollwert) sollwert--; }   & \: m1 Q9 ?3 \* V) p0 q
                PORTC |= ROT;   Q+ }; _4 s  G  v
                }0 U1 M/ d3 g' p; d" L% ^% |2 S
        }% e: G* v3 k6 f0 S+ [
    else // I2C-Daten sind gültig* N+ L. w/ [' X) U
        {3 {& ]& L$ ?. w1 s- v' I; e% t* @
        sollwert = I2C_RXBuffer;
1 e( p% Q, ^7 L9 w# ]& T9 n        PORTC &= ~ROT;
5 U) x3 b( l) y        }
- A0 _+ c% q6 _, ~2 t6 }/ s    if(sollwert > MAX_PWM) sollwert = MAX_PWM;
! o7 i# w) N% b- Q* s3 N    return(sollwert);
, N& _; y* |2 Q* D}! v7 [) e' ^- \: `( R
void DebugAusgaben(void)
) S0 ^- Y/ g. p' ^{
! \2 x( e6 Z/ [: U    DebugOut.Analog[0] = Strom;
( |1 x7 W) n0 J- _4 W& o  J    DebugOut.Analog[1] = Mittelstrom;% O$ E2 m' d2 M0 D) K
    DebugOut.Analog[2] = SIO_Drehzahl;
4 b; l6 ]+ U# B" s( e    DebugOut.Analog[3] = PPM_Signal;& R- j( s9 T6 m7 F
}
$ ^6 T% n- |- F0 Z% E! h: W; d4 `! G$ Z3 Y
//############################################################################
1 U( R9 h7 C0 [/ V//Hauptprogramm
/ s7 e0 y7 [: K: l0 jint main (void)5 j, ^; {' o% D, Z( H5 ~
//############################################################################! }) X5 Y$ r) }5 x9 A; `" I, y
{* ?; A. [  |/ B! t
    char altPhase = 0;
8 Z4 j6 p& a8 d/ C  [& X    int test = 0;
9 C3 D' n! ~0 `  v# I9 }8 Y" o4 a0 e    unsigned int MinUpmPulse,Blink,TestschubTimer;
- \/ C( ~8 Y" [    unsigned int Blink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;
) O0 \& o  g1 E& M- ]$ y9 [/ r9 ~    DDRC  = 0x08;6 b6 ~5 V' u: _; ?
    PORTC = 0x08;+ u; ^; ]+ n2 Y4 x, J2 o  d6 H
    DDRD  = 0xBA;  K% {2 f) |3 b  j
    PORTD = 0x80;* l  @& ^' q& j* c
    DDRB  = 0x0E;
3 A: Z5 \8 v: u: m& {4 a    PORTB = 0x31;5 o: i3 k- W+ w" a. y* a
   
  h# o& G6 Q! M0 c5 K    UART_Init();' C' g& D+ C# w' _- v4 I% A
    Timer0_Init();! g# Q3 V1 r0 D) B4 N
    sei ();//Globale Interrupts EinschaLTEn( |4 l5 ~- F! y9 C0 |
   
, w; f0 x3 T) @. I    // Am Blinken erkennt man die richtige Motoradresse4 B, M* {$ z! g  D; W/ q/ ?6 P0 e$ p
    for(test=0;test<5;test++)
# r8 M/ q( K7 B1 B( Y" j# o' S        {
. ~6 D, y4 A/ L; ?. |        if(test == MOTORADRESSE) PORTD |= GRUEN;2 f( \7 @3 j6 p3 E/ k$ q
        Delay_ms(150);4 |- D! B/ B& [& J+ J5 \- w5 l9 {
        PORTD &= ~GRUEN;; B1 I5 L& t$ Y" P
        Delay_ms(250);  s1 u. x' r3 {# I1 E
        }       ) i$ [3 J3 c6 B  _0 Z  A% ?
    Delay_ms(500);
  U( ^/ r( n. P- w+ F, A   
' I! U  {) R7 w0 Q9 I    UART_Init();
' i6 H: G7 M6 ~9 N$ x0 Y, j0 Z    PWM_Init();
* H' N9 ]/ q$ p    InitIC2_Slave(0x50);                           
: n4 T# p* I- C$ Y- f+ x    InitPPM();
  s: r3 D' f7 m, C8 r/ X$ L    Blink             = SetDelay(101);    ! }$ @2 K3 ?% R$ J0 `/ z
    Blink2            = SetDelay(102);
5 L2 m4 ^  d- r5 D, P    MinUpmPulse       = SetDelay(103);: b6 @/ v& Y" e; |$ L1 }
    MittelstromTimer  = SetDelay(254);
) P7 W( {4 @: L) H( `! O' _; J    DrehzahlMessTimer = SetDelay(1005);
/ d0 L) n$ t$ i    TestschubTimer    = SetDelay(1006);
. v& N5 G+ X" l6 r% B    while(!CheckDelay(MinUpmPulse));4 W- J( Z5 D1 N1 I' }
    PORTD |= GRUEN;
; y& ?/ e- S- p+ |2 W    PWM = 0;
% s. H8 {( P9 k& L1 N. ]8 l% }    SetPWM();- Z* m: R* o5 |) O) n
    SFIOR = 0x08;  // Analog Comperator ein
- R% }0 G5 v* Y5 O5 R$ F2 s4 p    ADMUX = 1; 4 U( X3 r0 w& M
    MinUpmPulse = SetDelay(10);) A, P; O+ P  j- J* l! z2 x
    DebugOut.Analog[1] = 1;
' s8 W5 m+ \$ P% \6 d; C: E6 r    PPM_Signal = 0;
3 u$ r, d1 U8 M7 ?" V! P( D( @5 ~5 D    // zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung1 ?, D' d& a8 d6 N" h
    if(TEST_MANUELL)    Anwerfen(TEST_MANUELL);  // kommt von dort nicht wieder
/ C: ^2 W  D" q    while (1)% j' L" s9 {2 B$ p
        {
! ?% C2 t" u/ g' a* g0 V8 F8 a8 Q( S        if(!TEST_SCHUB)   PWM = SollwertErmittlung();
+ v# n+ O, p1 i. n  q- d        //I2C_TXBuffer = PWM; // Antwort über I2C-Bus
" }  R% t. Y% u, P8 [' r        if(MANUELL_PWM)   PWM = MANUELL_PWM;% Y4 x2 U. K/ d, ?
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 i" d0 X: R1 @" s1 f4 \        if(Phase != altPhase)   // es gab eine Kommutierung im Interrupt+ ~: l/ u) K# s
            {/ G/ N. }! f- H* j' I& S- T% u
            MotorGestoppt = 0;
+ P, \5 I8 K! Y$ p% k4 d) m            ZeitFuerBerechnungen = 0;    // direkt nach einer Kommutierung ist Zeit , A: g* G8 P8 j
            MinUpmPulse = SetDelay(50);  // Timeout, falls ein Motor stehen bleibt
6 \) }. v" h# j& m8 P. ]5 v9 D& `            altPhase = Phase;& W% z: z0 E4 B# v6 Q1 T  ~" b8 G# o7 [
            }& r# v* e* H! Y; E+ ~2 F  g
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# t& ]( W7 G! E4 h        if(!PWM)    // Sollwert == 0
. ~) W7 U: x) C            {
4 D& z# ]; G* H6 k; X            MotorAnwerfen = 0;      // kein startversuch. ~  ^# y* |1 G. R; L. \
            ZeitFuerBerechnungen = 0;
+ z5 A, p) m! p8 N            // nach 1,5 Sekunden den Motor als gestoppt betrachten ' `, E/ I9 i$ b( c4 n* b: h! H
            if(CheckDelay(DrehzahlMessTimer)) * d7 N! p0 h- T/ {$ O- x% W/ `
                {) g1 v, H' y  b
                DISABLE_SENSE_INT;
) r* }) I+ h- v( W0 `, b2 y                MotorGestoppt = 1;  
5 L! \$ }: ^5 |6 v$ |6 c                STEUER_OFF;
- K: R; q5 N* N  [* j  o                }
5 g; L, {3 x  m* a1 q8 `            }
! [' Y( U0 Z0 o- K$ n        else ' `6 \' j8 ]" s1 }  H0 F
            {5 I0 n5 K' W: Z0 k' W3 v0 ]
            if(MotorGestoppt) MotorAnwerfen = 1;        // Startversuch5 [$ H! `$ ], n0 ?4 W' ~( ?( k* m
            MotorGestopptTimer = SetDelay(1500);7 m2 a- ?, L1 r  ^2 J$ X3 A
            }( D' J1 i! k# S6 k  c! `
        if(MotorGestoppt && !TEST_SCHUB) PWM = 0;5 ?. `) q! I$ S& N, G- ~% b
        SetPWM();
6 J' ?$ v4 {$ U# G4 y! S        // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- w& ^) q* _4 ]2 h* Q- Y+ h        if(!ZeitFuerBerechnungen++)
2 r8 o' B3 c1 i& d) e            {
6 p! R3 ]) f: f/ g! B6 j( q            if(MotorGestoppt) PORTD |= GRUEN; //else PORTD &= ~GRUEN;
6 f) e1 f; b" P; r) p            if(SIO_DEBUG)
: O4 D" y3 J' p$ E- H9 r: N3 n                {
8 C: `. s5 K2 V- A! G                DebugAusgaben();  // welche Werte sollen angezeigt werden?
) J8 F5 C8 o. t0 @. N; y/ Z                if(!UebertragungAbgeschlossen)  SendUart(); : Z5 n- k0 I8 W( R/ x
                else DatenUebertragung();
- P$ i) m. E" t" c                }6 d) z- i" q" ^+ a
            // Berechnen des Mittleren Stroms zur (langsamen) Strombegrenzung8 }/ u& g& u$ g( ?: B7 j
            if(CheckDelay(MittelstromTimer))   * d1 Q$ n7 _0 O8 `5 P2 v+ P
                {
4 T  n% I8 D3 l7 v* I* s% P                MittelstromTimer = SetDelay(50); // alle 50ms" r, }7 o" A# K" x8 T! s3 G8 D+ C
                if(Mittelstrom <  Strom) Mittelstrom++;// Mittelwert des Stroms bilden+ ]9 R8 O5 {4 J( Q# x  m+ I( V
                else if(Mittelstrom >  Strom) Mittelstrom--;4 U3 C- ^3 |# |# P$ t; c. y
       5 @- @) b1 X: {# Y
                if(Mittelstrom > LIMIT_STROM)// Strom am Limit?$ u$ i% k) G& T9 \" P$ q8 a# H
                    {9 v- y  y/ z! r# p1 q  G
                    MaxPWM--;// dann die Maximale PWM herunterfahren2 |$ ]  v9 G3 l7 b
                    PORTC |= ROT;
1 u' Y6 h# }  d0 `# e2 N2 t. p# f                    }5 o, v0 A/ e4 S, Q4 E- N
                else
3 Y" \& l1 j) p) _                    {
  q# J$ `3 i) ~9 O/ p# c# J$ B                    if(MaxPWM < MAX_PWM) MaxPWM++;
! \- p: ^0 e( N                    }
0 Q# z: T4 `3 G0 P                }: `( I! ~$ e9 l# K9 I  y
            if(CheckDelay(DrehzahlMessTimer))   // Ist-Drehzahl bestimmen  V* h' ~0 e5 T8 P
                {
1 N8 P+ f9 L& v# k: l( O- p. I                DrehzahlMessTimer = SetDelay(10);  v: A+ v) y% @! N3 b
                SIO_Drehzahl = (6 * CntKommutierungen) / (POLANZAHL / 2);
" K$ e1 d7 s  f( i, G  ^                CntKommutierungen = 0;4 ~" i/ W4 U0 j0 _' D+ K7 Q3 O
                if(PPM_Timeout == 0) // keine PPM-Signale; O! f- K8 S3 T  M3 _
                ZeitZumAdWandeln = 1;  q9 ?5 r, J1 q' m/ h* [0 n
                }- S9 z# g; t2 F+ M
8 [4 `/ |1 @' b/ j6 F9 {
            if(CheckDelay(TestschubTimer))  $ Q! o: Z. U7 S/ w0 E9 ?  G+ C; W$ U
                {
0 M+ C( K& N# o1 j                TestschubTimer = SetDelay(1500);
- z) z" `+ e# @3 l" K, r                if(TEST_SCHUB)+ F  G& a4 }1 o! J8 h4 y
                    {0 l% g7 E  x. p
                    switch(test)
3 A& E3 r0 Q* V* I                        {
( f1 ]" B8 U- Q- x3 }' Y                        case 0: PWM = 50; test++; break;
6 n9 ]5 [0 X. _                        case 1: PWM = 130; test++; break;
  ?5 S5 o% ?6 Z$ r4 |- c3 p  V* B+ K                        case 2: PWM = 60;  test++; break;0 t0 d6 R% G4 k2 g; K
                        case 3: PWM = 140; test++; break;6 t! {% P, _( c" X) {2 t+ y
                        case 4: PWM = 150; test = 0; break;: P( \. @: K! l! v
                        default: test = 0;
  u8 P* d8 N& _3 x: x! S                        }
0 `) k8 U+ N; l1 U                    }
' B( l+ y" H( T                }
; `- _! o- _0 s- I( R            // Motor Stehen geblieben- ^+ E8 T1 A. J1 b
            if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen)
8 c% {% O5 f5 G# ]  O                {
# a1 \  O, S& ?                MotorGestoppt = 1;   
8 M- t/ X5 b; K$ N$ Y                DISABLE_SENSE_INT;
- I% ?3 m5 D; ?  l0 T                MinUpmPulse = SetDelay(100);         . ^8 ~4 Q2 J$ @
                if(MotorAnwerfen)
( @5 t; w' C3 e                    {
0 [. m  Y/ T9 v1 X                    PORTC &= ~ROT;1 o5 J# J2 ^4 F
                    MotorAnwerfen = 0;, J4 F# T- [5 n* x8 W/ c2 B
                    Anwerfen(10);$ r7 n% @" \: v0 g* Y, k- w0 X
                    PORTD |= GRUEN;
& w; d0 w7 X  N$ v; Y                    MotorGestoppt = 0;   
0 ]- p4 \  v/ _# H% h                    Phase--;5 E- X1 W( I2 ~$ T8 R' B, q
                    PWM = 1;
. X  V* C5 m: X4 A, c* H' {! H                    SetPWM();
( w6 C1 n: Y- B1 R9 K                    SENSE_TOGGLE_INT;0 [5 d6 E5 j  u' @; O
                    ENABLE_SENSE_INT;
8 {' E- L* T$ B8 U4 H. o                    MinUpmPulse = SetDelay(100);
* q  A% A4 ?8 T3 u- j                    while(!CheckDelay(MinUpmPulse)); // kurz Synchronisieren
. |: R5 F& T1 s( N+ @                    PWM = 10;
9 q4 n9 _2 E1 M4 R                    SetPWM();
5 w9 K  K+ j8 f) K8 D                    MinUpmPulse = SetDelay(200);
! m/ l: V( @  F' i& \3 }1 T7 y                    while(!CheckDelay(MinUpmPulse)); // kurz Durchstarten" G4 ], ^. u+ c
                    MinUpmPulse = SetDelay(1000);& S( Q  R- S: v+ N% Q4 ?
                    altPhase = 7;
6 X+ y7 O2 h5 \8 p                    }1 j! R& X' t9 m5 Z( i$ `4 m' ~
                }) ]* p; x8 q' h/ |4 P. p1 Z( v
            } // ZeitFuerBerechnungen
0 @! O, t- ]8 c2 |1 p/ g7 z        } // while(1) - Hauptschleife
( M3 B1 ~% u9 v3 B9 r}
* w& V) g9 l) |* a/ [# Q这个是部分的源码 有想要了解的就去下载看吧) X3 ^3 |: r+ q/ k' M1 H
下载:+ k  j: L+ z2 N/ C5 I
游客,如果您要查看本帖隐藏内容请回复

' [* t* Z) Y  H1 u% r3 ?2 S7 s. x

该用户从未签到

推荐
发表于 2020-8-10 23:32 | 只看该作者
看看                      5 \" T" |  l# ^+ {; o7 j- ^' H: R7 S

该用户从未签到

推荐
发表于 2020-7-31 14:05 | 只看该作者
感谢分享DDDDDDDDDDDDDDDDDDDDDDDDDD( B+ v) f, }2 h' b, e; k$ o& L

该用户从未签到

推荐
发表于 2021-5-31 18:00 | 只看该作者
好文章。 感谢分享!感谢分享!感谢分享

该用户从未签到

7#
发表于 2019-6-15 19:32 | 只看该作者
谢谢分享,学习参观

该用户从未签到

9#
发表于 2019-6-25 16:34 | 只看该作者
看一下啥情况

该用户从未签到

11#
发表于 2019-7-25 14:25 | 只看该作者
正好需要,很感谢
" w, G7 _: y3 O* p

该用户从未签到

12#
发表于 2019-8-5 14:20 | 只看该作者
谢谢分享,学习参观!

该用户从未签到

13#
发表于 2019-8-22 22:27 | 只看该作者
好东西,顶一下
- d0 C7 A- _% t( f, h$ A8 K+ m8 o. z% {& k! S- Z

该用户从未签到

14#
发表于 2020-3-5 20:43 | 只看该作者
谢谢分享,感谢楼主。0 u6 n! W( V8 ^5 f: C0 X/ ^* e2 x4 L
  • TA的每日心情
    开心
    2020-3-31 15:19
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    15#
    发表于 2020-3-10 10:02 | 只看该作者
    这里没看到控制算法?. v% L7 E5 d. c# N/ p8 Q2 h
  • TA的每日心情
    奋斗
    2020-3-27 15:05
  • 签到天数: 2 天

    [LV.1]初来乍到

    16#
    发表于 2020-3-27 15:48 | 只看该作者
    谢谢分享,学习参观

    该用户从未签到

    17#
    发表于 2020-4-7 20:13 | 只看该作者
    谢谢分享,学习参观% j/ {. H7 C+ }

    该用户从未签到

    18#
    发表于 2020-5-24 21:48 | 只看该作者
    德国人但是
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-29 13:52 , Processed in 0.171875 second(s), 28 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表