找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4015|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)的藍(lán)牙小車可PWM調(diào)速,小車就是不動(dòng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:722967 發(fā)表于 2020-4-7 16:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
程序編譯沒錯(cuò),藍(lán)牙也是可以通訊的(與PC端連接可實(shí)現(xiàn)收發(fā)),但是小車就是不動(dòng)。這是為什么呢?

/*手機(jī)藍(lán)牙遙控小車                APP 用的SPP藍(lán)牙串口助手
左轉(zhuǎn)右轉(zhuǎn)大概是90度   
pwm有十級(jí)變速*/


#include <reg52.h>


#define Left_moto_pwm     P1_4          //接驅(qū)動(dòng)模塊ENA        使能端,輸入PWM信號(hào)調(diào)節(jié)速度          左前輪
#define Right_moto_pwm    P1_5           //接驅(qū)動(dòng)模塊ENB                                                                   右前輪
#define uchar unsigned char
#define uint unsigned int


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

/*電機(jī)驅(qū)動(dòng)IO定義*/
sbit IN1 = P1^2; //為1 左電機(jī)反轉(zhuǎn)         前輪
sbit IN2 = P1^3; //為1 左電機(jī)正轉(zhuǎn)        前輪
sbit IN3 = P1^6; //為1 右電機(jī)正轉(zhuǎn)         前輪
sbit IN4 = P1^7; //為1 右電機(jī)反轉(zhuǎn)         前輪
sbit EN1 = P1^4; //為1 左電機(jī)使能
sbit EN2 = P1^5; //為1 右電機(jī)使能        */


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

#define left_motor_en                EN1 = 1        //左電機(jī)使能
#define left_motor_stops        EN1 = 0        //左電機(jī)停止
#define right_motor_en                EN2 = 1        //右電機(jī)使能
#define right_motor_stops        EN2 = 0        //右電機(jī)停止



#define left_motor_go                IN1 = 0, IN2 = 1//左電機(jī)正傳
#define left_motor_back                IN1 = 1, IN2 = 0//左電機(jī)反轉(zhuǎn)
#define right_motor_go                IN3 = 1, IN4 = 0//右電機(jī)正傳
#define right_motor_back        IN3 = 0, IN4 = 1//右電機(jī)反轉(zhuǎn)



unsigned char pwm_val_left  =0;//變量定義
unsigned char push_val_left =0;// 左電機(jī)占空比N/10
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右電機(jī)占空比N/10


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



//藍(lán)牙初始化
void UART_INIT()
{
        SM0 = 0;
        SM1 = 1;//串口工作方式1
        REN = 1;//允許串口接收                                                                                                                 
        EA = 1;//開總中斷
        ES = 1;//開串口中斷
        TMOD = 0x20;//8位自動(dòng)重裝模式
        TH1 = 0xfd;
        TL1 = 0xfd;//9600波特率
        TR1 = 1;//啟動(dòng)定時(shí)器1
}

/************************************************************************/
     void  run(void)        //pwm調(diào)速函數(shù)
{
     push_val_left  =pwm;  //PWM 調(diào)節(jié)參數(shù)1-10   1為最慢,10是最快  改這個(gè)值可以改變其速度
         push_val_right =pwm;         //PWM 調(diào)節(jié)參數(shù)1-10   1為最慢,10是最快         改這個(gè)值可以改變其速度
                 if(pwm==10) pwm=0;
                if(pwm==0&&pwm<0) pwm=0;

}


/************************************************************************/
/*                    PWM調(diào)制電機(jī)轉(zhuǎn)速                                   */
/************************************************************************/


/*                    左側(cè)電機(jī)調(diào)速                                        */
/*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比            */
                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;         }
}
/******************************************************************/
/*                    右側(cè)電機(jī)調(diào)速                                  */  
   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中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)*/
         void timer0()interrupt 1   using 2
{
     TH0=0XF8;          //1Ms定時(shí)
         TL0=0X30;
         time++;
         pwm_val_left++;
         pwm_val_right++;
         pwm_out_left_moto();
         pwm_out_right_moto();
}

//小車前進(jìn)
void forward()
{
        ET0 = 1;
        run();                          //pwm        程序
        left_motor_go; //左電機(jī)前進(jìn)
        right_motor_go; //右電機(jī)前進(jìn)

}

void left_go()           //左轉(zhuǎn)
{
        ET0 = 1;
        run();
        left_motor_back;
        right_motor_go;

        delay(700);
        forward();
}
//右轉(zhuǎn)
void right_go()
{
        ET0 = 1;
        run();
        delay(50);
        right_motor_back;
        left_motor_go;

        delay(700);
        forward();
}
//小車左轉(zhuǎn)圈
void left()
{
        ET0 = 1;
        run();
        delay(50);
        right_motor_go;                  //  右電機(jī)前進(jìn)
        left_motor_back;        // 左電機(jī)后退

}

//小車右轉(zhuǎn)圈
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;//清除接收標(biāo)志
                switch(SBUF)
                {
                        case 'g': forward(); break;//前進(jìn)
                        case 'b': back(); break;//后退
                        case 'l': left(); break;//左轉(zhuǎn)圈
                        case 'r': right(); break;//右轉(zhuǎn)圈
                        case 's': stop(); break;//停止
                        case 'z': left_go(); break;//左轉(zhuǎn)行駛
                         case 'y': right_go(); break;//右轉(zhuǎn)行駛
                        case 'p': pwm++;break;                //加速
                        case 'c': pwm--;break;                //減速
                }

        }
}

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:585414 發(fā)表于 2020-4-7 16:30 | 只看該作者
看你的電驅(qū)是什么啦,你的程序應(yīng)該沒問題吧,手頭有示波器的話看看波形,如果PWM波形沒問題那就是電驅(qū)電壓不夠啥的
回復(fù)

使用道具 舉報(bào)

板凳
ID:722967 發(fā)表于 2020-4-8 11:47 | 只看該作者
Laplacey 發(fā)表于 2020-4-7 16:30
看你的電驅(qū)是什么啦,你的程序應(yīng)該沒問題吧,手頭有示波器的話看看波形,如果PWM波形沒問題那就是電驅(qū)電壓 ...

謝謝,已解決
回復(fù)

使用道具 舉報(bào)

地板
ID:728276 發(fā)表于 2020-4-14 16:17 | 只看該作者
你好,請(qǐng)問藍(lán)牙模塊是如何和手機(jī)端里連接發(fā)送指令的?正在學(xué)習(xí)這個(gè)搞不清楚了
回復(fù)

使用道具 舉報(bào)

5#
ID:280000 發(fā)表于 2020-4-14 21:17 | 只看該作者
看看代碼有沒有錯(cuò)誤  電路設(shè)計(jì)的是否合理  用示波器看看單片機(jī)IO口是否正常輸出了波形
回復(fù)

使用道具 舉報(bào)

6#
ID:456580 發(fā)表于 2020-5-7 17:04 | 只看該作者

樓主你好,你出現(xiàn)的問題是供電電源的問題嗎,怎么解決的,你是用12V電源供電不?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表