找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3401|回复: 5
收起左侧

基于51单片机的蓝牙小车可PWM调速,小车就是不动

[复制链接]
ID:722967 发表于 2020-4-7 16:08 | 显示全部楼层 |阅读模式
程序编译没错,蓝牙也是可以通讯的(与PC端连接可实现收发),但是小车就是不动。这是为什么呢?

/*手机蓝牙遥控小车                APP 用的SPP蓝牙串口助手
左转右转大概是90度   
pwm有十级变速*/


#include <reg52.h>


#define Left_moto_pwm     P1_4          //接驱动模块ENA        使能端,输入PWM信号调节速度          左前轮
#define Right_moto_pwm    P1_5           //接驱动模块ENB                                                                   右前轮
#define uchar unsigned char
#define uint unsigned int


sbit P1_4=P1^4;                 //定义P1_4
sbit P1_5=P1^5;                 //定义P1_5

/*电机驱动IO定义*/
sbit IN1 = P1^2; //为1 左电机反转         前轮
sbit IN2 = P1^3; //为1 左电机正转        前轮
sbit IN3 = P1^6; //为1 右电机正转         前轮
sbit IN4 = P1^7; //为1 右电机反转         前轮
sbit EN1 = P1^4; //为1 左电机使能
sbit EN2 = P1^5; //为1 右电机使能        */


bit Right_moto_stop=1;           
bit Left_moto_stop =1;               
unsigned  int  time=0;               
int pwm=1;

#define left_motor_en                EN1 = 1        //左电机使能
#define left_motor_stops        EN1 = 0        //左电机停止
#define right_motor_en                EN2 = 1        //右电机使能
#define right_motor_stops        EN2 = 0        //右电机停止



#define left_motor_go                IN1 = 0, IN2 = 1//左电机正传
#define left_motor_back                IN1 = 1, IN2 = 0//左电机反转
#define right_motor_go                IN3 = 1, IN4 = 0//右电机正传
#define right_motor_back        IN3 = 0, IN4 = 1//右电机反转



unsigned char pwm_val_left  =0;//变量定义
unsigned char push_val_left =0;// 左电机占空比N/10
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右电机占空比N/10


void delay(uint z)
{
        uint x,y;
        for(x = z; x > 0; x--)
        for(y = 114; y > 0 ; y--);
}



//蓝牙初始化
void UART_INIT()
{
        SM0 = 0;
        SM1 = 1;//串口工作方式1
        REN = 1;//允许串口接收                                                                                                                 
        EA = 1;//开总中断
        ES = 1;//开串口中断
        TMOD = 0x20;//8位自动重装模式
        TH1 = 0xfd;
        TL1 = 0xfd;//9600波特率
        TR1 = 1;//启动定时器1
}

/************************************************************************/
     void  run(void)        //pwm调速函数
{
     push_val_left  =pwm;  //PWM 调节参数1-10   1为最慢,10是最快  改这个值可以改变其速度
         push_val_right =pwm;         //PWM 调节参数1-10   1为最慢,10是最快         改这个值可以改变其速度
                 if(pwm==10) pwm=0;
                if(pwm==0&&pwm<0) pwm=0;

}


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


/*                    左侧电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
                void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
             {  Left_moto_pwm=1;
                      }
        else
              { Left_moto_pwm=0;                 }

        if(pwm_val_left>=10)
        pwm_val_left=0;
   }
   else { Left_moto_pwm=0;         }
}
/******************************************************************/
/*                    右侧电机调速                                  */  
   void pwm_out_right_moto(void)
{
  if(Right_moto_stop)
   {
    if(pwm_val_right<=push_val_right)
             {  Right_moto_pwm=1;
                             }
        else
               {Right_moto_pwm=0;
                    }
        if(pwm_val_right>=10)
            pwm_val_right=0;
   }
   else    {Right_moto_pwm=0;       }
}
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
         void timer0()interrupt 1   using 2
{
     TH0=0XF8;          //1Ms定时
         TL0=0X30;
         time++;
         pwm_val_left++;
         pwm_val_right++;
         pwm_out_left_moto();
         pwm_out_right_moto();
}

//小车前进
void forward()
{
        ET0 = 1;
        run();                          //pwm        程序
        left_motor_go; //左电机前进
        right_motor_go; //右电机前进

}

void left_go()           //左转
{
        ET0 = 1;
        run();
        left_motor_back;
        right_motor_go;

        delay(700);
        forward();
}
//右转
void right_go()
{
        ET0 = 1;
        run();
        delay(50);
        right_motor_back;
        left_motor_go;

        delay(700);
        forward();
}
//小车左转圈
void left()
{
        ET0 = 1;
        run();
        delay(50);
        right_motor_go;                  //  右电机前进
        left_motor_back;        // 左电机后退

}

//小车右转圈
void right()
{
        ET0 = 1;
        run();
        left_motor_go;
        right_motor_back;  

}

//小车后退
void back()
{
        ET0 = 1;
        run();
        left_motor_back;
        right_motor_back;        

}

//小车停止
void stop()
{
        ET0 = 0;
        P1=0;
        P0=0;
}


//串口中断
void UART_SER() interrupt 4
{
        if(RI)
        {
                RI = 0;//清除接收标志
                switch(SBUF)
                {
                        case 'g': forward(); break;//前进
                        case 'b': back(); break;//后退
                        case 'l': left(); break;//左转圈
                        case 'r': right(); break;//右转圈
                        case 's': stop(); break;//停止
                        case 'z': left_go(); break;//左转行驶
                         case 'y': right_go(); break;//右转行驶
                        case 'p': pwm++;break;                //加速
                        case 'c': pwm--;break;                //减速
                }

        }
}

void main()
{
        TMOD=0X01;
        TH0= 0XF8;                  //1ms定时
         TL0= 0X30;
        TR0= 1;
        ET0= 1;
        EA = 1;
        UART_INIT();//串口初始化
        while(1);
}


回复

使用道具 举报

ID:585414 发表于 2020-4-7 16:30 | 显示全部楼层
看你的电驱是什么啦,你的程序应该没问题吧,手头有示波器的话看看波形,如果PWM波形没问题那就是电驱电压不够啥的
回复

使用道具 举报

ID:722967 发表于 2020-4-8 11:47 | 显示全部楼层
Laplacey 发表于 2020-4-7 16:30
看你的电驱是什么啦,你的程序应该没问题吧,手头有示波器的话看看波形,如果PWM波形没问题那就是电驱电压 ...

谢谢,已解决
回复

使用道具 举报

ID:728276 发表于 2020-4-14 16:17 | 显示全部楼层
你好,请问蓝牙模块是如何和手机端里连接发送指令的?正在学习这个搞不清楚了
回复

使用道具 举报

ID:280000 发表于 2020-4-14 21:17 | 显示全部楼层
看看代码有没有错误  电路设计的是否合理  用示波器看看单片机IO口是否正常输出了波形
回复

使用道具 举报

ID:456580 发表于 2020-5-7 17:04 | 显示全部楼层

楼主你好,你出现的问题是供电电源的问题吗,怎么解决的,你是用12V电源供电不?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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