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

QQ登錄

只需一步,快速開始

搜索
查看: 4266|回復(fù): 13
收起左側(cè)

51單片機(jī)小車轉(zhuǎn)彎程序出現(xiàn)問(wèn)題,求解

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 20 黑幣 回復(fù)本帖可獲得 5 黑幣獎(jiǎng)勵(lì)! 每人限 1 次(中獎(jiǎng)概率 50%)
ID:594848 發(fā)表于 2019-12-24 15:36 | 顯示全部樓層 |閱讀模式

小車左轉(zhuǎn)程序

小車左轉(zhuǎn)程序

問(wèn)題求助。。!我做的是一個(gè)4輪驅(qū)動(dòng)的基于藍(lán)牙控制的小車,上圖是小車的一個(gè)左轉(zhuǎn)程序,我的本意是想通過(guò)讓小車左旋轉(zhuǎn)一段時(shí)間然后再讓它直走,來(lái)達(dá)到左轉(zhuǎn)的目的?墒俏疫@個(gè)發(fā)送左轉(zhuǎn)指令時(shí),小車不會(huì)動(dòng),等到延時(shí)時(shí)間一過(guò),這個(gè)時(shí)候小車開始前進(jìn)。為什么一開始小車不向左旋轉(zhuǎn)啊????它為什么會(huì)不動(dòng)呢????然后直走的程序又能執(zhí)行???求解
回復(fù)

使用道具 舉報(bào)

ID:594848 發(fā)表于 2019-12-24 21:31 | 顯示全部樓層
貓兔0 發(fā)表于 2019-12-24 19:37
這個(gè)你得看全部程序,這樣沒(méi)辦法回答你啊

#include <reg52.h>
#define Left_moto2_pwm     P0_4    //接驅(qū)動(dòng)模塊ENA 左后輪
#define Right_moto2_pwm    P0_5    //接驅(qū)動(dòng)模塊ENB 右后輪
#define Left_moto_pwm     P1_4    //接驅(qū)動(dòng)模塊ENA 左前輪
#define Right_moto_pwm    P1_5    //接驅(qū)動(dòng)模塊ENB 右前輪
#define uchar unsigned char
#define uint unsigned int
sbit P0_4=P0^4;   //定義P0_4
sbit P0_5=P0^5;   //定義P0_5
sbit P1_4=P1^4;   //定義P1_4
sbit P1_5=P1^5;   //定義P1_5
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 IN5 = P0^2; //為1 左電機(jī)反轉(zhuǎn)  后輪
sbit IN6 = P0^3; //為1 左電機(jī)正轉(zhuǎn)  后輪
sbit IN7 = P0^6; //為1 右電機(jī)正轉(zhuǎn)  后輪
sbit IN8 = P0^7; //為1 右電機(jī)反轉(zhuǎn)  后輪
bit Right_moto_stop=1;   
bit Left_moto_stop =1;   
int pwm=1;
#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 = 0, IN4 = 1//右電機(jī)正傳
#define right_motor_back IN3 = 1, IN4 = 0//右電機(jī)反轉(zhuǎn)
#define left_motor2_go  IN5 = 0, IN6 = 1//左電機(jī)正傳
#define left_motor2_back IN5 = 1, IN6 = 0//左電機(jī)反轉(zhuǎn)
#define right_motor2_go  IN7 = 0, IN8 = 1//右電機(jī)正傳
#define right_motor2_back IN7 = 1, IN8 = 0//右電機(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--);
}
void UART_INIT()    //藍(lán)牙初始化
{
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   
  push_val_right =pwm;  //PWM 調(diào)節(jié)參數(shù)1-10   
   if(pwm==10) pwm=0;
  if(pwm==0&&pwm<0) pwm=0;
}

void pwm_out_left_moto(void)    //左側(cè)電機(jī)調(diào)速,調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
      {  Left_moto_pwm=1;
      Left_moto2_pwm=1;  }
else
       { Left_moto_pwm=0;Left_moto2_pwm=0;   }
if(pwm_val_left>=10)
pwm_val_left=0;
   }
   else { Left_moto_pwm=0;Left_moto2_pwm=0;   }
}

   void pwm_out_right_moto(void)  //右側(cè)電機(jī)調(diào)速
{
  if(Right_moto_stop)
   {
    if(pwm_val_right<=push_val_right)
      {  Right_moto_pwm=1;
     Right_moto2_pwm=1;    }
else
        {Right_moto_pwm=0;
      Right_moto2_pwm=0;}
if(pwm_val_right>=10)
     pwm_val_right=0;
   }
   else    {Right_moto_pwm=0;Right_moto2_pwm=0; }
}
void timer0()interrupt 1   using 2    //TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)//
{
     TH0=0XF8;   //1Ms定時(shí)
  TL0=0X30;
  pwm_val_left++;
  pwm_val_right++;
  pwm_out_left_moto();
  pwm_out_right_moto();
}
void forward()  //小車前進(jìn)//
{
ET0 = 1;
run();     //pwm 程序
left_motor_go; //左電機(jī)前進(jìn)
right_motor_go; //右電機(jī)前進(jìn)
left_motor2_go; //左電機(jī)前進(jìn)   后輪
right_motor2_go; //右電機(jī)前進(jìn)  后輪
}
void left_go()    //左轉(zhuǎn)
{
ET0 = 1;
run();
left_motor_back;
right_motor_go;
left_motor2_back;
right_motor2_go;
delay(700);
forward();
}

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

