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

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
德国MK项目BLDC电调程序的源码!: I7 D' H$ W- ^0 ?8 O/ x- C$ n8 q
7 U1 U5 L# d& h6 Y3 ~+ g' G. S
#include "main.h"- p3 l1 a$ }, r/ m0 I- S. ]
unsigned int  PWM = 0;
9 F; c2 Y) I# Bunsigned int  Strom = 0; //ca. in 0,1A1 v5 M% j& {4 S; J
unsigned char Strom_max = 0;) w' U7 S' Z3 |! y, O$ s, I
unsigned char Mittelstrom = 0;
! [+ W7 P2 `' r$ S& |) G+ A8 `8 Aunsigned int  Drehzahl = 0;  // in 100UPM  60 = 6000
& Y! g  s- x$ Y. u5 C1 r/ _unsigned int  KommutierDelay = 10;+ Q7 A! n! t7 d5 @3 c
unsigned int  I2C_Timeout = 0;8 l1 u# F/ ?* m6 u
unsigned char SIO_Timeout = 0;  K# m5 x, Y4 m* G
unsigned int  SollDrehzahl = 0;
% w. B" T8 T- y; runsigned int  IstDrehzahl = 0;
. N$ }6 u& ]8 k4 D) Gunsigned int  DrehZahlTabelle[256];//vorberechnete Werte zur DrehzahleRFassung6 }: q) U# w5 k, Y, a7 B5 I+ d
unsigned char ZeitFuerBerechnungen = 1;
# R) _6 x+ b& W' I* w: Z6 cunsigned char MotorAnwerfen = 0;
& n" Q! d3 b6 k4 ^/ Z) Punsigned char MotorGestoppt = 1;
7 N( S- H- a' Q( v- eunsigned char MaxPWM = MAX_PWM;7 R: y9 l. C+ O3 E7 e
unsigned int  CntKommutierungen = 0;
3 ^' E, }  m1 m+ Y& aunsigned int  SIO_Drehzahl = 0;5 y1 v0 d  o+ b1 R' ~
unsigned char ZeitZumAdWandeln = 1;
; {7 A) _) `% G7 @4 u8 ]/ K, q, g4 X0 m$ E2 {  ^5 b9 g
//############################################################################& ^9 v7 T, I3 b! h$ t' Z+ {" k2 ]
//
: z: T( t( `4 i  Nvoid SetPWM(void)
% Y' N. b4 J# c//############################################################################
1 k" o% B* G3 d2 X; R" R{
  y7 a9 n, |# G7 B  Z- x# X    unsigned char tmp_pwm; & t' E* ]4 \* q. J
    tmp_pwm = PWM;- {& O8 ^+ e, m0 v" e# b
    if(tmp_pwm > MaxPWM)    // Strombegrenzung
  j0 w# K; X1 ]5 x/ Z        {
5 N; q- a- O' H5 }" J        tmp_pwm = MaxPWM;( Q- S1 w" a5 J4 R: P0 S1 O
        PORTC |= ROT;
% u$ C3 k. V! Z; n* c/ J6 l        } ; b( }; E0 L$ B! T
    if(Strom > MAX_STROM)   // Strombegrenzung
$ R! x7 X/ h7 \  f7 W* q! ]( J! |        {
5 |- j' Z2 j9 @# N) Q, h        OCR1A = 0; OCR1B = 0; OCR2  = 0;
* G2 X- }* l6 X  v0 d, B        PORTC |= ROT;
, r( l3 c$ k+ J/ N) N% x* ?        Strom--;1 a  b0 S& J2 Z7 `
        }
+ y! R$ v, _+ M6 {    else
/ T- U0 y, y+ I3 r. C        {' _% s; P7 d: l; w( S$ U
        #ifdef  _32KHZ . ^. B1 f! f5 r2 p1 _# B4 }2 X
        OCR1A =  tmp_pwm; OCR1B =  tmp_pwm; OCR2  = tmp_pwm;1 y4 O, w" v4 z$ @- k* o
        #endif
+ |- i" o' v0 L3 z3 }        #ifdef  _16KHZ 6 g8 d; K( E( o
        OCR1A = 2 * (int)tmp_pwm; OCR1B = 2 * (int)tmp_pwm; OCR2  = tmp_pwm;  T/ H9 I( a; z) J/ a
        #endif
8 Q2 p1 Q' ?% s2 w; G0 U  w        }! a% A) I2 X% A" b* N
}1 j) `  J; d) ]. i/ k% s2 e
//############################################################################
- Z& a7 f: z+ N5 z* n% H9 D//6 m- b6 P" l* u/ l
void PWM_Init(void)( e  w1 P5 h. J: }, c$ Z
//############################################################################
$ A7 ?3 u3 e* b{
% I' X" L& n4 B9 w# u    PWM_OFF;
% S  I8 G8 T% l; k" c+ |; j    TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (1 << WGM12) |
7 Z) w) E5 d6 ]- }             (0 << WGM13) | (0<< ICES1) | (0 << ICNC1);. Y/ j4 v' ^2 o# Q6 [; B
}
) P' L# H7 C; b+ C  v$ I% F2 E3 I//############################################################################
" l& o; r8 J: b" c1 g* G//" I4 `( N2 b3 w6 h5 e
void Wait(unsigned char dauer)
; y  l2 d, J; l0 N9 i- V, {//############################################################################
% z7 M+ R! r8 r$ i  l3 [7 u{
) P  o+ h7 q) {. Y: l- p+ h    dauer = (unsigned char)TCNT0 + dauer;6 Q( {; @* D7 t* ?; R# @1 g
    while((TCNT0 - dauer) & 0x80);% w6 ?2 A' ~$ y5 Q: E
}
! a0 I" c, J/ l& E5 Z  t//############################################################################
% }% }$ O! ^" o; K0 U//
# r9 h# y0 j1 uvoid Anwerfen(unsigned char pwm)
# F3 _9 s* u3 m5 `/ `4 k//############################################################################( g+ h2 p* ?4 Y+ V8 j: a% Z2 G0 F
{0 M- u5 B. h6 J
    unsigned long timer = 300,i;3 n& Q8 g3 R: a
    DISABLE_SENSE_INT;
0 o( U6 W# a) v7 R6 @% N( l    PWM = 5;! ~& F7 U+ [* A- z3 N7 t4 l3 V
    SetPWM();
7 x# ~2 u( N% g6 g0 U    Manuell();
$ P( [  z% Z* D5 i/ m    Delay_ms(200);
0 u6 N' b( P2 f: M  I; [* G2 E$ d, o    PWM = pwm;
; R' u9 f* V2 T' [8 y8 u3 n    while(1)
* s0 [. |; m, B9 p; A$ W) W) ~        {
  j2 f' `/ x- J$ U& q* M        for(i=0;i<timer; i++) 4 d2 V& s8 E( T4 C# c
            {! m5 E, x, ]  c7 M/ S* r* y
            if(!UebertragungAbgeschlossen)  SendUART();7 d5 S1 {7 c* j) G
            else DatenUebertragung();5 Z8 n8 r0 r8 V5 W$ g
            Wait(100);  // warten5 d( P' s7 ~* M; I' }# o* T" z
            } 7 ~# X( z5 v1 W6 E& ~* W
        timer-= timer/15+1;
+ s& P) u' f1 w# S" H# M; }        if(timer < 25) { if(TEST_MANUELL) timer = 25; else return; }
6 K- ]# T( Y+ }        Manuell();
% U# c/ q+ X8 j4 v. O7 E. Q9 j        Phase++;! I4 O2 R, B+ H. u) K- ]5 {
        Phase %= 6;
- O5 ~2 [/ Y1 ~0 j% w        ADConvert();
+ L7 v$ _; p$ ?. q1 C4 O8 X        PWM = pwm;
- ?9 i$ x2 G( }' v2 g, r        SetPWM();
$ K, Q' H8 K5 w. j' t; e$ P        if(SENSE) 9 }! A( u& y5 b* A9 V! N
            {
+ g, ?/ R: b; f            PORTD ^= GRUEN;1 y1 Y) Z# b5 D. u. a: e
            } 1 x1 m5 ?" }, Z5 Q5 o8 N0 W
        }; I* `* N1 X4 e1 b
}) i9 _; l2 _# F. I8 S
//############################################################################" ?# Y  b/ c2 _
//* ^  v5 |. Z) U( `
unsigned char SollwertErmittlung(void)
% O8 z  O3 a  E% x6 a//############################################################################
) |8 ?2 d$ q; P# T! }8 a- K6 K4 w{
/ q+ ^, s" c$ a2 C    static unsigned int sollwert = 0;  m, l7 F1 W+ B1 B. s& a2 |
    unsigned int ppm;
7 F/ t3 j: X: J6 U    if(!I2C_Timeout)   // bei Erreichen von 0 ist der Wert ungültig
: J) I; f9 F9 g: E) y        {, p9 {# k3 x0 d' ~# Q  H  x0 K
        if(SIO_Timeout)  // es gibt gültige SIO-Daten
( [& P& ^& y) f! G: T7 m7 S) D) T            {
7 M8 X( B$ h6 g9 p9 I; l/ A            sollwert =  (MAX_PWM * (unsigned int) SIO_Sollwert) / 200;  // skalieren auf 0-200 = 0-255( S! b& N0 `1 M
            }. K6 e, ?' p. c7 ]9 z4 D
        else
$ O: {5 @" m5 ~8 ?            if(PPM_Timeout)  // es gibt gültige PPM-Daten3 v9 c+ D! S) G* m1 h) I- c) k
                {
6 V. k! x: z. O- W# m: F9 y                ppm = PPM_Signal;
) B1 q* r6 L" D( E                if(ppm > 300) ppm =   0;  // ungültiges Signal
! Q/ z0 J6 `( f: ^6 ~- M1 K6 N$ n                if(ppm > 200) ppm = 200;
% ^5 z- B# W3 u. A: r& G                if(ppm <= MIN_PPM) sollwert = 0;' j; I2 ~  K0 N9 k  E" |  D2 F
                else
$ p, O) y" b3 t* b2 U  f2 r                    {9 W7 N" D" Z* M/ y3 [
                    sollwert = (int) MIN_PWM + ((MAX_PWM - MIN_PWM) * (ppm - MIN_PPM)) / (190 - MIN_PPM);. Q' n$ [7 r# H8 I( C+ M: H$ |
                    }' g2 P( F  M0 `; h- m2 d: w: m
                PORTC &= ~ROT;
) z4 w' \9 C- ]1 [1 U                }
" @- T- _5 j2 ~            else   // Kein gültiger Sollwert. x! H6 s! D# t4 @! S. K1 ~# m! s4 e& _
                {
$ z" S' N- L+ |9 c0 \( c( Q* r2 v                if(!TEST_SCHUB) { if(sollwert) sollwert--; }   4 p, s2 Y, Q, H; t5 \# A; h* S+ D" K
                PORTC |= ROT; $ e: E* e' }7 Q: i  P$ r
                }
1 A) Z3 m! N) K1 o% K8 D. F        }! j1 a- r) L2 d  p, R+ ?
    else // I2C-Daten sind gültig
