找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2081|回复: 1
打印 上一主题 下一主题
收起左侧

在写一个控制电机L298的正反转及调速问题,但是调速实现不了,请大佬能不能帮我看....

[复制链接]
跳转到指定楼层
楼主
ID:467518 发表于 2019-1-20 15:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在写一个控制电机L298的正反转及调速问题,但是调速实现不了,请大佬能不能帮我看下这个程序呢,可能是和我不会用调速有关,这个电机能实现正反转,但是不能去调速,请问能不能帮我一下呢


#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int

sbit IN1=P1^0;
sbit IN2=P1^4;
sbit  PWMA=P1^2;
sbit  STBY=P1^3;
sbit  FM=P2^3;
sbit  key=P3^2;   //按键串口
void delay(uint z)
{
  uint x,y;
    for(x=z;x>0;x--)
      for(y=125;y>0;y--);
}



void Int0Init()
{
        //设置INT0
        IT0=1;//跳变沿出发方式(下降沿)
        EX0=1;//打开INT0的中断允许。       
        EA=1;//打开总中断       
}
void main()
{
//  P1=0X00;    //程序初始化
//  P1=0XFF;    //P1口置1
  Int0Init();
  PWMA=1;
  STBY=1;
  IN1=1;   
  IN2=0;       //初始化电机正转
  while(1)
  {

    //delay(500);
//    keyscan();
    //Timer0Init();   
  }

}

void Int0()        interrupt 0                //外部中断0的中断函数
{
    IN1=0;
    IN2=1;
        delay(2000);         //延时消抖
        IN1=0;
    IN2=0;
       
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:164602 发表于 2019-1-21 08:35 | 只看该作者
其实论坛中有很多这样的程序,一看你的程序,行数就不够嘛——根本没有调速的内容。
在智能小车板块中去找。
/**********************亚博智能小车黑线循迹例程************************
*  学习建议:进行智能小车程序学习前,可先看51单片机开发板配套28课视频教程

******************************************************************/
//按下K4按键,1秒左右启电小车
//按下复位健可以停止小车       
//注意程序只做参考之用,要达到最理想的寻迹效果,还需要同学们细心调试。

#include <reg52.h>             //包含52系统头文件
#include "bst_car.h"         //包含bst_car.h智能小车头文件

unsigned char pwm_val_left  =0;//变量定义
unsigned char pwm_val_right =0;
unsigned char push_val_left =5;// 左电机占空比N/20 //速度调节变量 0-20。。。0最小,20最大
unsigned char push_val_right=5;// 右电机占空比N/20
                                                           // 大家可以根据循迹效果修改以上两个数值
bit Right_PWM_ON=1;                   //右电机PWM开关
bit Left_PWM_ON =1;                           //左电机PWM开关


//延时函数       
void delay(unsigned int xms)                               
{
    unsigned int i,j;
        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
    for(j=112;j>0;j--);
}

//前进
void run(void)
{
    push_val_left=6;         //速度调节变量 0-20。。。0最小,20最大
        push_val_right=6;
        Left_moto_go ;   //左电机往前走
        Right_moto_go ;  //右电机往前走
}

//左转
void leftrun(void)
{         
     push_val_left=5;
         push_val_right=5;
         Right_moto_go ;  //右电机往前走
     Left_moto_Stop ;  //左电机停止
}

//右转
void  rightrun(void)
{
         push_val_left=5;
         push_val_right=5;
     Left_moto_go  ;   //左电机往前走
         Right_moto_Stop   ;  //右电机往前走       
}

//停止
void  stop(void)
{
         Left_moto_Stop ;
         Right_moto_Stop   ;
}

/************************************************************************/
//                   PWM调制电机转速                                   

//                   左电机调速                                       
/*调节push_val_left的值改变电机转速,占空比*/
void pwm_out_left_moto(void)
{  
     if(Left_PWM_ON)
     {
          if(pwm_val_left<=push_val_left)
              {
                   EN1=1;
              }
              else
              {
                   EN1=0;
          }
          if(pwm_val_left>=20)
              pwm_val_left=0;
     }
     else   
     {
          EN1=0;   //若未开启PWM则EN1=0 左电机 停止
     }
}
/******************************************************************/
/*                    右电机调速                                  */  
void pwm_out_right_moto(void)
{
    if(Right_PWM_ON)
    {
        if(pwm_val_right<=push_val_right)        //20ms内电平信号 111 111 0000 0000 0000 00
            {
                EN2=1;                                                         //占空比6:20
        }
            else
            {
                EN2=0;
        }
            if(pwm_val_right>=20)
            pwm_val_right=0;
    }
    else   
    {
        EN2=0;          //若未开启PWM则EN2=0 右电机 停止
    }
}
      
      
//TIMER0中断服务子函数产生PWM信号
void timer0()interrupt 1 using 2
{
     TH0=0XFC;          //1Ms定时
         TL0=0X66;
         pwm_val_left++;
         pwm_val_right++;
         pwm_out_left_moto();
         pwm_out_right_moto();
}       

void keyscan(void)              //按键扫描函数
{
    A:    if(K4==0)                        //判断是否有按下信号
                {
                    delay(10);                  //延时10ms
                        if(K4==0)                        //再次判断是否按下
                         {
                            FM=0;               //蜂鸣器响                 
                            while(K4==0);        //判断是否松开按键
                            FM=1;               //蜂鸣器停止  
                          }
                    else
                     {
                       goto A;        //跳转到A重新检测
                      }
                }
                else
                {
                  goto A;             //跳转到A重新检测
                }
}


//主函数
void main(void)
{       
    P1=0X00;    //关电机       
    keyscan();        //按键启动检测
        delay(1000);//1s后启动

        TMOD=0X01;
    TH0= 0XFC;  //1ms定时
    TL0= 0X66;
    TR0= 1;
    ET0= 1;
        EA = 1;            //开总中断


        while(1)        //无限循环
        {
            //有信号为0  没有信号为1
        if(Left_1_led==0&&Right_1_led==0)
            run();   //调用前进函数
        else if(Left_1_led==1&&Right_1_led==0)            //左边检测到黑线
                        {
                             leftrun();                       //调用小车左转函数
                        }                          
                else if(Right_1_led==1&&Left_1_led==0)                //右边检测到黑线
                        {          
                                 rightrun();                   //调用小车右转函数
                    }
                else
                        stop();         
         }
}
   

这个程序是由程序固定调速的,你可以看懂后,通过按键等改变相关的值,达到电机动态调速。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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