求3144霍尔传感器智能小车测速程序

求3144霍尔传感器智能小车测速程序,第1张

这里应该没人会给的

霍尔电压随磁场强度的变化而变化,磁场越强,电压越高,磁场越弱,电压越低,霍尔电压值很小,通常只有几个毫伏,但经集成电路中的放大器放大,就能使该电压放大到足以输出较强的信号。若使霍尔集成电路起传感作用,需要用机械的方法来改变磁场强度。下图所示的方法是用一个转动的叶轮作为控制磁通量的开关,当叶轮叶片处于磁铁和霍尔集成电路之间的气隙中时,磁场偏离集成片,霍尔电压消失。这样,霍尔集成电路的输出电压的变化,就能表示出叶轮驱动轴的某一位置,利用这一工作原理,可将霍尔集成电路片用作用点火正时传感器。霍尔效应传感器属于被动型传感器,它要有外加电源才能工作,这一特点使它能检测转速低的运转情况。

智能小车烧录进去但是不动原因如下:

1、电机功耗太大,无法启动。

2、电机驱动电源功率不足,电机无法运行。

3、接线有接触不良现象,先从电源到电机检测一下,看看程序和机械部分。

5mb。一个智能小车程序占stm32内存5mb。此大小是下载过程中显示的程序大小,也是官网解释的大小。程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。它以某些程序设计语言编写,运行于某种目标结构体系上。

智能小车程序

#include "reg52h"

#define det_Dist 255 //单个脉冲对应的小车行走距离,其值为车轮周长/4

#define RD 9 //小车对角轴长度

#define PI 31415926

#define ANG_90 90

#define ANG_90_T 102

#define ANG_180 189

/============================全局变量定义区============================/

sbit P10=P1^0; //控制继电器的开闭

sbit P11=P1^1; //控制金属接近开关

sbit P12=P1^2; //控制颜色传感器的开闭

sbit P07=P0^7; //控制声光信号的开启

sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1

sbit P24=P2^4; //左

sbit P25=P2^5; //右 接收左右光传感器的信号,有光为0

unsigned char mType=0; //设置运动的方式,0 向前 1 向左 2 向后 3 向右

unsigned char Direction=0; //小车的即时朝向 0 朝上 1 朝左 2 朝下 3 朝右

unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标 CM(sX,sY)

unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一

unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断

// Inter_EX0记录外部中断0的中断状态

// 0 动作最近的前一次未中断过,

// 1 动作最近的前一次中断过

unsigned char cntIorn=0; //铁片数

unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,

//(在MAIN中接受铁片颜色判断传感器的信号来赋值)

unsigned char Light_Flag=0;//进入光引导区的标志(1)

unsigned int cntTime_5Min=0;//时间周期数,用于 T0 精确定时

unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数

/============================全局变量定义区============================/

/------------------------------------------------/

/-----------------通用延迟程序-------------------/

/------------------------------------------------/

void delay(unsigned int time) // time05ms延时

{

unsigned int i,j;

for(j=0;j<time;j++)

{

for(i=0;i<60;i++)

{;}

}

}

/-----------------------------------------------/

/-------------------显示控制模块----------------/

/-----------------------------------------------/

/数码管显示,显示铁片的数目(设接在P0,共阴)/

void Display(unsigned char n)

{

char Numb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77};

P0=Numb[n];

}

/-----------------------------------------------/

/-------------------传感器模块------------------/

/-----------------------------------------------/

/光源检测程序: /

/用于纠正小车运行路线的正确性/

unsigned char LightSeek()

{ void Display(unsigned char);

bit l,r;

l=P24;

r=P25;

if(l==0&&r==1)

{

//Display(1);

return (3); //偏左,向右开

}

if(r==0&&l==1)

{

//Display(3);

return(1); //偏右,向左开

}

if((l==1&&r==1)||(l==0&&r==0))

{//Display(9);

return(0); //没有偏离,前进

}

}

/铁片检测程序: /

/判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场/

void IornColor()

{

delay(4000);

bkAim=(int)(P26);

Display((int)(P26)+2);

}

/-----------------------------------------------/

/------------------运动控制模块-----------------/

/-----------------------------------------------/

/====基本动作层:完成基本运动动作的程序集====/

/运动调整程序: /

/对小车的运动进行微调/

void ctrMotor_Adjust(unsigned char t)

{

if(t==0)

{

P2=P2&240|11; //用来解决两电机不对称的问题

delay(6);

}

if(t==3)

{

P2=P2&250; //向左走

delay(1);

}

if(t==1)

{

P2=(P2&245);

delay(1); //向右走

}

P2=((P2&240)|15);

delay(10);

}