" Z4 f6 G4 N9 I& h( d* o2 \        {& t8 n0 U8 E- e8 Z! f6 k3 L
        sollwert = I2C_RXBuffer; 9 q/ A8 m% \3 L- d. D
        PORTC &= ~ROT;5 V! m! U# L% w! Z' x+ z7 }
        }% V2 u2 H( L7 n5 q- h" n
    if(sollwert > MAX_PWM) sollwert = MAX_PWM;$ {% w* a) W$ U3 h6 x! b
    return(sollwert);
, n% K# ?  ~! P8 N! L7 g}& }) |, ?* p7 ~/ _3 g
void DebugAusgaben(void)
' P% l1 {3 K$ ^3 U. a) M{9 n5 c- @2 z8 @3 U! Y  Z+ I
    DebugOut.Analog[0] = Strom;5 _2 j; g! k, D; |: Y- R/ v
    DebugOut.Analog[1] = Mittelstrom;
  k  [& n; F7 z) g  K. O$ e: `    DebugOut.Analog[2] = SIO_Drehzahl;* _: s1 z( @# S8 H% ]7 L
    DebugOut.Analog[3] = PPM_Signal;* x9 s/ m3 I# N, B
}* w( a* j8 O/ ^

% n6 Y' m8 t# c1 ^//############################################################################3 S8 y+ A6 r0 {$ f$ |' Y; j& }
//Hauptprogramm6 {" F; g! D: ~8 {
int main (void)- M$ v, \" ^* L( k0 @: ?7 \
//############################################################################) i0 I  c/ s/ J' ~, U9 g
{- _2 K0 ?7 [3 ^8 O
    char altPhase = 0;
4 f7 e  }1 X" ]- r% V2 u2 l3 R    int test = 0;
% e: h. F2 q4 k/ Z0 L7 Y5 F6 T# Y& H    unsigned int MinUpmPulse,Blink,TestschubTimer;0 o, ], T7 F& u( p% D, \" M6 E  N& p; V
    unsigned int Blink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;3 Y. L7 `6 q8 F7 K. ~
    DDRC  = 0x08;
7 Z/ l* m* n% ~3 B    PORTC = 0x08;; j( F! Z- u3 v0 ~" z
    DDRD  = 0xBA;' I4 r) A8 }0 H0 @* V# @! s$ J
    PORTD = 0x80;
2 I+ `  t  z3 G& f. I    DDRB  = 0x0E;
8 J1 }! O, [1 l! O) r! x    PORTB = 0x31;
  `7 N$ E+ x$ E, E7 W8 u; E   
6 n' N) j3 `6 f" i7 l9 ~7 |+ _    UART_Init();
& J! R+ m& Y+ y    Timer0_Init();- @6 k8 T' G( U' V# R& N
    sei ();//Globale Interrupts EinschaLTEn
4 G6 M( @8 H! ~5 U9 X) b6 b/ h6 }    + M  Y5 w1 ], y, H* f- n, z. t3 Y, _. R3 j
    // Am Blinken erkennt man die richtige Motoradresse' W% _' v, n: X( }4 l8 o, [
    for(test=0;test<5;test++)8 H& Q; G3 b, g3 I
        {1 P& p, |3 T6 f2 q
        if(test == MOTORADRESSE) PORTD |= GRUEN;( F5 C/ n( y4 |! M9 Z3 h
        Delay_ms(150);& @1 ?9 V; v& q- V9 u! I& a5 t
        PORTD &= ~GRUEN;: l% p  y6 J0 b( B
        Delay_ms(250);$ e* W: ~$ I$ T: p
        }      
, A9 k/ F2 L/ P    Delay_ms(500);6 T. o! r, D# F7 m8 E( [$ \
   " k; a; L' Y- X) _
    UART_Init();
1 \+ {6 B2 D; u" m: A5 i) c    PWM_Init(); $ |1 _1 [) R6 V% P# ^' ]
    InitIC2_Slave(0x50);                           
9 Y% h3 [5 L, r6 G* n    InitPPM();
$ z! p/ m6 I. O3 E/ V    Blink             = SetDelay(101);    / z) D& N  U; r$ j, m! b
    Blink2            = SetDelay(102);
. r" u' S( ^/ N4 F( X: {. o$ S    MinUpmPulse       = SetDelay(103);
4 O+ J, @$ J: d2 r: r7 W    MittelstromTimer  = SetDelay(254);
* N2 ]" Q/ q1 z. b6 y4 k( Q    DrehzahlMessTimer = SetDelay(1005);' E8 i0 p6 A" B3 g
    TestschubTimer    = SetDelay(1006);) [! t$ n- s4 v" M% D  b* F
    while(!CheckDelay(MinUpmPulse));
. f- j/ @8 x/ x* ?, ?0 y* Z+ G& b    PORTD |= GRUEN;
8 f) O! s: D, U6 q4 \$ N    PWM = 0;) j& w9 X5 n9 ?% F$ t( e8 b: S, y
    SetPWM();
5 I3 ~+ a0 E* E    SFIOR = 0x08;  // Analog Comperator ein. s; h! [: t3 u8 |/ t
    ADMUX = 1;
: t1 N9 D; o! m; Y( T' v2 \    MinUpmPulse = SetDelay(10);
5 E! J. C2 C( d' d+ v) h    DebugOut.Analog[1] = 1;: I" |& r, [) T! o. V( q
    PPM_Signal = 0;
/ x) b8 [0 ~/ ^& e- j& q    // zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung
3 y# D" ?  Y) K9 w% q9 M# @9 e    if(TEST_MANUELL)    Anwerfen(TEST_MANUELL);  // kommt von dort nicht wieder
$ F$ @: b, T+ ?& b    while (1)
6 p  T- H% B* H$ i# Q        {) @, V5 G* G) d' J: Q1 f+ H! e
        if(!TEST_SCHUB)   PWM = SollwertErmittlung();
. j0 J" q9 ~/ `* e9 m! b* O6 a        //I2C_TXBuffer = PWM; // Antwort über I2C-Bus
5 ]- z$ J; _  p' ?- \" g" w  P        if(MANUELL_PWM)   PWM = MANUELL_PWM;6 b) W% B5 ]" b0 ^1 W+ W4 G: U& B1 X
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$ m# J: o5 t3 }& y7 y& G
        if(Phase != altPhase)   // es gab eine Kommutierung im Interrupt9 K) ?) ^. B% x; U% t
            {1 T5 B1 ~) B- `  x( m
            MotorGestoppt = 0;
9 W9 R8 y5 L7 q1 `* A/ p            ZeitFuerBerechnungen = 0;    // direkt nach einer Kommutierung ist Zeit
7 o' S% A: J8 Q9 X, Q& x- L            MinUpmPulse = SetDelay(50);  // Timeout, falls ein Motor stehen bleibt- q) P+ q0 |, x( ^. g7 U3 b
            altPhase = Phase;; o) f5 i" \9 S1 W: {5 E$ p# o
            }
6 C$ }# w( k" o  b$ J- B0 h: ^        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++: v: p0 D" ~7 M. v" z# w% v
        if(!PWM)    // Sollwert == 0
