![]() |
發布時間: 2019-12-24 15:36
正文摘要:問題求助。。!我做的是一個4輪驅動的基于藍牙控制的小車,上圖是小車的一個左轉程序,我的本意是想通過讓小車左旋轉一段時間然后再讓它直走,來達到左轉的目的?墒俏疫@個發送左轉指令時,小車不會動,等 ... |
貓兔0 發表于 2019-12-24 19:37 #include <reg52.h> #define Left_moto2_pwm P0_4 //接驅動模塊ENA 左后輪 #define Right_moto2_pwm P0_5 //接驅動模塊ENB 右后輪 #define Left_moto_pwm P1_4 //接驅動模塊ENA 左前輪 #define Right_moto_pwm P1_5 //接驅動模塊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 左電機反轉 前輪 sbit IN2 = P1^3; //為1 左電機正轉 前輪 sbit IN3 = P1^6; //為1 右電機正轉 前輪 sbit IN4 = P1^7; //為1 右電機反轉 前輪 sbit IN5 = P0^2; //為1 左電機反轉 后輪 sbit IN6 = P0^3; //為1 左電機正轉 后輪 sbit IN7 = P0^6; //為1 右電機正轉 后輪 sbit IN8 = P0^7; //為1 右電機反轉 后輪 bit Right_moto_stop=1; bit Left_moto_stop =1; int pwm=1; #define left_motor_go IN1 = 0, IN2 = 1//左電機正傳 #define left_motor_back IN1 = 1, IN2 = 0//左電機反轉 #define right_motor_go IN3 = 0, IN4 = 1//右電機正傳 #define right_motor_back IN3 = 1, IN4 = 0//右電機反轉 #define left_motor2_go IN5 = 0, IN6 = 1//左電機正傳 #define left_motor2_back IN5 = 1, IN6 = 0//左電機反轉 #define right_motor2_go IN7 = 0, IN8 = 1//右電機正傳 #define right_motor2_back IN7 = 1, IN8 = 0//右電機反轉 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 push_val_right =pwm; //PWM 調節參數1-10 if(pwm==10) pwm=0; if(pwm==0&&pwm<0) pwm=0; } void pwm_out_left_moto(void) //左側電機調速,調節push_val_left的值改變電機轉速,占空比 { 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) //右側電機調速 { 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中斷服務子函數產生PWM信號// { TH0=0XF8; //1Ms定時 TL0=0X30; 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; //右電機前進 left_motor2_go; //左電機前進 后輪 right_motor2_go; //右電機前進 后輪 } void left_go() //左轉 { ET0 = 1; run(); left_motor_back; right_motor_go; left_motor2_back; right_motor2_go; delay(700); forward(); } void right_go() //右轉 { ET0 = 1; run(); delay(50); right_motor_back; left_motor_go; right_motor2_back; left_motor2_go; delay(700); forward(); } void left() //小車左轉圈 { ET0 = 1; run(); delay(50); right_motor_go; // 右電機前進 left_motor_back; // 左電機后退 right_motor2_go; // 右電機前進 left_motor2_back; // 左電機后退 } void right() //小車右轉圈 { 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; //清除接收標志 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); } |
建議先把轉彎拉出來單獨調試,然后打包成函數。 |
可能是電機安裝和驅動方向錯誤,拿起來懸空看看先排除一下是不是這個問題 |
如果要實現轉彎的話 前輪一個輪子不動 一個輪子按照你轉彎的方向轉動就好 |
驗證是不是抵消的方法建議就先動一邊的輪子,然后看下能不能動 |
liuyongjun000a 發表于 2019-12-24 21:34 3樓是對的,建議你換幾個摩擦力小的輪子,放在光滑的平面上看效果。 |
liuyongjun000a 發表于 2019-12-24 22:03 我的小車能夠單獨的轉圈也能夠單獨的直走,我是想只發送一次指令讓它先轉圈然后再直走。但是它不轉圈然后就直走了,你可能沒明白我的意思。 |
Li5151 發表于 2019-12-24 21:42 你去家附近找找小孩可以驅動的大點的電動四驅車試試就知了,一個輪驅動,車子是向驅動方向,同邊雙驅動也是向驅動方向。錯開一前一后,驅動相反,才會轉圈。 |
小車如不出現打滑的情況下,是不會動的,相互抵制了。應該是右電機向前加力,左電機空不加電就行了。或者右前通電+左后通電=左前+右后,四個雙雙單邊通電,玩個電動玩具的一看就知道,要不不動,就不就亂動。 |
liuyongjun000a 發表于 2019-12-24 21:34 不會動??相互抵制了??麻煩能具體解釋一下嗎?? |
liuyongjun000a 發表于 2019-12-24 21:34 為啥是不會動的?相互抵制了??麻煩能具體解釋一下嗎? |
這個你得看全部程序,這樣沒辦法回答你啊 |