打印
[技术求助]

L298N控制直流电机问题

[复制链接]
799|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Erichk|  楼主 | 2017-8-19 15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit ENA=P1^2;
sbit IN1=P1^3;
sbit IN2=P1^4;
sbit ENB=P1^5;
sbit IN3=P1^6;
sbit IN4=P1^7;

uint MA=0;  
uint speedA=50;
int flag=0;

void timeinit()
{
    TMOD=0x01;
    TH0=(65536-10000)/256;
    TL0=(65536-10000)%256;
    EA=1;
    ET0=1;
    TR0=1;
}

void Ques1()
{
    switch(flag/10)
    {
        case 0: TR0=0;
                        if(MA<speedA)
                        {
                                ENA=1;ENB=1;
                                IN1=1;IN2=0;
                                IN3=0;IN4=1;
                        }
                        else
                        {
                            if(speedA<=MA<100)
                            {
                                    ENA=0;
                                    ENB=0;
                            }
                            else   
                            {
                                    MA=0;   
                                    flag++;                                                                     
                            }                           
                        }
                        TR0=1;
                        break;
        case 1: TR0=0;
                        if(MA<speedA)
                        {
                                ENA=1;ENB=1;
                                IN1=0;IN2=1;
                                IN3=1;IN4=0;
                        }
                        else
                        {
                            if(speedA<=MA<100)
                            {
                                    ENA=0;
                                    ENB=0;  
                            }
                            else
                            {
                                    MA=0;   
                                    flag++;                             
                            }   
                        }
                      TR0=1;
                        break;
        default : flag=0;
                            break;
    }
}

void time0() interrupt 1
{
    TH0=(65536-10000)/256;
    TL0=(65536-10000)%256;
    MA++;   
}

void main()
{   
    timeinit();
    while(1)
    {
        Ques1();
    }
}

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

相关帖子

沙发
迪卡| | 2017-8-19 15:55 | 只看该作者

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

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

试试
if(speedA<=MA && MA <100)
也就是 if( (speedA<=MA)  && (MA <100)  )

使用特权

评论回复
板凳
冰河w| | 2017-8-19 16:14 | 只看该作者
用示波器或逻辑分析 仪测量IN1等四个点的波形

使用特权

评论回复
地板
Thorald| | 2017-8-19 16:51 | 只看该作者
要是没有工具,就把电机去掉,换成几百欧的电阻。把定时器中断频率降低,使万用表可以大概测出IN1等四个点电平变化。分析时序是否正常。

使用特权

评论回复
5
Bjorn| | 2017-8-19 17:03 | 只看该作者
根据硬件工作原理自己写程序,IO状态用万用表测。

使用特权

评论回复
6
Rollo| | 2017-8-19 17:27 | 只看该作者
定时器没设置好,参看网上教程

使用特权

评论回复
7
Rangar| | 2017-8-19 17:37 | 只看该作者
测一下l298四个输入信号的电压。

使用特权

评论回复
8
Stannis| | 2017-8-19 17:55 | 只看该作者
控制电机启停、转向就是IO状态而已,用万用表检查IO状态,但先确认MCU正常工作、程序编译及烧录正确。

使用特权

评论回复
9
Brand2| | 2017-8-19 18:10 | 只看该作者

“speedA<=MA<100” 这条语句写的有问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

500

帖子

0

粉丝