void right()    //小車右轉(zhuǎn)圈
{
ET0 = 1;
run();
delay(50);
left_motor_go;
right_motor_back;  
left_motor2_go;
right_motor2_back;
}
void back()     //小車后退
{
ET0 = 1;
run();
left_motor_back;
right_motor_back;
left_motor2_back;
right_motor2_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);
}
回復(fù)

使用道具 舉報(bào)

ID:636210 發(fā)表于 2019-12-24 21:34 | 顯示全部樓層
小車如不出現(xiàn)打滑的情況下,是不會(huì)動(dòng)的,相互抵制了。應(yīng)該是右電機(jī)向前加力,左電機(jī)空不加電就行了。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:662886 發(fā)表于 2019-12-24 19:37 | 顯示全部樓層
這個(gè)你得看全部程序,這樣沒(méi)辦法回答你啊
回復(fù)

使用道具 舉報(bào)

ID:594848 發(fā)表于 2019-12-24 21:42 | 顯示全部樓層
liuyongjun000a 發(fā)表于 2019-12-24 21:34
小車如不出現(xiàn)打滑的情況下,是不會(huì)動(dòng)的,相互抵制了。應(yīng)該是右電機(jī)向前加力,左電機(jī)空不加電就行了。

為啥是不會(huì)動(dòng)的。肯嗷サ种屏??麻煩能具體解釋一下嗎?
回復(fù)

使用道具 舉報(bào)

ID:594848 發(fā)表于 2019-12-24 21:52 | 顯示全部樓層
liuyongjun000a 發(fā)表于 2019-12-24 21:34
小車如不出現(xiàn)打滑的情況下,是不會(huì)動(dòng)的,相互抵制了。應(yīng)該是右電機(jī)向前加力,左電機(jī)空不加電就行了。

不會(huì)動(dòng)??相互抵制了??麻煩能具體解釋一下嗎??
回復(fù)

使用道具 舉報(bào)

ID:636210 發(fā)表于 2019-12-24 21:55 | 顯示全部樓層
小車如不出現(xiàn)打滑的情況下,是不會(huì)動(dòng)的,相互抵制了。應(yīng)該是右電機(jī)向前加力,左電機(jī)空不加電就行了。或者右前通電+左后通電=左前+右后,四個(gè)雙雙單邊通電,玩?zhèn)電動(dòng)玩具的一看就知道,要不不動(dòng),就不就亂動(dòng)。
回復(fù)

使用道具 舉報(bào)

ID:636210 發(fā)表于 2019-12-24 22:03 | 顯示全部樓層
Li5151 發(fā)表于 2019-12-24 21:42
為啥是不會(huì)動(dòng)的?相互抵制了??麻煩能具體解釋一下嗎?

你去家附近找找小孩可以驅(qū)動(dòng)的大點(diǎn)的電動(dòng)四驅(qū)車試試就知了,一個(gè)輪驅(qū)動(dòng),車子是向驅(qū)動(dòng)方向,同邊雙驅(qū)動(dòng)也是向驅(qū)動(dòng)方向。錯(cuò)開一前一后,驅(qū)動(dòng)相反,才會(huì)轉(zhuǎn)圈。
回復(fù)

使用道具 舉報(bào)

ID:594848 發(fā)表于 2019-12-25 14:47 | 顯示全部樓層
liuyongjun000a 發(fā)表于 2019-12-24 22:03
你去家附近找找小孩可以驅(qū)動(dòng)的大點(diǎn)的電動(dòng)四驅(qū)車試試就知了,一個(gè)輪驅(qū)動(dòng),車子是向驅(qū)動(dòng)方向,同邊雙驅(qū)動(dòng)也 ...

我的小車能夠單獨(dú)的轉(zhuǎn)圈也能夠單獨(dú)的直走,我是想只發(fā)送一次指令讓它先轉(zhuǎn)圈然后再直走。但是它不轉(zhuǎn)圈然后就直走了,你可能沒(méi)明白我的意思。
回復(fù)

使用道具 舉報(bào)

ID:239611 發(fā)表于 2019-12-25 15:34 | 顯示全部樓層
liuyongjun000a 發(fā)表于 2019-12-24 21:34
小車如不出現(xiàn)打滑的情況下,是不會(huì)動(dòng)的,相互抵制了。應(yīng)該是右電機(jī)向前加力,左電機(jī)空不加電就行了。

3樓是對(duì)的,建議你換幾個(gè)摩擦力小的輪子,放在光滑的平面上看效果。
回復(fù)

使用道具 舉報(bào)

ID:316947 發(fā)表于 2019-12-26 14:11 | 顯示全部樓層
驗(yàn)證是不是抵消的方法建議就先動(dòng)一邊的輪子,然后看下能不能動(dòng)
回復(fù)

使用道具 舉報(bào)

ID:274129 發(fā)表于 2019-12-27 12:40 | 顯示全部樓層
如果要實(shí)現(xiàn)轉(zhuǎn)彎的話  前輪一個(gè)輪子不動(dòng)  一個(gè)輪子按照你轉(zhuǎn)彎的方向轉(zhuǎn)動(dòng)就好
回復(fù)

使用道具 舉報(bào)

ID:675863 發(fā)表于 2019-12-28 09:37 | 顯示全部樓層
可能是電機(jī)安裝和驅(qū)動(dòng)方向錯(cuò)誤,拿起來(lái)懸空看看先排除一下是不是這個(gè)問(wèn)題
回復(fù)

使用道具 舉報(bào)

ID:384312 發(fā)表于 2019-12-29 19:08 | 顯示全部樓層
建議先把轉(zhuǎn)彎拉出來(lái)單獨(dú)調(diào)試,然后打包成函數(shù)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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