/直走程序: /

/控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)/

/只改变小车sX 和 sY的值而不改变Direction的值 /

void ctrMotor_Dist(float dist,unsigned char type)

{unsigned char t=0;

mType=type;

P2=((P2&240)|15);

cntTime_Plues=(int)(dist/det_Dist);

while(cntTime_Plues)

{

if(Inter_EX0==1&&StartTask==0)

{

cntTime_Plues=0;

break;

}

if(Light_Flag==1) t=LightSeek();

if(type==0) //向前走

{

P2=P2&249;

delay(40);

ctrMotor_Adjust(t);

}

if(type==2) //向后退

{

P2=P2&246;

delay(50);

ctrMotor_Adjust(t);

}

P2=((P2&240)|15);

if(mType==2) delay(60);//刹车制动 05ms

else delay(75);

}

}

/拐弯程序: /

/控制小车运动角度,type为运动方式(1 3) /

/只改变小车Direction的值而不改变sX 和 sY的值/

void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir)

{

unsigned char i=0;

mType=type;

P2=((P2&240)|15);

cntTime_Plues=(int)((PIRD90/(180det_Dist)12)ang/90);

while(cntTime_Plues)

{

if(Inter_EX0==1&&StartTask==0)

{

cntTime_Plues=0;

break;

}

if(type==1) //向左走

{

P2=P2&250;

delay(100);

ctrMotor_Adjust(0);

}

if(type==3) //向右走

{

P2=P2&245;

delay(100);

ctrMotor_Adjust(0);

}

P2=((P2&240)|15);

delay(50);//刹车制动 05ms

}

if(!(Inter_EX0==1&&StartTask==0))

{

Direction=dir;

}

}

/====基本路线层:描述小车基本运动路线的程序集====/

/当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)/

void rchPlace()

{unsigned int time,b,s,g;

time=(int)(cntTime_5Min0065535);//只有一个数码管时,轮流显示全过程秒数 个 十 百

b=time%100;

s=(time-b100)%100;

g=(time-b100-s10)%10;

if(bkAim==2)

{

//到达停车场了,停车

EA=0;

P2=((P2&240)|15);

while(1)

{

Display(10); //N

delay(2000);

Display(cntIorn);

delay(2000);

Display(11);//A

delay(2000);

Display(b);

delay(2000);

Display(s);

delay(2000);

Display(g);

delay(2000);

}

}

else

{

if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片

}

}

/无任务模式: /

/设置小车的固定运动路线,未发现铁片时的运动路线/

void BasicRoute()

{ //Light_Flag=1;

ctrMotor_Dist(153,0);

//Light_Flag=0;

ctrMotor_Ang(ANG_90,1,1);

ctrMotor_Dist(100-sX,0);

ctrMotor_Dist(125,2);

ctrMotor_Dist(73,0);

ctrMotor_Ang(ANG_90,1,2);

//Light_Flag=1;

ctrMotor_Dist(153,0);

//Light_Flag=0;

ctrMotor_Ang(ANG_180,1,0);

rchPlace();

}

/任务模式: /

/设置小车的发现铁片后的运动路线/

void TaskRoute()

{

//基本运行路线表,记载拐弯 0 向前 1 左拐 2 向后 3 右拐,正读去A区;反读去B区

StartTask=1;

ctrMotor_Ang(ANG_90_T,1,2);

if(bkAim==1) //仓库A

{

ctrMotor_Dist(10,0);

P2=((P2&240)|15);

delay(60);

ctrMotor_Ang(ANG_90_T,1,3);

ctrMotor_Dist(100-sX,2);

ctrMotor_Ang(ANG_90_T,1,2);

Light_Flag=1;

ctrMotor_Dist(153,2);

Light_Flag=0;

// ctrMotor_Ang(208,1,0);

}

else if(bkAim==0) //仓库B

{

ctrMotor_Dist(10,0);

P2=((P2&240)|15);

delay(60);

ctrMotor_Ang(ANG_90_T,1,3);

ctrMotor_Dist(100-sX,0);

ctrMotor_Ang(ANG_90_T,1,0);

Light_Flag=1;

ctrMotor_Dist(153,2);

Light_Flag=0;

//ctrMotor_Ang(208,1,0);

}

delay(5000);

rchPlace();

}

/---------------------------------------------/

/-------------------主程序段------------------/

/---------------------------------------------/

void main()

