小车循迹原理

合集下载

智能小车循迹原理

智能小车循迹原理

智能小车循迹原理
智能小车循迹原理是通过使用感应器和控制算法来实现。

循迹感应器通常是由多个红外线传感器组成,这些传感器被安装在小车底部,并用于检测地面上的跟踪线。

这些红外线传感器能够发射和接收红外线信号。

当小车开始行驶时,红外线传感器会发射红外线信号,并迅速接收反射回来的信号。

如果传感器检测到白色地面,则意味着小车已偏离跟踪线。

根据传感器接收到的信号强度,算法会计算出小车偏离跟踪线的程度和方向。

接下来,控制算法会根据传感器的测量结果来调整小车的方向。

如果小车偏离跟踪线的程度较小,则只需进行轻微的调整,如微弱转向。

而如果偏离程度较大,则可能需要更大的转向角度来重新回到跟踪线上。

循迹算法可以通过PID控制器进行实现。

PID控制器通过使用
P(比例)、I(积分)和D(微分)三个参数来实现精确的控制。

比例参数用于根据偏离程度来计算所需的转向角度。

积分参数用于纠正持续的偏离,而微分参数用于平稳地调整转向角度变化的速率。

循迹原理的关键是通过连续地检测和调整来保持小车在跟踪线上运行。

这种感应器和控制算法的结合使得智能小车能够准确地遵循预定的路径,并在偏离时能够及时进行修正。

循迹小车原理

循迹小车原理

循迹小车原理
循迹小车是一种能够根据指定轨迹行驶的智能小车,它可以根据预先设计的路
线进行自主行驶,是现代智能科技在机器人领域的一种应用。

循迹小车的原理主要包括传感器感知、控制系统和执行系统三个方面,下面我们将逐一介绍。

首先,循迹小车的传感器感知是其实现自主行驶的关键。

传感器可以获取小车
周围环境的信息,如地面颜色、光线强度等。

通过对这些信息的感知和分析,循迹小车可以确定自己当前的位置和方向,并且判断前方的路况,从而做出相应的行驶决策。

常见的循迹传感器包括红外线传感器、光电传感器等,它们可以有效地感知地面的黑线或者其他指定的标志,从而实现沿着指定轨迹行驶的功能。

其次,循迹小车的控制系统起着至关重要的作用。

控制系统是循迹小车的大脑,它接收传感器传来的信息,进行数据处理和分析,并做出相应的控制指令,以控制小车的行驶方向和速度。

控制系统通常由单片机或者其他嵌入式系统构成,它们能够根据预先设计的算法,实现对小车的精准控制,从而使小车能够按照指定的轨迹行驶。

最后,循迹小车的执行系统是实现控制指令的具体执行者。

执行系统通常包括
电机、轮子等部件,它们能够根据控制系统发出的指令,实现小车的转向、前进、后退等动作。

通过执行系统的协调配合,循迹小车可以按照预先设计的轨迹自主行驶,完成各种任务。

总的来说,循迹小车的原理是基于传感器感知、控制系统和执行系统的协同作用,实现对小车行驶的精准控制。

在实际应用中,循迹小车可以用于仓库自动化、智能导航、无人巡检等领域,为人们的生产和生活带来便利。

随着科技的不断发展,循迹小车的原理和技术也在不断完善和创新,相信它将会有更广泛的应用前景。

循迹小车原理

循迹小车原理

循迹小车原理循迹小车是一种能够根据预设的轨迹行驶的智能小车,它可以通过感知环境、控制方向和速度来实现自动导航。

循迹小车原理主要包括传感器感知、控制系统和执行机构三个部分。

首先,循迹小车通过搭载在车身上的传感器来感知周围环境。

这些传感器通常包括红外线传感器、光电传感器等,它们能够检测地面上的标志线或者其他特定的标识物,从而确定小车的行驶方向。

通过不断地对环境进行感知和分析,循迹小车能够及时地调整自己的行驶轨迹,保持在预设的路径上行驶。

其次,循迹小车的控制系统起着至关重要的作用。

