標(biāo)題:
誠(chéng)心請(qǐng)問下前輩關(guān)于循跡小車程序PWM變速問題
[打印本頁]
作者:
liurenquan
時(shí)間:
2017-9-24 11:24
標(biāo)題:
誠(chéng)心請(qǐng)問下前輩關(guān)于循跡小車程序PWM變速問題
#include <REG52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char zkb1=0 ; //左右占空比1、2
unsigned char zkb2=0 ;
unsigned char i,j;
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit IN5=P3^0;
sbit IN6=P3^1;
sbit IN7=P1^6;
sbit IN8=P1^7;//驅(qū)動(dòng)輪子口
sbit left_red1=P0^0;//紅外探測(cè)
sbit left_red2=P0^1;
sbit right_red1=P0^4;
sbit right_red2=P0^5;
sbit ENA=P2^7; //我用的是四輪循跡小車,分別設(shè)置了四個(gè)循跡小車
sbit ENB=P2^6;
sbit ENC=P2^5; //
sbit END=P2^4;
void delay(uint z)//延時(shí)函數(shù)
{
uchar i;
while(z--)
{
for(i=0;i<121;i++);
}
}
void init()//定義一個(gè)初始化函數(shù)
{
left_red1=1;//小車正對(duì)黑線時(shí)紅外感應(yīng)燈的狀態(tài)
left_red2=0;
right_red1=0;
right_red2=1;
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
ENA=1;
ENB=1;
ENC=1;
END=1;
}
void time0(void) interrupt 1//中斷函數(shù)
{
i++;
j++;
if(i<=zkb1)
{
ENA=1;
ENB=1;
}
else
{
ENA=0;
ENB=0;
}
if(i==40)//i到40us就開始下一個(gè)循環(huán)
{
ENA=~ENA;
ENB=~ENB;
i=0;
}
if(j<=zkb2)
{
ENC=1;
END=1;
}
else
{
ENC=0;
END=0;
}
if(j==40)
{
ENC=~ENC;
END=~END;
i=0;
}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
void straight()//直走
{
zkb1=39;
zkb2=39;
IN1=1;IN2=0;
IN3=0;IN4=1;//左邊兩個(gè)輪子
IN5=0;IN6=1;
IN7=0;IN8=1;//右邊兩個(gè)輪子
}
void turn_left() //左轉(zhuǎn)
{
zkb1=5;
zkb2=39;
IN1=0;IN2=1;
IN3=1;IN4=0;
IN5=0;IN6=1;
IN7=0;IN8=1;
}
void turn_right() //右轉(zhuǎn)
{
zkb1=39;
zkb2=5;
IN1=1;IN2=0;
IN3=0;IN4=1;
IN5=1;IN6=0;
IN7=1;IN8=0;
}
void infrared() //開始循跡
{
if(left_red1==1&&left_red2==1&&right_red1==1&&right_red2==1)//直走1
{
straight();
}
if(left_red1==1&&left_red2==0&&right_red1==1&&right_red2==1)//直走2 防止左右搖晃
{
straight();
}
if(left_red1==1&&left_red2==1&&right_red1==0&&right_red2==1)//直走3 防止左右搖晃
{
straight();
}
if(left_red1==0&&left_red2==1&&right_red1==1&&right_red2==1)//左轉(zhuǎn)
{
turn_left();
}
if(left_red1==0&&left_red2==0&&right_red1==1&&right_red2==1)//左轉(zhuǎn)2
{
turn_left();
}
if(left_red1==1&&left_red2==1&&right_red1==1&&right_red2==0)//右轉(zhuǎn)
{
turn_right();
}
if(left_red1==0&&left_red2==0&&right_red1==0&&right_red2==0)//右轉(zhuǎn)2
{
turn_right();
}
}
void main(void)//定義主函數(shù),不斷循環(huán)
{
init();
delay(100);
while(1)
{
infrared();
}
}
void int0(void) interrupt 0
{
}
我寫了之后沒有錯(cuò)誤,但就是沒反應(yīng),小車的連線我覺得也沒有問題。
之前我沒用PWM來寫了一個(gè)程序,輪子可以控制,但速度太快,對(duì)于大彎道會(huì)直接沖出去。
如果前輩們有什么好的建議(可改進(jìn)等)盡可提出來,我定會(huì)虛心接納、學(xué)習(xí)。
作者:
電子x戰(zhàn)隊(duì)
時(shí)間:
2017-9-24 18:58
直接用PID算法
作者:
HC6800-ES-V2.0
時(shí)間:
2017-9-25 09:57
我有別人的程序,我使用過,沒問題,你可以試試,也可以根據(jù)這個(gè)程序,學(xué)習(xí)、修改自己的程序。
頭文件bst_car.h
#ifndef __BSTCAR_H__
#define __BSTCAR_H__
//定義小車驅(qū)動(dòng)模塊輸入IO口
sbit IN1=P1^2;
sbit IN2=P1^3;
sbit IN3=P1^6;
sbit IN4=P1^7;
sbit EN1=P1^4;
sbit EN2=P1^5;
//定義按鍵
sbit K4=P3^7;
//sbit K3=P3^6;
//蜂鳴器驅(qū)動(dòng)口定義
sbit FM=P2^3;
//循跡LED指示燈定義
sbit Left_1_led=P3^3; //左循跡紅外傳感器
sbit Right_1_led=P3^2; //右循跡紅外傳感器
//避障LED指示燈定義
//sbit Left_2_led=P3^4; //左避障紅外傳感器
//sbit Right_2_led=P3^5; //右避障紅外傳感器
#define Left_moto_go {IN1=0,IN2=1;} //左電機(jī)向前走
//#define Left_moto_back {IN1=1,IN2=0;} //左邊電機(jī)向后轉(zhuǎn)
#define Left_moto_Stop {EN1=0;IN1=0,IN2=0;} //左邊電機(jī)停轉(zhuǎn)
#define Right_moto_go {IN3=1,IN4=0;} //右邊電機(jī)向前走
//#define Right_moto_back {IN3=0,IN4=1;} //右邊電機(jī)向后走
#define Right_moto_Stop {EN2=0;IN3=0,IN4=0;} //右邊電機(jī)停轉(zhuǎn)
#endif
主程序main.c
//按下K4按鍵,1秒左右啟電小車
//按下復(fù)位健可以停止小車
//注意程序只做參考之用,要達(dá)到最理想的尋跡效果,還需要同學(xué)們細(xì)心調(diào)試。
#include <reg52.h>
#include "bst_car.h"
unsigned char pwm_val_left =0;
unsigned char pwm_val_right =0;
unsigned char push_val_left =5;
unsigned char push_val_right=5;
bit Right_PWM_ON=1;
bit Left_PWM_ON =1;
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延時(shí)約xms毫秒
for(j=112;j>0;j--);
}
//前進(jìn)
void run(void)
{
push_val_left=6; //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
push_val_right=6;
Left_moto_go ;
Right_moto_go ;
}
//左轉(zhuǎn)
void leftrun(void)
{
push_val_left=5;
push_val_right=5;
Right_moto_go ;
Left_moto_Stop ;
}
//右轉(zhuǎn)
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 ;
}
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 左電機(jī) 停止
}
}
void pwm_out_right_moto(void)
{
if(Right_PWM_ON)
{
if(pwm_val_right<=push_val_right)
{
EN2=1;
}
else
{
EN2=0;
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
EN2=0;
}
}
//TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)
void timer0()interrupt 1 using 2
{
TH0=0XFC; //1Ms定時(shí)
TL0=0X66;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void keyscan(void) //按鍵掃描函數(shù)
{
A: if(K4==0)
{
delay(10);
if(K4==0)
{
FM=0;
while(K4==0);
FM=1;
}
else
{
goto A;
}
}
else
{
goto A;
}
}
void main(void)
{
P1=0X00;
keyscan();
delay(1000);
TMOD=0X01;
TH0= 0XFC;
TL0= 0X66;
TR0= 1;
ET0= 1;
EA = 1;
while(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();
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1