{

delay(4000);

P2=0xff; //初始化端口

P07=0;

P1=0;

TMOD=0x01; //初始化定时器0/1 及其中断

TL0=0;

TH0=0;

TR0=1;

ET0=1;

ET1=1;

IT0=1; //初始化外部中断

EX0=1;

IT1=1;

EX1=1;

EA=1;

P11=1;

while(1)

{

Display(cntIorn);

bkAim=2;

BasicRoute();

if(Inter_EX0==1)

{

TaskRoute();//按获得铁片后的路线运动

IE0=0;

EX0=1;

}

Inter_EX0=0;

}

}

/----------------------------------------------------/

/----------------------中断程序段--------------------/

/----------------------------------------------------/

/定时器0中断程序: /

/当时间过了5分钟,则就地停车并进入休眠状态/

void tmOver(void) interrupt 1

{

cntTime_5Min++;

TL0=0;

TH0=0;

if(cntTime_5Min>=4520)

{

Display(5);

P2=((P2&240)|15);

EA=0; //停车程序

P07=1;

delay(4000);

PCON=0X00;

while(1);

}

}

/外部中断0中断程序: /

/发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器/

/并联在一起(设接在P07) 0为A仓库,1为B仓库,2为停车场/

void fndIorn(void) interrupt 0

{

unsigned char i;

P10=1;

P2=((P2&240)|15); //停车

P07=1;

delay(1000);//刹车制动 05ms

P07=0;

Inter_EX0=1;

cntIorn++;

Display(cntIorn);

for(i=0;i<40;i++)

{

P2=P2&249;

delay(2);

P2=((P2&240)|15);

delay(2);

}

P2=P2&249;

delay(100);

P2=((P2&240)|15); //停车

IornColor(); //判断铁片黑白,设置bkAim

for(i=0;i<95;i++)

{

P2=P2&249;

delay(3);

P2=((P2&240)|15);

delay(2);

}

P2=((P2&240)|15); //停车

delay(4000); //把铁片吸起来

EX0=0;

}

/外部中断1中断程序: /

/对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位/

void stpMove(void) interrupt 2

{

cntTime_Plues--;

if(Direction==0) //向上

{

if(mType==0) sY+=det_Dist;

else if(mType==2)

sY-=det_Dist;

}

else if(Direction==1) //向左

{

if(mType==0) sX+=det_Dist;

else if(mType==2)

sX-=det_Dist;

}

else if(Direction==2) //向下

{

if(mType==0) sY-=det_Dist;

else if(mType==2)

sY+=det_Dist;

}

else if(Direction==3) //向右

{

if(mType==0) sX-=det_Dist;

else if(mType==2)

sX+=det_Dist;

}

我3年前参加了飞思卡尔智能小车的比赛,当时什么都没有,什么都不会,就组了两个兄弟上了。

根据之前的经验,来谈谈我个人的看法吧。

1 首先,理论知识还是很重要的,数电和模电、传感器等课程一定要学好,如果没怎么学也没关系,可以在实际 *** 作中边做边学;

2 先把硬件搭起来,最好能向学长或者学校借到上一届比赛的车子,相关的资料也去要一下,和他们谈一谈,这样会少走很多弯路;

3 学习搭建机械结构,还有制作PCB板,电路板的图可以参照上一届的资料,也可以去智能小车论坛上找,画好的过后就拿出去做,学校有做板子的就托老师在学校做,做好了就自己去电子元件市场买元件回来焊,焊完了测,这个过程可以学到很多东西的,有些芯片和传感器不好买还要到网上去采购;

4 硬件搭好了,事情就已经完成了一大半了,找上一届的代码或者去论坛上找一些代码钻研一下,先一个模块一个模块的调,传感器能检测到信号了,AD/DA转换没问题了,舵机能按自己的想法转动了,电机能加速减速反向旋转了,然后才是综合到一起,考虑集成、优化、算法的问题;

5 中间会遇到很多问题,有些问题光靠自己很难解决的,要虚心向老师和同学请教,解决的问题越多成长的越快,关键是要自己动手去做,光看是肯定不行的,然后遇到问题解决问题。

写的比较乱,不过还是希望能有所帮助。

最后一句赋值错了!

这个方法是好用的,我就是抄写的你的代码。

不过要封装成

rotate_angle(LEFT,360);

rotate_angle(ALL,720); 形式的函数才好用

以上就是关于求3144霍尔传感器智能小车测速程序全部的内容,包括:求3144霍尔传感器智能小车测速程序、智能小车烧录进去但是不动、一个智能小车程序占stm32内存多少等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10115481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存