当传感器检测到环境发生变化时,控制系统会根据预设的算法和逻辑进行数据处理和决策,然后通过执行机构来控制车轮转向和速度。

控制系统的设计和算法的优化直接影响着循迹小车的行驶稳定性和精确度。

一个高效的控制系统能够使循迹小车更加智能化和灵活,从而提高其在复杂环境下的适应能力。

最后,执行机构是循迹小车原理中的另一个关键部分。

它通常由电机、舵机等组成,能够根据控制系统的指令来实现车轮的转向和速度调节。

执行机构的性能直接影响着循迹小车的实际行驶效果,包括转向灵活度、速度响应等方面。

因此,对执行机构的选型和优化也是循迹小车设计中需要重点考虑的问题。

总的来说,循迹小车原理涉及传感器感知、控制系统和执行机构三个方面,它们共同作用才能实现循迹小车的自动导航功能。

只有在这三个方面都得到合理的设计和优化,循迹小车才能够稳定、精准地行驶在预设的轨迹上。

希望通过对循迹小车原理的深入理解,能够为循迹小车的设计和应用提供一定的参考和帮助。

循迹小车的原理

循迹小车的原理

循迹小车的原理循迹小车是一种基于传感器的智能机器人,它能够自动地在预设的路径上行驶,并根据环境的变化进行自我调整。

循迹小车的原理主要涉及到传感器、控制电路和电机三个方面。

首先,循迹小车依靠传感器来感知环境的变化,其中最常用的传感器是红外线传感器。

红外线传感器主要由发射器和接收器组成,其中发射器发射红外线信号,接收器接收反射回来的红外线信号。

当循迹小车在行驶过程中,传感器能够感知到路径上的黑线或者其他颜色差异,然后将这些信号转化为电信号,传递给控制电路。

其次,控制电路是循迹小车的核心部分,它根据传感器接收到的信号,进行相应的逻辑判断和处理,来控制电机的运动。

控制电路一般由集成电路组成,可以通过编程或者硬连线的方式来实现逻辑控制。

当传感器感知到黑线时,控制电路会判断是否需要转弯,根据不同的判断结果,向电机提供不同的控制信号,控制电机的转向和速度。

这样循迹小车就可以根据黑线的走向,做出适当的转弯和速度调整,从而沿着预设的路径行驶。

第三,电机是循迹小车的动力源,它负责驱动车轮的转动。

一般来说,循迹小车采用两个驱动轮,每个驱动轮都有一个电机来驱动。

电机接收控制电路输出的控制信号,根据信号的不同进行相应的运转,从而驱动车轮转动。

当循迹小车需要转弯时,控制电路会向电机提供不同的信号,使得其中一个电机停止或者反向运转,从而实现转弯动作。

通过控制电路对电机的控制,循迹小车可以根据需要改变行进速度和转弯半径,以实现在预设路径上的准确行驶。

综上所述,循迹小车的原理主要包括传感器的感知、控制电路的处理和电机的运转。

通过传感器感知路径上的黑线或其他有色标记,控制电路进行逻辑判断和处理,再通过控制信号控制电机的运动,循迹小车就可以自动地在预设的路径上行驶。

循迹小车的原理简单实用,可以通过调整控制电路和传感器的设置,实现不同场景下的行驶需求,因此在教育、娱乐和实验等领域都有广泛的应用。

寻迹避障小车原理

寻迹避障小车原理

循迹避障小车原理一)小车功能实现利用光电传感(红外对射管,红外发射与接收二极管组成)检测黑白线,实现小车能跟着白线(或黑线)行走,同时也可避开障碍物,即小车寻迹过程中,若遇障碍物可自行绕开,绕开后继续寻迹。

二)电路分析1.光电传感循迹光电传感器原理,利用黑白线对红外线不同的反射能力。

然后通过光敏二极管或光敏三极管,接收反射回的不同光强信号,把不同光强转换为电流信号,最后通过电阻,转换为单片机可识别的高低电平。

