智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1355|回复: 0
打印 上一主题 下一主题

[控制类] 【提问】制作循迹搬运小车,代码如下,但是车运行断续且舵机不抓取

[复制链接]

1

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
165
威望
93
贡献
56
兑换币
56
注册时间
2018-10-16
在线时间
8 小时
跳转到指定楼层
1#
发表于 2018-12-6 01:14:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用的是12M 的晶振,单片机为89c52rc,舵机为sg90,电机驱动为L289N,目的是制作一个黑线循迹小车到指定的地点去抓取瓶子,并将瓶子运送到一个圆形的终点。写入程序以后,发现小车走一秒停三秒,会循迹,但是在超声波范围内舵机不上电无法抓取,尝试用定时器去模拟pwm来维持舵机的抓取,但是实测下来右侧舵机不发力,左侧舵机转角越为0度/180度,多次修改参数但是舵机依旧保持不变,后改为延时函数,仍然无效,代码以及通过编译,无语法错误。代码入下
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unnsigned int
unsigned int sum;   //用于超声波测距的中间变量
unsigned char zkb1 = 0;//左边电机的占空比
unsigned char zkb2 = 0;//右边电机的占空比
unsigned char t = 0;//定时器中断计数器
float L;//测量距离物品的距离
int nb=3;//此为判断是否需要转90°弯的标志。
sbit LG = P1 ^ 4;//L代表左,G代表前进,B代表后退,ENR代表右边使能
sbit LB = P1 ^ 3;
sbit RB = P1 ^ 2;
sbit RG = P1 ^ 1;
sbit ENR = P1 ^ 0;
sbit ENL = P1 ^ 5;
sbit djl=P2^0;  //分别为爪子的两个舵机
sbit djr=P2^1;
sbit Trig = P0^6;      //超声波模块的TRIG
sbit Echo = P0^7;      //超声波模块的ECHO
sbit R1 = P0 ^ 0;                //为6个光电循迹模块
sbit L3 = P0 ^ 5;
sbit L1 = P0 ^ 1;
sbit R3 = P0 ^ 4;
sbit R2 = P0 ^ 2;
sbit L2 = P0 ^ 3;
void delay(unsigned int m){ //延时函数,为0.5ms的倍数
        unsigned int j,i;
        for(i=0;i<m;++i)
                for(j=0;j<245;++j);
}
void openHc(){//发射声波
   Trig=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Trig=0;
}
unsigned char getDistance(){  //超声波测距,瓶子相距为4cm返回1
    TH0=0;
    TL0=0;
    openHc();
    while(!Echo);
    TR0=1;
    while(Echo);
    TR0=0;
    sum=TH0*256+TL0;
    L=(sum*1.78)/100;
    if(L<4){
        return 1;
    }
    else{
        return 0;
    }
}
void timer0() interrupt 1//中断用来模拟pwm,制作小车的占空比控速
{
        if (t < zkb1)
                ENL = 1;
        else
                ENL = 0;
        if (t < zkb2)
                ENR = 1;
        else
                ENR = 0;
        t++;
        if (t >= 100)
        {
                t = 0;
        }
}
void point_go() { //原地旋转以后恢复
        RB=0;
        LG=1;
        RG=1;
        LB=0;
        zkb1=20;
        zkb2=20;
}
void stop() {//小车停止指令
        zkb1=0;
        zkb2=0;
}
void point_turn() { //原地掉头
        ENR=1;
        ENL=1;
        RB=0;
        LG=0;
        RG=1;
        LB=1;
        zkb1=90;
        zkb2=90;
}
void qianjin() { //往前走
        zkb1 = 25;
        zkb2 = 25;
}
/*左转函数1*/
void turn_left1() {
        zkb1 = 0;
        zkb2 = 30;
}
/*左转函数2*/
void turn_left2() {
        zkb1 = 0;
        zkb2 = 40;
}
/*左转函数3*/
void turn_left3() {
        zkb1 = 0;
        zkb2 = 45;
}
/*右转函数1*/
void turn_right1() {
        zkb1 = 30;
        zkb2 = 0;
}
/*右转函数2*/
void turn_right2() {
        zkb1 = 40;
        zkb2 = 0;
}
/*右转函数3*/
void turn_right3() {
        zkb1 = 45;
        zkb2 = 0;
}
/*右转函数4*/
void turn_right4() {
        zkb1 = 90;
        zkb2 = 0;
}
/*左转函数4*/
void turn_left4() {
        zkb1 = 0;
        zkb2 = 90;
}
void Turn_big() interrupt 2{
        turn_left4();
}
void xunji(){
        uchar flag;
        if(nb==0){
                INT1=0;
                nb=1;//可能是2
        }
        if ((L1 == 1) && (R1 == 1) && (L2 == 1) && (R2 == 1)) {
                flag = 0;
        }//直行
        else        if ((L1 == 0) && (R1 == 0) && (L2 == 0) && (R2 == 0)) {
                flag = 0;
        }//直行
        else        if ((L1 == 1) && (R1 == 1) && (L2 == 0) && (R2 == 0)) {
                flag = 0;
        }//直行
        else        if ((L1 == 0) && (R1 == 0) && (L2 == 1) && (R2 == 1)) {
                flag = 0;
        }//直行
        else        if ((L1 == 1) && (R1 == 0) && (L2 == 0) && (R2 == 0)) {
                flag = 4;
        }//左偏1,左转1
        else        if ((L1 == 1) && (R1 == 0) && (L2 == 1) && (R2 == 0)) {       
                flag = 5;
        }//左偏2,左转2
        else        if ((L1 == 0) && (R1 == 0) && (L2 == 1) && (R2 == 0)) {       
                flag = 6;
        }//左偏3,左转3
        else        if ((L1 == 0) && (R1 == 1) && (L2 == 0) && (R2 == 0)) {
                flag = 1;
        }//右偏1,右转1
        else        if ((L1 == 0) && (R1 == 1) && (L2 == 0) && (R2 == 1)) {
                flag = 2;
        }//右偏2,右转2
        else        if ((L1 == 0) && (R1 == 0) && (L2 == 0) && (R2 == 1)) {
                flag = 3;
        }//右偏3,右转3
        switch (flag) {
        case 0:qianjing();
                break;
        case 1:turn_right1();
                break;
        case 2:turn_right2();
                break;
        case 3:turn_right3();
                break;
        case 4:turn_left1();
                break;
        case 5:turn_left2();
                break;
        case 6:turn_left3();
                break;
        default:break;
        }       
}
void main(){
        unsigned int i=1;
        int nb_end=-11; //此处指令代表L3检测的总次数,达到的时候就停止在终点
            EA=1;
        ET0=1;
        ET1=1;
        TMOD=0x11;
                TH0 = (65536 - 100) / 256;
                TL0 = (65536 - 100) % 256;
                TR0 = 1;
                ENL = 1;
                ENR = 1;
                EX1=1;
                zkb1 = 10;
                zkb2 = 10;
                LB = 0;
                RB = 0;
                LG = 1;//给电机加电启动
                RG = 1;
                while(1){
                        xunji();
                        if(L3==1){
                                nb=nb-1;
                        }
                        if (getDistance()){
                                stop();
                                while(1){
                                djr=djl=1;
                                dealy(3);
                                djl=djr=0;
                                dealy(37);
                                if(i){
                                point_turn();
                                point_go();
                                i--;
                                }
                                xunji();
                                if(nb==nb_end){
                                        zkb1=0;
                                        if(R3==1){
                                                zkb2=0;
                                                while(1){
                                                        djr=djl=1;
                                                        dealy(2);
                                                        djr=0;
                                                        dealy(2);
                                                        djl=djr=0;
                                                        dealy(36);
                        //放开瓶子
                                                }
                                        }
                                }
                                }
                        }               
                }
}
               



回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-25 14:32 , Processed in 0.057743 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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