[求助] L298N控制直流电机

xiaocaiji   2017-5-6 16:33 楼主
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit ENA=P1^2;
  5. sbit IN1=P1^3;
  6. sbit IN2=P1^4;
  7. sbit ENB=P1^5;
  8. sbit IN3=P1^6;
  9. sbit IN4=P1^7;

  10. uint MA=0;  
  11. uint speedA=50;
  12. int flag=0;

  13. void timeinit()
  14. {
  15.         TMOD=0x01;
  16.         TH0=(65536-10000)/256;
  17.         TL0=(65536-10000)%256;
  18.         EA=1;
  19.         ET0=1;
  20.         TR0=1;
  21. }

  22. void Ques1()
  23. {
  24.         switch(flag/10)
  25.         {
  26.                 case 0:        TR0=0;
  27.                                                 if(MA<speedA)
  28.                                                 {
  29.                                                                 ENA=1;ENB=1;
  30.                                                                 IN1=1;IN2=0;
  31.                                                                 IN3=0;IN4=1;
  32.                                                 }
  33.                                                 else
  34.                                                 {
  35.                                                         if(speedA<=MA<100)
  36.                                                         {
  37.                                                                         ENA=0;
  38.                                                                         ENB=0;
  39.                                                         }
  40.                                                         else       
  41.                                                         {
  42.                                                                         MA=0;       
  43.                                                                         flag++;                                                                                                                                               
  44.                                                         }                                                       
  45.                                                 }
  46.                                                 TR0=1;
  47.                                                 break;
  48.                 case 1: TR0=0;
  49.                                                 if(MA<speedA)
  50.                                                 {
  51.                                                                 ENA=1;ENB=1;
  52.                                                                 IN1=0;IN2=1;
  53.                                                                 IN3=1;IN4=0;
  54.                                                 }
  55.                                                 else
  56.                                                 {
  57.                                                         if(speedA<=MA<100)
  58.                                                         {
  59.                                                                         ENA=0;
  60.                                                                         ENB=0;       
  61.                                                         }
  62.                                                         else
  63.                                                         {
  64.                                                                         MA=0;       
  65.                                                                         flag++;                                                               
  66.                                                         }       
  67.                                                 }
  68.                                           TR0=1;
  69.                                                 break;
  70.                 default : flag=0;
  71.                                                         break;
  72.         }
  73. }

  74. void time0() interrupt 1
  75. {
  76.         TH0=(65536-10000)/256;
  77.         TL0=(65536-10000)%256;
  78.         MA++;       
  79. }

  80. void main()
  81. {       
  82.         timeinit();
  83.         while(1)
  84.         {
  85.                 Ques1();
  86.         }
  87. }


我想问下,为什么这个程序无法同时控制电机正反转,现在问题是单片机按着复位键,IN1和IN2控制的电机才会启动,不按复位键不启动,IN3和IN4控制的电机在5s后也会停止转动,这是为什么?我的目的是IN1和IN2控制的电机1正转,同时IN3和IN4控制的电机2反转,过1s之后电机1正转电机2反转。

回复评论 (10)

2推荐 ienglgge 

用示波器或逻辑分析仪测量IN1等四个点的波形。要是没有工具,就把电机去掉,换成几百欧的电阻。把定时器中断频率降低,使万用表可以大概测出IN1等四个点电平变化。分析时序是否正常。
点赞  2017-5-8 13:28

2推荐 tianshuihu 

好好看看语法规则,不确定的话可以多加几个括号

if(speedA<=MA<100)
等价于
if((0 or 1) <100)
其中 speedA<=MA ? 1: 0

试试
if(speedA<=MA && MA <100)
也就是 if( (speedA<=MA)  && (MA <100)  )
点赞  2017-5-7 22:32
根据硬件工作原理自己写程序,IO状态用万用表测。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2017-5-6 16:52
引用: chunyang 发表于 2017-5-6 16:52
根据硬件工作原理自己写程序,IO状态用万用表测。

这个程序就是自己写的,目前不知道哪里出问题
点赞  2017-5-6 16:55
定时器没设置好,参看网上教程,祝好~
点赞  2017-5-6 17:07
你测一下l298四个输入信号的电压。
点赞  2017-5-6 18:01
引用: xiaocaiji 发表于 2017-5-6 16:55
这个程序就是自己写的,目前不知道哪里出问题

控制电机启停、转向就是IO状态而已,用万用表检查IO状态,但先确认MCU正常工作、程序编译及烧录正确。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2017-5-7 00:01
“speedA<=MA<100” 这条语句写的有问题
点赞  2017-5-7 22:24
还需要调试
点赞  2020-4-24 21:55

很好

点赞  2020-4-24 21:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复