光电传感器实现循迹的基本电路如下图所示、循迹传感器基本电路电路解释:TC端是传感器工作控制端,为高电平时,发光二极管不工作,传感器休眠,为低电平时,传感器启动。

Signal端为检测信号输出,当遇到黑线,黑线吸收大量的红外线,反射的红外线很弱,光敏三极管不导通,signal 输出高电平,当遇到白线,与黑线相反,反射的红外线很强,使光敏三极管导通,signal输出低电平。

寻迹部分调整左右传感器之间的距离,两探头距离约等于白线宽度最合适,一般白线宽度选择范围为3 – 5 厘米比较合适。

注意:该传感器的灵敏度是可调的,偶尔传感器遇到白线却不能送出相应的信号,通过调节传感器上的可调电阻,适当的增大或减小灵敏度。

另外,循迹传感器的安放也算是比较有讲究的,有两种方法,一种是两个都是放置在白线内侧但紧贴白线边缘,第二种是都放置在白线的外侧,同样紧贴白线边缘。

我们通常采用第二种方法。

编写程序使小车遇白线时,小车跟着白线走。

当小车先前前进时,如果向左偏离了白线。

那么右边传感器会产生一个低电平,单片机判断这个信号,然后向右拐。

回到白线后。

两传感器输出信号为高电平。

小车前进。

如果小车向右偏离白线,左边传感器产生一个低电平,单片机判断这个信号,然后向左拐。

如此如此,小车必不偏离白线。

若小车的两对光电传感器同时输出的信号为高电平(黑底)或低电平(白底),即单片机判断的都为高电平或低电平,小车向前直走,在此过程中(直走)小车若遇白线,小车又重复上面动作跟着白线走。

循迹小车原理

循迹小车原理

循迹小车原理
循迹小车是一种智能机器人,通过感应地面上的黑线来实现自主导航。

它具有一组红外线传感器,安装在车体底部。

这些传感器能够感知地面上的线路情况,判断车子应该如何行驶。

循迹小车的工作原理是基于光电传感技术。

当小车上的传感器感受到黑线时,光电传感器就会产生信号。

这些信号通过控制系统进行处理,确定小车的行驶方向。

如果传感器感受到较亮的地面,即没有黑线的区域,控制系统会判断小车偏离了轨迹,并做出相应的调整。

为了确保精确的导航,循迹小车的传感器通常安装在车体的前部和底部,使其能够更好地感知地面上的线路。

此外,传感器之间的距离也很重要,它们应该能够覆盖整个车体宽度,以确保车子能够准确地行驶在黑线上。

循迹小车的控制系统通过对传感器信号的分析来判断车子的行驶方向。

当传感器感知到线路时,控制系统会发出信号,控制电机转动,使车子朝着正确的方向行驶。

如果传感器感知不到线路,或者线路出现了间断,控制系统会做出相应的调整,使车子重新找到正确的线路。

循迹小车是一种简单而有效的机器人,它在许多领域都有广泛的应用。

例如,它可以用于仓库自动化,实现货物的自动运输;也可以用于工业生产线,实现物品的自动装配。

总的来说,循迹小车通过光电传感技术,能够自主导航,实现精确的线路行驶。

循迹小车原理

循迹小车原理

循迹小车原理
循迹小车是一种机器人,它利用视觉,红外,激光等方式来检测它面前的环境,并自动控制它的运动路径。

循迹小车一般由电动推进装置、车底传感器、电源驱动以及控制器等部分组成。

循迹小车的原理非常简单,具体如下:首先,控制器会根据车底的传感器检测出小车的位置及其与路线的距离。

其次,控制器根据路线中的黑白两色瓷砖之间的强度差,经过比较确定出当前的小车的方向,然后通过PWM把电机的速度控制在某一水平,最终使小车前往指定的方向。

综上,循迹小车的原理基于红外传感器,它可以根据环境中路线黑白瓷砖之间的强度差控制小车的速度和方向,从而实现自动控制小车的行走路线。

有了循迹小车,我们可以探索出更多有趣的机器人应用,使机器人以及自动控制更加智能。

