首页 > 编程知识 正文

循迹小车的制作图片,实训循迹小车的调试步骤

时间:2023-05-06 17:10:18 阅读:175831 作者:2578

跟踪小车制作希望自己也能从开始正式制作跟踪小车开始,在逐步摸索的过程中积累一些经验,与广大电子爱好者分享! 讲解1 .控制部这里控制部采用15系列单片机,自己制作了最小系统

2 .电源部分电源是小车的动力源泉,如果电源有问题。 因为用3节14500锂电池供电,所以一节电池有3.7V。 虽然感觉电源电压超过12V的机会很少,但是为了保险起见追加了7812。 L7805CV降压,其中12V为电机供电(电源电压低于12V,7812输出低于12V ),5V为单片机供电。 电源部分原理图:图中电源部分的输入电压为24V,其实不是很高(在网上找的图、我马上看) )。

实物照片:

3 .跟踪模块的跟踪模块相当于小车的眼睛,小车的行走轨迹完全由这些跟踪模块支撑,跟踪模块的选择、放置角度、个数和距离对小车能否完全跟踪

正如图中所示,一开始我也把这些红外对管摆得这么愚蠢。

结果表明,红外对管的安装方式相当差。 不仅检测不到黑线,而且精度也有好的时候和坏的时候。 即使很滑,检测不到黑线的现象依然很严重。 暂且不谈如何解决,让我们来看看电机驱动4。 驱动模块要说电机驱动,最经典、最万能的当然是L298N,这里使用的是TB6612FNG电机驱动模块

5 .购物车实物图

组装跟踪模块后发现明显很敏锐。 使用方便! 在这里附上每个汽车跟踪模块的标签。

6 .下一个程序是用手推车跑,最需要的是pwm。 如果还不能进行pwm。 可以找现成的例行程序。 以下是51单片机利用定时器0生成PWM # includereg 52.hunsignedcharpwm _ left _ val=210; //左电机占空比取值范围0-170,0,0最快unsigned char pwm_right_val=210; //右电机的占空比值在取值范围0-170,0,0最快unsigned char pwm_t; //周期//*电机驱动IO的定义*/sbit IN1=P2^0; //1左电机反转sbit IN2=P2^1; //1左电机正转sbit IN3=P2^2; //1右电机正转sbit IN4=P2^3; //1右电机反转sbit EN1=P2^4; //1左电机使能sbit EN2=P2^5; //1右电机使能sbit STBY=P2^6; 设置//0的电机全部停止; 1安装好电机才能按指令旋转/*红外SiO定义*/sbit L1=P1^0; sbit L2=P1^1; sbit zj=P1^4; sbit R3=P1^2; sbit R4=P1^3; #define left_motor_enEN1=1//左电机有效# define left _ motor _ stops en1=0///左电机停止# define right _ motor _ enen IN2=1//左电机正传#define left_motor_backIN1=1,in2=0///左电机反转#defineright_mootor IN4=0//右电机正传# define _ //左电机前进right_motor_go; //右电机前进(//定时器0中断void timer0 ) ) interrupt1(PWM_t; if(PWM_t==255 ) pwm_t=EN1=EN2=0; if(PWM_left_val==PWM_t ) EN1=1; if(PWM_right_val==PWM_t ) EN2=1; }void main () {TMOD |=0x02; //8位自动重载模块TH0=220; TL0=220; //11.0592M晶振下的占空比最大比为256,输出功率100HZTR0=1; //开始计时器0ET0=1; //定时器0中断许可EA=1; //总中断时while(1) {forward ); //前进}

使用15系列单片机的优点是可以通过硬件实现变频pwm输出,摆脱了对定时器的依赖。 如果使用计时器0产生pwm波,将L1和R4分别设定为外部中断0和外部中断1,则外部中断0到来时中断计时器0的中断,优先处理外部中断0的中断服务函数,所以此时看到的现象是L1在黑线上。 当然,也可以使用延迟函数在外部中断0的服务函数中写入假pwm。 这个方法我没有尝试过。 大神们有时间可以试试

以下是在STC官网上使用PCA实现可变频率pwm输出的经过。