2 Q7 \$ V# z) H            {
7 A# z" z/ }, p: @  K. [            MotorAnwerfen = 0;      // kein startversuch
# n2 `/ x4 S' ?  N' O  m( f            ZeitFuerBerechnungen = 0;
  a6 j8 u; p" E, P            // nach 1,5 Sekunden den Motor als gestoppt betrachten   _% l' g( D, C" j; L  B& v. b
            if(CheckDelay(DrehzahlMessTimer))
% N0 U' H1 R$ j& L/ P' t: f8 ^                {. m5 W2 }8 V, ^5 H) N) B* E+ o
                DISABLE_SENSE_INT;6 ?% X% F, m# Q9 |0 i) q
                MotorGestoppt = 1;  9 \2 j  S4 C2 n
                STEUER_OFF;2 i9 Q# K5 R, j. ?4 M& P) f8 l( B
                }
, s& ]/ {) j! W6 ]            }5 ]+ M( l" e) _! x5 A& ~
        else - f  y) I* Q, }0 }, `0 d+ @5 Z
            {9 l7 r2 \% t3 I, i+ m# J
            if(MotorGestoppt) MotorAnwerfen = 1;        // Startversuch
: a% k$ h% y( z) V            MotorGestopptTimer = SetDelay(1500);
8 B, [: w/ {6 y% d& p* p: T; U9 Q' j            }
* K8 O. U1 |) T3 F        if(MotorGestoppt && !TEST_SCHUB) PWM = 0;
+ `* s: B5 P2 m) V        SetPWM();
3 k1 ~# K6 m* I# W        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ S3 y8 P9 n+ `
        if(!ZeitFuerBerechnungen++)6 L) J9 o- L) \) ?- f6 ]. w7 V
            {
$ E; \, a4 e5 ?. f: r            if(MotorGestoppt) PORTD |= GRUEN; //else PORTD &= ~GRUEN;
$ g, P9 T; z5 H            if(SIO_DEBUG)( M4 X) V/ _  K
                {5 Y; z( `- Z. G- s6 u, a
                DebugAusgaben();  // welche Werte sollen angezeigt werden?8 J- i$ R5 r- I. t- T% s% ]
                if(!UebertragungAbgeschlossen)  SendUart(); 9 @9 E. C: E( l8 K
                else DatenUebertragung();. f% K# C% h, k& t9 s2 S( p
                }0 {) J& Y' T3 Z
            // Berechnen des Mittleren Stroms zur (langsamen) Strombegrenzung
9 X/ e" e/ `: p; r8 O/ ^            if(CheckDelay(MittelstromTimer))   
: i$ A* f+ e2 q                {
5 ]" b! a  R- U                MittelstromTimer = SetDelay(50); // alle 50ms+ @/ Q' G$ g! n( {) d- ~
                if(Mittelstrom <  Strom) Mittelstrom++;// Mittelwert des Stroms bilden9 d7 A# i9 ?9 y
                else if(Mittelstrom >  Strom) Mittelstrom--;
. S1 t4 U* _, G! j7 p0 W& w+ D       ( _: Z' G  D- H1 l
                if(Mittelstrom > LIMIT_STROM)// Strom am Limit?
9 a% v8 Y+ i( D/ S: O; `. ~, o                    {
4 a  u0 K7 ^* ~8 K2 R% u7 E/ y                    MaxPWM--;// dann die Maximale PWM herunterfahren
' P  t; Y7 m& }7 u' V9 p                    PORTC |= ROT; $ j) q5 v- G. o. i: T+ v% C# s
                    }
1 X( [# Q, V/ w4 r8 |2 p, `                else
  Y/ I) ]) w/ d! c                    {
$ V4 _0 H: A* u) r" {- V+ A                    if(MaxPWM < MAX_PWM) MaxPWM++;+ o- Q5 R! e( z
                    }
+ ~1 E9 K7 C6 n/ ~4 Z# k) F                }
4 q9 n" Q" Y% [/ S6 X            if(CheckDelay(DrehzahlMessTimer))   // Ist-Drehzahl bestimmen
' R7 t! ^: Z3 g( A6 B+ J                {
+ T1 Q9 K. n" A+ z                DrehzahlMessTimer = SetDelay(10);
% d5 p1 y7 X/ r/ Q1 F9 b: N                SIO_Drehzahl = (6 * CntKommutierungen) / (POLANZAHL / 2);
3 E1 c5 }% Y$ F& G7 X                CntKommutierungen = 0;
+ _: V$ S2 p3 G/ v  z* I7 Y5 V                if(PPM_Timeout == 0) // keine PPM-Signale
' w2 y5 t* J' n. B2 w: B: U                ZeitZumAdWandeln = 1;
) S  }$ g  E, b                }
2 x( X4 j) k: p# Z8 m' R
' `7 x& J$ }3 |: {) r8 y            if(CheckDelay(TestschubTimer))  
5 _. r; |7 O' @8 z; ~- \                {
- v# ]+ h- q5 p                TestschubTimer = SetDelay(1500);
/ J# ~& M* c" b6 ?( J! @# u                if(TEST_SCHUB)2 ]$ O( l) L3 b& a' M+ A! f
                    {
- W" g& G4 K  `                    switch(test) ' P  Q  s1 ^8 l& i  e3 J$ W
                        {' _" U0 d5 \, O2 `9 g8 j- v: f
                        case 0: PWM = 50; test++; break;
; S/ V5 w4 x) p9 f                        case 1: PWM = 130; test++; break;
' Y, G+ ?; K. r4 |                        case 2: PWM = 60;  test++; break;
" o; ]" ]+ v2 Z3 [( _, s6 l, o5 p% j                        case 3: PWM = 140; test++; break;
5 x- J- L  T# ]( r0 a7 Q5 O8 U                        case 4: PWM = 150; test = 0; break;' E) q5 `3 M* b- L6 Q8 V; E5 n
                        default: test = 0;, o) J$ C( m2 M! t8 o. h4 g
                        } 4 l" Y, B: o+ u# s( s5 d
                    }