循迹小车的主要优势在于它的简单性和可靠性,也就是说它可以准确的检测出路线的黑白瓷砖,可以适应各种环境,而且可以避免路线走形,能够不断地调整自身的运动轨迹。

另外,循迹小车的结构也相当的简单,其主要包括电机、传感器、控制器以及电源等,而且可以根据需要添加其他元件,增强系统的功能、增强机器人的智能化程度。

因此,循迹小车是目前受到越来越多人关注的机器人技术之一,它不仅可以解决自动控制的问题,也能够为多种机器人应用提供基础技术。

它的简单性、可靠性以及可扩展性使它在机器人行业获得了普
及,而且还在不断进行改进和发展。

循迹小车原理

循迹小车原理

循迹小车原理循迹小车(LineTrackingCar)是一种由电机驱动的机器人的智能小车,用来完成自动驾驶任务。

它的基本原理是通过传感器检测光线反射强度,再通过算法来控制电机运转,从而实现无人自动导航。

因此,其主要技术要素为,传感器、光强度检测框架、运动控制算法和运动系统组件等。

循迹小车的传感器循迹小车使用的传感器主要有光敏电阻、红外传感器、超声波传感器、电眼传感器等,其中光敏电阻是最常用的一种传感器。

它能够感知反射光强度的变化,从而实现循迹小车的运动。

它的信号线由电路芯片组成,并且能够将电压转换为电信号,并由电路板传递到主控单元,最终由控制系统进行处理。

循迹小车的光强度检测框架光强度检测框架是循迹小车机器人运动控制中很重要的一个环节,它将传感器探测到的光强度变化转换为特定的数值,用于控制小车的行走方向和方式。

在做光强度检测框架时,可以根据小车设计的参数,确定路径中的若干个固定点,可以将这些点进行编号,再按照特定的顺序进行检测,如:采用从底部到顶部的方式,进行依次检测,可以有效地完成小车的路径规划。

循迹小车的运动控制算法运动控制算法是循迹小车中重要组成部分,它是控制小车机器人运动的核心算法,用于确定小车运动的方向和动作,从而实现跟随路径的行走。

常见的循迹小车控制算法有老鼠算法,动态规划算法,RANSAC算法,模糊控制算法,改进的蚁群算法等。

老鼠算法,是一种使用机器人的最简单的算法,基本思想是通过不断的前行,然后再根据所遇到的环境做出右转或左转的决策。

动态规划算法,是一种贪心算法,它计算每一步直接决策,以实现最优解。

RANSAC算法,是一种基于概率的算法,它基于模型快速迭代采样,以找出有效数据并通过迭代重新估计参数。

模糊控制算法,是一种数学分析技术,它将概率和关联度结合起来,以实现模糊决策。

改进的蚁群算法,是一种基于智能的算法,它基于人类的行为,以实现小车路径的优化。

循迹小车的运动系统组件运动系统组件是循迹小车机器人的控制系统的重要组成部分,它包括:电机控制器、电机驱动器、轮胎组件和电源组件等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

小车循迹原理2009-07-11 12:401.小车控制及驱动单元的选择此部分是整个小车的大脑,是整个小车运行的核心部件,起着控制小车所有运行状态的作用。

通常选用单片机作为小车的核心控制单元,本文以台湾凌阳公司的SPCE061A单片机为例予以介绍。

SPCE061是一款拥有2K RAM、32KFlash、32 个I/O 口,并集成了AD/DA功能强大的16位微处理器,它还拥有丰富的语音处理功能,为小车的功能扩展提供了相当大的空间。

只要按照该单片机的要求对其编制程序就可以实现很多不同的功能。

小车驱动电机一般利用现成的玩具小车上的配套直流电机。

考虑到小车必须能够前进、倒退、停止,并能灵活转向,在左右两轮各装一个电机分别进行驱动。

当左轮电机转速高于右轮电机转速时小车向右转,反之则向左转。