/* --- STC15F系列 PCA输出6/7/8位PWM举例-------------------------*///工作频率一般为11.0592MHz#include "reg51.h"#include "intrins.h"#define FOSC 11059200Ltypedef unsigned char BYTE;typedef unsigned int WORD;sfr P0M1 = 0x93;sfr P0M0 = 0x94;sfr P1M1 = 0x91;sfr P1M0 = 0x92;sfr P2M1 = 0x95;sfr P2M0 = 0x96;sfr P3M1 = 0xb1;sfr P3M0 = 0xb2;sfr P4M1 = 0xb3;sfr P4M0 = 0xb4;sfr P5M1 = 0xC9;sfr P5M0 = 0xCA;sfr P6M1 = 0xCB;sfr P6M0 = 0xCC;sfr P7M1 = 0xE1;sfr P7M0 = 0xE2;sfr P_SW1 = 0xA2; //外设功能切换寄存器1#define CCP_S0 0x10 //P_SW1.4#define CCP_S1 0x20 //P_SW1.5sfr CCON = 0xD8; //PCA控制寄存器sbit CCF0 = CCON^0; //PCA模块0中断标志sbit CCF1 = CCON^1; //PCA模块1中断标志sbit CR = CCON^6; //PCA定时器运行控制位sbit CF = CCON^7; //PCA定时器溢出标志sfr CMOD = 0xD9; //PCA模式寄存器sfr CL = 0xE9; //PCA定时器低字节sfr CH = 0xF9; //PCA定时器高字节sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器sfr CCAP0L = 0xEA; //PCA模块0捕获寄存器 LOWsfr CCAP0H = 0xFA; //PCA模块0捕获寄存器 HIGHsfr CCAPM1 = 0xDB; //PCA模块1模式寄存器sfr CCAP1L = 0xEB; //PCA模块1捕获寄存器 LOWsfr CCAP1H = 0xFB; //PCA模块1捕获寄存器 HIGHsfr CCAPM2 = 0xDC; //PCA模块2模式寄存器sfr CCAP2L = 0xEC; //PCA模块2捕获寄存器 LOWsfr CCAP2H = 0xFC; //PCA模块2捕获寄存器 HIGHsfr PCA_PWM0 = 0xf2; //PCA模块0的PWM寄存器sfr PCA_PWM1 = 0xf3; //PCA模块1的PWM寄存器sfr PCA_PWM2 = 0xf4; //PCA模块2的PWM寄存器void main(){ P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; P6M0 = 0x00; P6M1 = 0x00; P7M0 = 0x00; P7M1 = 0x00; ACC = P_SW1; ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0 P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2) // ACC = P_SW1;// ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=1 CCP_S1=0// ACC |= CCP_S0; //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)// P_SW1 = ACC; // // ACC = P_SW1;// ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=1// ACC |= CCP_S1; //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)// P_SW1 = ACC; CCON = 0; //初始化PCA控制寄存器 //PCA定时器停止 //清除CF标志 //清除模块中断标志 CL = 0; //复位PCA寄存器 CH = 0; CMOD = 0x02; //设置PCA时钟源 //禁止PCA定时器溢出中断 PCA_PWM0 = 0x00; //PCA模块0工作于8位PWM CCAP0H = CCAP0L = 0x20; //PWM0的占空比为87.5% ((100H-20H)/100H) CCAPM0 = 0x42; //PCA模块0为8位PWM模式 PCA_PWM1 = 0x40; //PCA模块1工作于7位PWM CCAP1H = CCAP1L = 0x20; //PWM1的占空比为75% ((80H-20H)/80H) CCAPM1 = 0x42; //PCA模块1为7位PWM模式 PCA_PWM2 = 0x80; //PCA模块2工作于6位PWM CCAP2H = CCAP2L = 0x20; //PWM2的占空比为50% ((40H-20H)/40H) CCAPM2 = 0x42; //PCA模块2为6位PWM模式 CR = 1; //PCA定时器开始工作 while (1);}其实这里只是用 模块0和模块1就好,调节成自己想要的 工作位数及 占空比即可!占空比控制着车的速度,占空比越高小车速度越快,占空比越低小车速度越慢。
循迹模块L1,R4,L2,R3分别定义为外部中断0、外部中断1、外部中断2、外部中断3,采集到黑线即进入中断服务函数里面,在中断服务函数里进行处理。中断的申明也可以直接使用stc官网的例程,这里不再一一列举。 中断服务函数里面控制小车的左转还是右转; //-----------------------------------------//中断服务程序void exint0() interrupt 0 //INT0中断入口{ while(zj==0) { right_motor_go; IN1 = 1;IN2 = 1; }}当 L1检测到黑线时,小车偏离黑线靠右,进入中断服务函数左转,,中断服务函数里面使用一个 while结构,当标号为 zj的循迹模块检测到黑线时,立即跳出中断服务函数,while函数里面即为定义的左转函数!! 根据线路合理摆放循迹模块之间的距离,调好循迹模块的灵敏度,小车就可以在直角、锐角的跑道上畅通无阻啦 基本上到这里小车就已经可以做出来了,简单总结一下这辆循迹小车的特点就是这是一台 完全靠中断跑的暴躁的小车!!!!  哈哈~~ 后期再改。。


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。