0 L$ U: e/ q- T- n/ d, o                }
3 h! ~, h& p6 i4 E; h5 p& ~            // Motor Stehen geblieben' m1 s0 w4 x: g8 v
            if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen)
$ ]6 r% @, l6 u: H- e3 H                {
, `; V- T, X7 T2 t* _                MotorGestoppt = 1;   
& s  o4 |" k. @" _1 R' l: \                DISABLE_SENSE_INT;) j/ k6 |+ s% R2 i5 Y
                MinUpmPulse = SetDelay(100);         8 W; z% E& C' m+ z  l
                if(MotorAnwerfen)+ l2 i  Y5 s. P( L0 u* a# b1 v
                    {
6 d" l( V$ b$ v7 m" \5 z                    PORTC &= ~ROT;7 h( L- g; I6 c; s1 P' |  W
                    MotorAnwerfen = 0;4 o4 ^, o4 t; [$ [. O; G
                    Anwerfen(10);8 b. v: ^- |" w0 Q/ s6 p
                    PORTD |= GRUEN;; z7 |- p' t6 J# E; g
                    MotorGestoppt = 0;   
# Q3 z) Z* g& g/ {                    Phase--;$ O9 |* [) z+ A' ]2 c
                    PWM = 1;! E. ?/ T8 y& G- P  k
                    SetPWM();6 }# L2 ]3 ]: `& E  E9 M1 `/ I6 T
                    SENSE_TOGGLE_INT;
1 F, x- v* v3 b, o4 m                    ENABLE_SENSE_INT;
5 b9 G. T; X/ k; r  `3 w                    MinUpmPulse = SetDelay(100);
2 t, `+ m5 x! S                    while(!CheckDelay(MinUpmPulse)); // kurz Synchronisieren
8 T; R3 A+ S& v) Q& d+ W- G# ~2 r$ X                    PWM = 10;
. c2 I9 L! o& ^! U. I: P, h                    SetPWM();  V- b( A% W  o4 F' _9 c
                    MinUpmPulse = SetDelay(200);
; F8 o$ \: |$ a                    while(!CheckDelay(MinUpmPulse)); // kurz Durchstarten6 }. Y9 Y# b" N$ x# Q
                    MinUpmPulse = SetDelay(1000);
2 Z3 ~  q2 [. w7 I: D6 Z% h                    altPhase = 7;0 R# o  K. D, p9 U
                    }
, N$ ~$ z7 o0 O1 t' g& r9 M                }6 w' F$ q0 S) ]4 v' x# g
            } // ZeitFuerBerechnungen
) M# X8 }4 a+ _2 Y  L        } // while(1) - Hauptschleife
7 n& E$ w; o" k}
+ {4 y; C. d9 k% r" M1 B0 u这个是部分的源码 有想要了解的就去下载看吧8 f3 l# t( w$ `, A3 Q& P, ~
下载:) I# V; u  Z7 j$ P  {; T8 J6 U3 i" Q
游客,如果您要查看本帖隐藏内容请回复