为了能控制车轮的转速,可以采取PWM调速法,即由单片机的IOB8、IOB9输出一系列频率固定的方波,再通过功率放大来驱动电机,在单片机中编程改变输出方波的占空比就可以改变加到电机上的平均电压,从而可以改变电机的转速。

左右轮两个电机转速的配合就可以实现小车的前进、倒退、转弯等功能。

2.小车循迹的原理这里的循迹是指小车在白色地板上循黑线行走,通常采取的方法是红外探测法。

红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。

单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。

红外探测器探测距离有限,一般最大不应超过15cm。

对于发射和接收红外线的红外探头,可以自己制作或直接采用集成式红外探头。

(1)自制红外探头电路如图1所示,红外光的发送接收选用型号为ST168的对管。

当小车在白色地面行驶时,装在车下的红外发射管发射红外线信号,经白色反射后,被接收管接收,一旦接收管接收到信号,那么图中光敏三极管将导通,比较器输出为低电平;当小车行驶到黑色引导线时,红外线信号被黑色吸收后,光敏三极管截止,比较器输出高电平,从而实现了通过红外线检测信号的功能。

将检测到的信号送到单片机I/O口,当I/O口检测到的信号为高电平时,表明红外光被地上的黑色引导线吸收了,表明小车处在黑色的引导线上;同理,当I/O口检测到的信号为低电平时,表明小车行驶在白色地面上。

此种方法简单,价格便宜,灵敏度可调,但是容易受到周围环境的影响,特别是在图1较强的日光灯下,对检测到的信号有一定的影响。

(2)集成式红外探头可以采用型号为E3F-DS10C4集成断续式光电开关探测器,它具有简单、可靠的工作性能,只要调节探头上的一个旋钮就可以控制探头的灵敏度。

该探头输出端只有三根线(电源线、地线、信号线),只要将信号线接在单片机的I/O 口,然后不停地对该I/O口进行扫描检测,当其为高电平时则检测到白纸,当为低电平时则检测到黑线。

此种探头还能有效地防止普通光源(如日光灯等)的干扰。

其缺点则是体积比较大,占用了小车有限的空间。

3.红外探头的安装在小车具体的循迹行走过程中,为了能精确测定黑线位置并确定小车行走的方向,需要同时在底盘装设4个红外探测头,进行两级方向纠正控制,提高其循迹的可靠性。

这4个红外探头的具体位置如图2所示。

图中循迹传感器共安装4个,全部在一条直线上。

其中InfraredMR与InfraredML 为第一级方向控制传感器,InfraredSR 与InfraredSL 为第二级方向控制传感器。

小车行走时,始终保持黑线(如图2 中所示的行走轨迹黑线)在InfraredMR和InfraredML这两个第一级传感器之间,当小车偏离黑线时,第一级探测器一旦探测到有黑线,单片机就会按照预先编定的程序发送指令给小车的控制系统,控制系统再对小车路径予以纠正。

若小车回到了轨道上,即4个探测器都只检测到白纸,则小车会继续行走;若小车由于惯性过大依旧偏离轨道,越出了第一级两个探测器的探测范围,这时第二级动作,再次对小车的运动进行纠正,使之回到正确轨道上去。

可以看出,第二级方向探测器实际是第一级的后备保护,从而提高了小车循迹的可靠性。

4.软件控制其程序控制框图如图3。

小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O或者InfraredSL(左面第二级传感器)探测到黑线,即小车左半部分压到黑线,车身向右偏出,此时应使小车向左转;如果是InfraredMR(右面第一级传感器)或InfraredSR(右面第二级传感器)探测到了黑线,即车身右半部压住黑线,小车向左偏出了轨迹,则应使小车向右转。

在经过了方向调整后,小车再继续向前行走,并继续探测黑线重复上述动作。

由于第二级方向控制为第一级的后备,则两个等级间的转向力度必须相互配合。

第二级通常是在超出第一级的控制范围的情况下发生作用,它也是最后一层保护,所以它必须要保证小车回到正确轨迹上来,则通常使第二级转向力度大于第一级,即level2>level1(level1、level2为小车转向力度,其大小通过改变单片机输出的占空比的大小来改变),具体数值在实地实验中得到。

