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

51单片机直流电机与舵机冲突怎么办? 是电压不够吗?

[复制链接]
  • TA的每日心情
    开心
    2020-7-28 15:35
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2020-2-3 09:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

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

    x
    不连接直流电机,舵机可以正常工作。只要连接舵机就不能正常工作。(是电压不够吗?)#include <REGX52.H>( \" p/ u+ G- p7 f
    typedef unsigned int u16;          //对数据类型进行声明定义6 T4 x. `; g+ e4 G9 i9 [+ s: `; G
    typedef unsigned char u8;# W& w- A8 }6 G5 ]/ J7 {4 j
    sbit IRIN=P3^2;
    5 F6 s( ~. A5 b' f; Tu8 IrValue[6];
    1 ^, @; a7 |* v: `8 {  Nu8 time,s1,s2,aa,bb,cc,dd,v,z=1;" y5 T4 K. u* |* `! r8 G
    u16 aaa,bbb;
    ( @+ H  `1 A6 Y6 avoid delay(u16 i)$ ?8 h, s5 }* l" B' ~+ g* l
    {
    5 p+ ~" R$ P  C1 |2 x        while(i--);        
    ! n8 Q1 J& R! p3 W2 t( C" s}
    - G3 p- I% c# c7 \void IrInit()3 `6 G0 X& m# e( @* _2 C
    {
    8 q4 S0 O7 s! |" ^$ ]) U5 Y' F/ K        IT0=1;//下降沿触发! Z" h  ~3 N' t5 U7 B  s- h
            EX0=1;//打开中断0允许8 }8 ^+ O% u8 a5 R7 w  I
            EA=1;        //打开总中断
      Q: T# \7 B2 |0 S7 B+ j6 j+ |5 U3 ?9 v% r  f: ~8 \4 ]& F
    - S) m1 h3 s2 b0 g4 j/ L
            IRIN=1;//初始化端口, N" y$ i1 ?- |- H& U: o
    }  @& }. b, m% w. _& N" z+ g
    void ReadIr() interrupt 0# `: [& c, S8 [0 i
    {2 ~1 Y; G& u( M
            u8 j,k;
    7 r  B9 p6 w  a+ f        u16 err;/ K% c4 b; @! E, U6 j
            Time=0;                                         0 o/ ~" @3 l8 w3 Z: M. w
            delay(700);        //7ms6 I7 K1 S! I5 |: _7 m2 Y" b: r
            IF(IRIN==0)                //确认是否真的接收到正确的信号6 E. N+ W, o* g
            {         , I5 K4 e1 D5 j! }, S: P
                    ' d  b7 y1 `$ c( O
                    err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
    + x; f! F0 L, v) c  I                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
    1 b3 T& [3 {- \0 R0 x                侯,程序死在这里*/        
      I0 A% j' A3 |! B+ S& i                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
    5 l  a9 c6 n, n" Y3 d: y; B( D* W: i* {                {                        " [+ e4 \# g) j
                            delay(1);& Q. H+ P5 |" m* s4 J0 p# h
                            err--;
    8 {( H* T+ @" L) C                } + e6 B. \5 z( N, M; q& c+ ]" u/ Z  V
                    if(IRIN==1)                        //如果正确等到9ms低电平
    4 ~4 _, c2 J) K/ W                {
    6 C% h5 G1 e+ C' u                        err=500;
    * J9 t0 X4 Y0 ?/ K                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去. P( U9 b9 _4 _# j- ]
                            {
      E. F4 {% U- N" O2 j" Q) q/ h                                delay(1);9 C5 Z' H; k, @, W- {3 a1 `
                                    err--;
    + U4 J3 F! Z: {2 z/ v0 m                        }9 D# y( e& ~( L5 @: [! Y/ I
                            for(k=0;k<4;k++)                //共有4组数据6 p- v, |$ ?2 J  R3 ^  k
                            {                                " o) b" }+ K& s, g' ]
                                    for(j=0;j<8;j++)        //接收一组数据
    8 q8 Q* B3 Y* Z+ S/ E/ O. m- b                                {
    & L; S/ M5 q$ H5 P# u
    ' `; n* F' `- \( z" ?
    + ~8 V' h7 V9 Q
                                            err=60;               
    $ t# A8 S' b9 G: y. p# n                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去9 A8 z# V( F( U2 V; z% }% h. R; c' ~
                                            {
    9 \7 h  z9 _  I& Q6 b6 E                                                delay(1);
    + _" V  p. P9 F                                                err--;
    ' O4 J7 e/ x; b/ K                                        }% R: Z1 |3 u4 f, R
                                            err=500;
    - Z( F2 f4 K( x/ N                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。1 t0 r% \/ z4 q5 X% Y7 Z* f
                                            {
    8 I* d, b9 v1 C                                                delay(10);         //0.1ms
    0 s( B% J; X( r8 C3 R, N                                                Time++;+ E' D; r" N+ Q* Y' s( E
                                                    err--;! K% s# \+ P4 V3 L
                                                    if(Time>30)- F3 m1 \* k3 A0 Z+ \! R! C- t
                                                    {$ q' h2 f) X4 j/ |% K& g
                                                            return;
    ( @2 w) u1 _9 f& L) M( j' O                                                }4 x$ p8 x2 B( t! f. S! a. ]- C8 [
                                            }+ ^; ?) I  H3 [! \& ]* @) S
                                            IrValue[k]>>=1;         //k表示第几组数据
    + y* j% Z4 u: @& v! n                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1& i6 ~7 j5 }, j2 F7 v( [$ U
                                            {
    & R: X" R+ Y& H; n                                                IrValue[k]|=0x80;! m4 l  l; n- q- ]6 b5 t
                                            }: Q. N" s4 Z$ g5 D! N. ~5 m
                                            Time=0;                //用完时间要重新赋值                                                        
    5 C0 t1 [. R  ?+ _                                }* ^$ }7 t$ d* B  {  E
                            }- J4 Q3 r! J' Q' @, x
                    }5 R" f: e# \) ?; R6 L
                    if(IrValue[2]!=~IrValue[3])
    6 d0 N9 V& a- K3 l$ X6 l3 n0 w                {
    - s( J- h1 O4 M& {4 ~2 {6 b                        return;* [( b$ s- i5 s; a9 G9 j3 Q# b4 X# O
                    }
    ; p( ?& G0 Z  ?) x  I0 ?8 L: j        }                        % j6 v& o% M9 r/ @2 H- b. t5 k
    }
    : H# T# ]$ L9 `3 V( w( Fvoid dinit()4 l" D3 ?! ^5 P- ?
    {$ h0 H- f* [* {* Z! C# |
    TMOD=0x11;0 @2 F: f' b1 X1 }" W: G
    EA=1;- m$ z; z' x& ]3 j0 B8 e8 H8 [
    ET0=1;
    ; _4 D$ R; A! J4 i+ U" bET1=1;
    7 p. a" h% Y. R8 ~TL0 = 0x30;: C- m5 i- @5 j9 L; T! x* K% m
    TH0 = 0xfe;
    ; H$ N8 p3 O# ?) e# M3 R* ^' qTL1 = 0x87;
    3 s8 z$ s+ v! c- B* w$ YTH1 = 0xD6;
    0 i  F1 h0 G, ]$ BTR1=1;
    . \8 g& P+ _) P# \* I, ^TR0=1;
    & e1 L) `5 M* w5 B$ X& y' I7 `dd=0;( P3 D; `$ Z; I7 U# {  R
    cc=0;
    ; i  C* l, }; M* i& [# T% Qaa=3;2 d( I* _* [9 @* K2 x
    bb=0;+ T$ A# [2 k/ _) Z( @
    PT0=1;
      x% P8 T  K! b( T4 bv=10;$ G8 t+ l; m7 [, X7 ^
    }
    2 U, E; `( b& v, Fvoid qwer()interrupt 1
    # b# f! ^- z% T# r% ~) f4 s# e0 P{
    + d" J$ |. J2 C3 _        TR0=0;2 m3 Q6 k' P6 s1 a' p
            TL0 = 0x00;               
    , c& w1 {7 C% N# `3 H# R        TH0 = 0xfe;' I+ ^% |* ?$ s: I
            if(bb<aa)6 H7 U$ e1 q$ l4 U  n# V
            P0_1=1;
    ; F+ w8 L& ^- g4 y8 c        else( h- b* }- J5 F2 r& ~
            P0_1=0;! w5 B4 |6 Y+ i  [
            bb++;2 O! K: X6 a7 X; E! {! A
            bb=bb%40;- E9 Z6 k3 ^( j- c2 s; E- M) V( \
            if(s1==1)
    4 I/ V2 ?5 n5 Z6 g' W9 `        {9 v( k0 v8 `0 m9 F2 w7 t
                    aaa++;
    , z+ p  C, r6 h) ]% Z; [( [                if(aaa==1000)* f* H) \& {, ~$ c+ V- k, t! U* R
                    {aa=3;
    4 z. |4 G/ x: [                 s1=0;  l0 X; t0 f* b/ ~1 u9 n% C$ L8 j" H* W
                     aaa=0;}        3 N" C9 g2 n. d+ ]' U4 S
            }
    0 T$ h$ o: \% K        TR0=1;! _+ e9 t% a4 N" x* o0 g
    }9 k; t: U) L* e+ S- b
    void ert()interrupt 3
    ; H8 h" }7 l& _& a7 H9 j{1 q! C& H3 r5 N1 A. I
            TR1=0;9 ^# |& N: |' J/ X; z
            TL1 = 0x87;* N% W$ {- k; `4 W' Y/ n) X
            TH1 = 0xD6;        3 z5 l5 @0 k1 @7 m# q
            if(dd<cc)8 T/ z1 G) ?( @$ R
               P1_0=1;. \6 `* Z8 n) Z9 c/ Y- u
              else
    9 e: N2 T+ k- }, N% N           P1_0=0 ;1 T# r% w' c/ \7 |1 d$ _& [2 I# O3 r/ ^
            dd++;
    5 Q# B4 B% Q# B) v) @        dd=dd%40;1 [8 Q' l. h- E5 Z  p. S
            if(s2==1)
    $ d5 s( v1 ~  T: r" e* `        {% L! T, r2 N  e; L' x: v
                    bbb++;
    8 [4 g( s1 \- H                if(bbb==50)
    - k% ~5 Q' o* u+ |" |                {s2=0;cc=0;bbb=0;}( K2 [8 g5 l0 i1 O$ C* @. _' D. e
            }& R: {: [, m3 D9 D8 K
            TR1=1;
    1 ?) j, e! A  x. K3 b5 x4 [- W}
    1 f, W- r  \; G5 O" {: Pvoid main()
    ( U& T2 h1 B6 Y; [0 J; G) E' K{" O2 o4 w8 O3 k1 A$ g
    dinit();
    ) e. }; }* ~/ b; B3 S& v3 e, N( | IrInit();
    & p9 E! W, w) F$ {: d8 ~ P1_0=0;
    + T" D/ E5 p( a  C0 w while(1)
    4 ?- ?  A4 O+ G" N# x6 k2 C2 { {
    - S" y3 b2 w& V  if(IrValue[2]==0x08)( y: G' X( f& G, |1 Y) {
      {s1=1;
    5 X9 V4 W% U7 c" k1 f8 W# u7 j3 {  aa=2;0 F, `9 m1 P' C5 y* d0 k7 d) K5 g& U9 z7 m
      IrValue[2]=0;2 s: f( Z2 b2 q0 F! K
      }: T& r- }  b" }) h
      if(IrValue[2]==0x5a)
    / r( n/ j- K4 Q" F: B1 X- R" W1 n  {s1=1;
    6 Z6 f. c# E6 j* S   aa=4;
    2 j& c( t9 x2 L2 z0 R3 W% m4 ]" o   IrValue[2]=0;& e8 K$ B; P1 f. U
      }8 R2 t0 Q# t; N: y
      if(IrValue[2]==0x18)3 w! W. e/ u% g$ U( @0 K
      {* z" M: C$ q9 r1 |# U& D' Q, `
             cc=v;
    3 |( y) A& @! `7 l* c         s2=1;% w) n/ E- D5 H# W; i) V- e
              IrValue[2]=0;0 _; j' x( U6 ]8 q, F3 S6 Q* ^
      }
    * ]2 z+ E' i2 t- D) |7 l  if(IrValue[2]==0x1c)
    + ~  f3 y+ [5 _, l/ m  {
    / F3 R1 V) @; h" y           v=v+10;$ j+ B; M0 E! @: K+ j
             if(v>40)! X4 ~( R* f$ U# _
             v=v-40;9 Y5 ^  ~( w" w6 r+ T7 d
             IrValue[2]=0;
    ( T8 K, U( u: M  m3 _% A3 v- O  }
    7 J) V- X' U% }8 J& @5 |% j2 b }* {8 o: t! B# ?+ w/ s2 g6 Z! A, }
    }
    . [5 L, n/ U3 ~9 r& p. ^; d* L
  • TA的每日心情

    2019-11-19 15:55
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-2-3 17:16 | 只看该作者
    电压不够是一个可能,另外舵机需要持续稳定的PWM进行控制,如果使用定时器之类的模拟PWM进行控制,当模拟的PWM被打断时,舵机就会动作错误,所以舵机最好用硬件PWM进行控制
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-18 23:00 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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