! `: O# i- N4 i- N% S. M" |
5 [3 x2 a$ m& b* ]

该用户从未签到

推荐
发表于 2020-8-10 23:32 | 只看该作者
看看                     
! ?. a) F$ i$ z; M5 h4 y

该用户从未签到

推荐
发表于 2020-7-31 14:05 | 只看该作者
感谢分享DDDDDDDDDDDDDDDDDDDDDDDDDD  l5 y9 N; C# T2 q5 g7 t

该用户从未签到

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

该用户从未签到

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

该用户从未签到

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

该用户从未签到

11#
发表于 2019-7-25 14:25 | 只看该作者
正好需要,很感谢
( q. V8 x! F8 k: ?* J  W, D

该用户从未签到

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

该用户从未签到

13#
发表于 2019-8-22 22:27 | 只看该作者
好东西,顶一下
/ C- p+ f9 F+ S- e! n- M* ]3 i. W! l& l# x* N4 n* g

该用户从未签到

14#
发表于 2020-3-5 20:43 | 只看该作者
谢谢分享,感谢楼主。/ O3 ?; Q. ], e* t; a' d
  • TA的每日心情
    开心
    2020-3-31 15:19
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    15#
    发表于 2020-3-10 10:02 | 只看该作者
    这里没看到控制算法?
    $ c8 E: F& e: r' R/ q/ e
  • TA的每日心情
    奋斗
    2020-3-27 15:05
  • 签到天数: 2 天

    [LV.1]初来乍到

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

    该用户从未签到

    17#
    发表于 2020-4-7 20:13 | 只看该作者
    谢谢分享,学习参观
    5 N" t5 v2 F2 D* s) A0 G- X2 _

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-29 17:32 , Processed in 0.187500 second(s), 28 queries , Gzip On.

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

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

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