专家点评:根据本文所讲述的方法,我们可以较容易地做出按照一定轨迹行走的智能电动小车。

但是按照该方法行走的小车如果是走直线,有可能会是蛇形前进。

为了使小车能够按轨迹行走的更流畅,可以在软件编程时运用一些简单的算法。

例如,在对小车进行纠偏时,适当提前停止纠偏,而不要等到小车完全不偏时再停止,以防止小车的过冲。

电源电路:由于本系统需要电池供电,我们考虑了如下几种方案为系统供电。

方案1:采用10节1.5V干电池供电,电压达到15V,经7812稳压后给支流电机供电,然后将12V电压再次降压、稳压后给单片机系统和其他芯片供电。

但干电池电量有限,使用大量的干电池给系统调试带来很大的不便,因此,我们放弃了这种方案。

方案2:采用3节4.2V可充电式锂电池串联共12.6V给直流电机供电,经过7812的电压变换后给支流电机供电,然后将12V 电压再次降压、稳压后给单片机系统和其他芯片供电。

锂电池的电量比较足,并且可以充电,重复利用,因此,这种方案比较可行。

但锂电池的价格过于昂贵,使用锂电池会大大超出我们的预算,因此,我们放弃了这种方案。

方案3:采用12V蓄电池为直流电机供电,将12V电压降压、稳压后给单片机系统和其他芯片供电。

蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。

虽然蓄电池的体积过于庞大,在小型电动车上使用极为不方便,但由于我们的车体设计时留出了足够的空间,并且蓄电池的价格比较低。

因此我们选择了此方案。

综上考虑,我们选择了方案3。

这个黑呼呼的东西,让我们可爱的小车变得很难看。

稳压模块:方案1:采用两片7812将电压稳压至12V后给直流电机供电,然后采用一片7809将电压稳定至9V,最后经7805将电压稳至5V,给单片机系统和其他芯片供电,但7809和7805压降过大,使7809和7805消耗的功率过大,导致7809和7805发热量过大,因此,我们放弃了这种方案。

方案2:采用两片7812将电压稳压至12V后给直流电机供电,然后采用2576将电压稳至5V。

2576的输出电流最大可至3A,完全满足系统要求。

综上考虑,我们选择了方案2。

稳压模块如下图:(左图:稳压模块)循迹传感器模块方案1:用光敏电阻组成光敏探测器。

光敏电阻的阻值可以跟随周围环境光线的变化而变化。

当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。

因此光敏电阻在白线和黑线上方时,阻值会发生明显的变化。

将阻值的变化值经过比较器就可以输出高低电平。

但是这种方案受光照影响很大,不能够稳定的工作。

因此我们考虑其他更加稳定的方案。

方案2:用红外发射管和接收管自己制作光电对管寻迹传感器。

红外发射管发出红外线,当发出的红外线照射到白色的平面后反射,若红外接收管能接收到反射回的光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电平。

这样自己制作组装的寻迹传感器基本能够满足要求,但是工作不够稳定,且容易受外界光线的影响,因此我们放弃了这个方案。

方案3:用RPR220型光电对管。

RPR220是一种一体化反射型光电探测器,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。

RPR220采用DIP4封装,其具有如下特点:•塑料透镜可以提高灵敏度。

•内置可见光过滤器能减小离散光的影响。

•体积小,结构紧凑。

•当发光二极管发出的光反射回来时,三极管导通输出低电平。

此光电对管调理电路简单,工作性能稳定。

此我们选择了方案3。

安装后效果如下图:下图是电压比较器:电设小车循迹模块2007-10-14 14:06//包含所需头文件#include <ioM16v.h>#include <macros.h>#include"time1_init.h"#include"motor.h"#define ahead 1#define backwards 0#define compare(x,y) (x<y?1:0)#define mid 0X17/*****************************初始化函数********************************///端口初始化void port_init(void){PORTA = 0x00;DDRA = 0x00;PORTB = 0x00;DDRB = 0x08;PORTC = 0x00;DDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}void timer0_init(void)TCCR0 = 0x00;//停止定时器TCNT0 = 0x00;//初始值OCR0 = 0x17;//匹配值TIMSK |= 0x00;//中断允许TCCR0 = 0x7D;//启动定时器}void adc_init(void){//adc转换初始化ADCSRA = 0x00; //禁止AD转换ADCSRA|=BIT(ADIF);ADMUX=0X46;SFIOR |= 0x00;ACSR = 0x80; //禁止模拟比较器ADCSRA = 0xE7;}void init_devices(void){CLI(); //禁止所有中断MCUCR = 0x00;MCUCSR = 0x80;//禁止JTAGGICR = 0x00;port_init();timer0_init();timer1_init();adc_init();SEI();//开全局中断}/**********************************************************************//*****选择前端传感器用uchar start_head_sensor(void)*****************************选择后端传感器用uchar start_back_sensor(void)/*****使用角度传感器用uint cord_sensor(void)********************************************/uintsensor_head[3],sensor_back[3],cord; //存储6个传感器AD转换的值uchar offset ; //黑线偏移小车中心轴的距离uint sensor_compare_head[3]={300,300,300},sensor_compare_back[3]={300,300,300}; //判断黑线是否位于传感器下的阈值uchar start_head_sensor(void){uchar i,j=0,sum=0;ADMUX=0X40;ADCSRA=0xC7;while(ADCSRA&BIT(ADSC));for(i=0;i<3;i++){ADMUX=0X40+i; //启用前端传感器0,1,2通道ADCSRA=0xC7;while(ADCSRA&BIT(ADSC));sensor_head[i]=ADC;}for(i=3;i;i--){if(compare(sensor_head[i-1],sensor_compare_head[i-1])){sum+=i-1;j++;}if(j)offset=sum*2/j;ADMUX=0X46;ADCSRA=0xE7;return offset;}uchar start_back_sensor(void){uchar i,j=0,sum=0;ADMUX=0X43;ADCSRA=0xC7;while(ADCSRA&BIT(ADSC));for(i=0;i<3;i++){ADMUX=0X43+i; //启用前端传感器0,1,2通道ADCSRA=0xC7;while(ADCSRA&BIT(ADSC));sensor_back[i]=ADC;}for(i=3;i;i--){if(compare(sensor_back[i-1],sensor_compare_back[i-1])){sum+=i-1;j++;}}if(j)offset=sum*2/j;ADMUX=0X46;ADCSRA=0XE7;return offset;}//角度传感器滤波函数uint cord_sensor(void){uchar i;uint max=0,min=1023,sum=0;for(i=0;i<5;i++){ADCSRA|=BIT(ADIF);while(!(ADCSRA&BIT(ADIF)));cord=ADC;sum+=cord;max=(max>cord)?max:cord;min=(min<cord)?min:cord;}return (sum-max-min)/3;}void direc_ctrl(uchar x,uchar y){if(y){if(x==0)OCR0=mid+3;if(x==4)OCR0=mid-3;if(x==2) OCR0=mid;}else OCR0=mid+x-2;}void menmber_path(void){uint max_head[3]={0,0,0},min_head[3]={1023,1023,1023},max_back[3]={0,0,0},min_back[3]={1023,1023,1023};for(i=4000;i;i--){start_head_sensor();for(j=0;j<3;j++){max_head[j]=(max_head[j]>sensor_head[j])?max_head[j]:sensor_head[j];min_head[j]= (min_head[j]<sensor_head[j])?min_head[j]:sensor_head[j];}start_back_sensor();for(j=0;j<3;j++){max_back[j]=(max_back[j]>sensor_back[j])?max_back[j]:sensor_back[j];min_back[j]= (min_back[j]<sensor_back[j])?min_back[j]:sensor_back[j];}}for(j=0;j<3;j++){sensor_compare_head[j]=(max_head[j]+min_head[j])/2;sensor_compare_back[j]=(max_back[j]+min_back[j])/2;}}/***********************前端同时检测到黑线判断函数****************************************/uchar head_sensor_all(void){start_head_sensor();if( compare(sensor_head[0], sensor_compare_head[0]) && compare(sensor_head[1], sensor_compare_head[1]) && compare(sensor_head[2], sensor_compare_head[2]))return 1;elsereturn 0;}uchar back_sensor_all(void){start_back_sensor();if( compare(sensor_back[0], sensor_compare_back[0]-30) && compare(sensor_back[1],sensor_compare_back[1]-30) && compare(sensor_back[2], sensor_compare_back[2]-30))return 1;elsereturn 0;}/**********************前端循迹函数**************************************************/void search_path_ahead(uchar speed){motor_autorun(ahead,speed);while(1){if(head_sensor_all()){motor_stop();return;}else{direc_ctrl(offset,1);}}}/**********************后端循迹函数*******************************************/void search_path_backward(uchar speed)motor_autorun(0,speed);while(1){if(back_sensor_all()){motor_stop();return;}elsedirec_ctrl(offset,0);}}#include<reg51.h>#define TH0_TL0 (65536-1000)//设定中断的间隔时长unsigned char count0 = 0;unsigned char count1 = 0;bit Flag = 1;//电机正反转标志位,1正转,0反转sbit Key_add=P1 ^ 4; //电机减速sbit Key_dec=P1 ^ 5; //电机加速sbit Key_turn=P1 ^ 6; //电机换向sbit PWM1=P3^6;//PWM 通道 1sbit PWM2=P3^7;//PWM 通道 2unsigned char Time_delay;//函数声明void Delay(unsigned char x);void Motor_speed_high(void);void Motor_speed_low(void);void Motor_turn(void);void Timer0_init(void);/******************************************************************************/ void Delay(unsigned char x)//延时处理{Time_delay = x;while(Time_delay != 0);}/******************************************************************************/ void Timer0_int(void) interrupt 1 using 1//定时0中断处理{TR0 = 0;TL0 += (TH0_TL0 + 9) % 256;TH0 += (TH0_TL0 + 9) / 256 + (char)CY;TR0 = 1;if(Time_delay != 0)//延时函数用{Time_delay--;}if(Flag == 1)//电机正转{PWM1 = 0;if(++count1 < count0){PWM2 = 1;}elsePWM2 = 0;if(count1 >= 100){count1=0;}}else //电机反转{PWM2 = 0;if(++count1 < count0){PWM1 = 1;}elsePWM1 = 0;if(count1 >= 100){count1=0;}}//反转}/******************************************************************************/{if(Key_add==0){Delay(10);if(Key_add==0){count0 += 5;if(count0 >= 100){count0 = 100;}}while(Key_add == 0);//等待键松开}}/******************************************************************************/ void Motor_speed_low(void)//按键处理减pwm占空比,电机减速{if(Key_dec==0){Delay(10);if(Key_dec==0){count0 -= 5;if(count0 <= 0){count0 = 0;}}while(Key_dec == 0);}}/******************************************************************************/ void Motor_turn(void)//电机正反向控制{if(Key_turn == 0){Delay(10);if(Key_turn == 0){Flag = ~Flag;}while(Key_turn == 0);}}/******************************************************************************/ void Timer0_init(void)//定时器0初始化{TMOD=0x01;TH0=TH0_TL0 / 256;TL0=TH0_TL0 % 256;TR0=1;ET0=1;EA=1;}/******************************************************************************/ void main(void)//主函数{Timer0_init();while(1){Motor_turn();Motor_speed_high();Motor_speed_low();}}上面的太复杂,我来一个://PWM控制LED的亮度,渐灭到渐亮#include<at89x51.h>#define uchar unsigned char;/*************公阴数码管显示数据***************************//*********a_.0 b_.1 c_.2 d_.4 e_.5 f_.6 h_.5 *********/unsigned char leddata[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};void mdelay(unsigned int m); ///m*1ms的延时子程序void disp( unsigned char i ,num); ///显示子函数,在第i个数码管显示内容是num void xianshi(void);////显示主函数。

相关文档
最新文档