智能车部分程序
两轮智能车pwm电机调速程序

/*晶振:11.0592,输出的PWM直接给L298N以驱动电机,通过调节(percent_l = 90;)等号后的数值,与(Sum 100)的比值,为占空比,如上取90比100则输出PWM波占空比为9/10的高电平,1/10的低电平,低电平时间越长则速度越慢。
要注意的是调节#define Sum 100的值可以调节PWM的总周期,调节#define tim 200的值可以调节定时器的定时周期。
*/#include< reg52.h >#define uchar unsigned char#define uint unsigned int#define MOTOR_C P1 //P1口作为电机的控制口。
#define BACK 0xfa //后退,0b1111 1010#define FORWARD 0xf5 //前进,0b1111 0101#define Sum 100 //总周期,为100倍的定时器时间大约27ms #define tim 200 //初值数200约270ussbit PWM_L = P1^0; //左电机前进sbit PWM_R = P1^2; //右电机前进sbit PWM_HL = P1^1; //左电机后退sbit PWM_HR = P1^3; //右电机后退void timer0_init( void ); //定时器0初始化函数。
void timer1_init( void ); //定时器1初始化函数。
void right( void ); //前进右转弯函数。
void left( void ); //前进左转弯函数。
void forward( void ); //前进函数。
void hright(void); //后退右转函数。
void hleft(void); //后退左转函数。
void back(void); //后退函数。
void stop(void); //停止void Delayms(); //延时1msvoid Delay100ms(unsigned int d); //延时100msuchar percent_l = 0; //(前进)左轮占空比。
)智能小车循迹要点

河北联合大学
电气工程学院
生产实习报告
专业自动化
姓名张桂平
学号************ 指导教师沈小伟
2013年7月1日
单片机最小系统
2. 电源模块:
模型车通过自身系统,采集赛道信息,获取自身速度信息,加以处理,由芯片给出指令控制其前进转向等动作,各部分都需要由电路支持,电源管理尤为重要。
在本设计中,51单片机使用5V电源,电机及舵机使用6V电源。
考虑到电源为充电电池组,额定电压为7.2V,实际充满电后电压则为6.5-6.8V,所以单片机及传感器模块采用7805稳压后的5V电源供电,电机直接由电池供电。
3.路面检测电路:
路面检测电路由5对光电发送与接收管组成。
由于路面存在黑色引导线,落在黑线区域内的光电接收管接收到反射的光线的强度与白色的路面不同,进而在光电接收管两端产生不同的电压值,由此判断路线的走向。
传感器模块将当前采集到的一组电压值传递给单片机,进而根据一定的算法对电机进行控制,使小车自动寻线行走。
下图是路面检测电路图:。
基于Arduino典型传感器智能避障小车的设计开发

0&0&0&0&0&0&0©0令0°0j设计与开发II I0&0&0&0©0°0&0&0°0&0基于Arduino典型传感器智能避障小车的设计开发付晓云(沈阳理工大学机械工程学院实验中心沈阳110159)摘要以Arduino UNO开发板为核心,以红外传感器、超声波传感器、电机、车轮等外部固件,小车能实现自主避障的功能,该装置通过红外传感器监控,经由Arduino处理器处理,控制智能避障小车躲避障碍。
主要讨论以Arduino UNO开发板为核心的超声避障小车制作过程,它是由4个直流电机和L298n电机驱动模块控制行驶方向,辅以舵机和超声波传感器组成的超声避障模块实现避障功能,用Arduino IDE编程软件编写总体程序。
智能避障小车具有实际意义,在一些非常危险的情况下它能够代替人进行工作;特别是避障小车的探测功能,在抗震救灾中能够起到极大的作用。
关键词Arduino IDE Arduino UNO智能避障小车智能车领域以美国、意大利、法国等国家处于领先地位,在智能车领域有着一系列研究成果。
车辆与控制人员之间能够进行信息交流利用的是无线电及光缆技术,操作人员可以根据反馈的信息远程遥控车辆。
与上述这些在智能车领域处于前沿的国家相比,我国在智能车方面的起步比较晚,但目前也取得了很大进步,清华大学研制的“THMR-V”的智能车就是其中之一。
“THMR-V”的智能车能够在标准路面自动追踪车道线,在复杂的路面能够根据实际情况自行避障。
但此智能车也有不足,只能在结构化道路上画有清晰白线处进行车道跟踪。
国防科技大学在车辆的自动驾驶技术方面起步较早,CITAVT系列无人驾驶车是其主要的研究成果,其中CITAVT-IV型视觉导航自主车的主要目标是研究在结构化道路环境下的自主驾驶技术[1]o 此类型无人驾驶车在视觉识别方面有所缺陷,有时不能正确识别道路出口。
遥控智能小车报告

四川省第二届大学生电子设计大赛语音遥控智能小车目录四川省第二届大学生电子设计大赛 (1)语音遥控智能小车 (3)摘要 (3)关键字 (3)(一)引言 (3)(二)设计任务 (3)2.1.基本要求 (3)2.2.扩展部分 (3)(三)硬件部分 (4)3.1.单片机 (4)3.11.单片机选择 (4)3.12.凌阳单片机基本功能简介 (5)3.13.强大的语音功能 (5)3.2.障碍探测模块方案分析与比较 (6)3.21.避障器件选择 (6)3.22 器件放置位置方案选择 (7)3.23 避障方式选择 (7)3.3循线模块设计与比较 (7)3.4.智能小车驱动电路 (8)(四)软件部分 (10)4.1.介绍 (10)4.2.主要使用的函数 (10)(五)调试 (16)5.1硬件的调试 (16)5.2软件的调试 (17)5.3语音训练步骤 (17)(六)结论 (18)6.1.基本功能要求 (18)6.2.发挥部分 (19)参考文献 (19)语音遥控智能小车摘要:本语音智能小车由硬件设计模块与软件设计模块两大模块组成。
硬件设计模块包括后轮驱动电路模块、循线探测模块、障碍物探测模块。
后轮驱动电路主要由L298组成,用于前进、后退、转向控制;循线探测模块利用三个光感元件,对黑色轨道进行寻迹;障碍物探测模块由对两对光电传感器组成,车头一对,车尾一对进行障碍物探测。
软件设计模块能实现智能小车的前进、后退、转向、停止、避障、表演动作以及循线等功能。
本作品以两后轮电动机为主驱动,通过各类传感器件来采集各类信息,送入主控单元SPCE061A单片机,处理数据后完成相应动作,以达到自身控制。
关键字:语音智能控制避障红外线收发循线行驶语音识别(一)引言与机器进行语音交流,让机器明白你说什么,这是人们长期以来梦寐以求的事情。
语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的高技术。
近二十年来,语音识别技术取得显著进步,开始从实验室走向市场。
基于51单片机智能小车(电路+程序+论文)

基于单片机的多功能智能小车设计论文(摘要(关键词:智能车单片机金属感应器霍尔元件 1602LCD)智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。
智能电动车就是其中的一个体现。
本次设计的简易智能电动车,采用AT89S52单片机作为小车的检测和控制核心;采用金属感应器TL-Q5MC来检测路上感应到的铁片,从而把反馈到的信号送单片机,使单片机按照预定的工作模式控制小车在各区域按预定的速度行驶,并且单片机选择的工作模式不同也可控制小车顺着S形铁片行驶;采用霍尔元件A44E检测小车行驶速度;采用1602LCD实时显示小车行驶的时间,小车停止行驶后,轮流显示小车行驶时间、行驶距离、平均速度以及各速度区行驶的时间。
本设计结构简单,较容易实现,但具有高度的智能化、人性化,一定程度体现了智能。
目录1 设计任务 (3)1.1 要求 (3)2 方案比较与选择 (4)2.1路面检测模块 (4)2.2 LCD显示模块 (5)2.3测速模块 (5)2.4控速模块 (6)2.5模式选择模块 (7)3 程序框图 (7)4 系统的具体设计与实现 (9)4.1路面检测模块 (9)4.2 LCD显示模块 (9)4.3测速模块 (9)4.4控速模块 (9)4.5复位电路模块 (9)4.6模式选择模块 (9)5 最小系统图 (10)6 最终PCB板图 (12)7 系统程序 (13)8 致谢 (46)9 参考文献 (47)10 附录 (48)1. 设计任务:设计并制作了一个智能电动车,其行驶路线满足所需的要求。
1.1 要求:1.1.1 基本要求:(1)分区控制:如(图1)所示:(图1)车辆从起跑线出发(出发前,车体不得超出起跑线)。
在第一个路程C~D区(3~6米)以低速行驶,通过时间不低于10s;第二个路程D~E区(2米)以高速行驶,通过时间不得多于4秒;第三个路程E~F区(3~6米)以低速行驶,通过时间不低于10s。
简述智能小车的组成部分

智能小车是一种能够自主运行和执行任务的汽车,它通常由以下几个主要组成部分构成:1. 底盘(Chassis):底盘是智能小车的基本框架,它支撑和承载其他组件。
底盘通常由金属或塑料制成,具有足够的强度和稳定性。
2. 电动机(Electric Motors):电动机是智能小车的动力源,提供驱动力以实现车辆的前进、后退和转向等运动。
智能小车可能搭载一个或多个电动机,其类型可以是直流电机、步进电机或无刷电机等。
3. 传感器(Sensors):传感器是智能小车的感知器官,用于感知周围环境的信息。
常见的传感器包括红外线传感器、超声波传感器、视觉传感器(如摄像头)、陀螺仪、加速度计等。
传感器收集的数据可以用于避障、测距、物体识别等功能。
4. 控制器(Controller):控制器是智能小车的大脑,负责处理传感器的数据,并做出相应的决策和控制。
控制器可以是单片机、微处理器或嵌入式系统,它通过算法和逻辑来控制电动机、传感器和其他组件的操作。
5. 电源系统(Power System):电源系统提供智能小车所需的电能。
它通常由电池组成,可以是干电池、锂电池或者其他可充电电池。
电源系统还可能包括电源管理模块,用于监测和管理电池的充电状态和供电情况。
6. 控制算法和软件(Control Algorithms and Software):控制算法和软件是智能小车的灵魂,它们实现了小车的自主决策和行为控制。
这些算法和软件可以包括路径规划、避障、目标跟踪等功能的实现,通常由程序员编写和优化。
除了以上主要组成部分,智能小车还可以包括其他辅助设备和附件,如车灯、喇叭、蓝牙或Wi-Fi模块等,以增加其功能和交互性。
总而言之,智能小车的组成部分包括底盘、电动机、传感器、控制器、电源系统以及控制算法和软件。
这些组件协同工作,使智能小车能够感知环境、做出决策,并自主地执行各种任务。
智能小车实验报告69844
课程设计报告(嵌入式技术实践(一))学院:电气工程与自动化学院题目:智能小车的电路设计与制作专业班级:自动化123班学号: 21学生姓名:谢斌指导老师: 王祖麟、张振利日期:2013年6月18日星期二摘要我们生活在信息与科技高速发展的信息时代,高科技产品的更新的换代也是越来越快.作为21世纪的大学生,我们身处这样的环境中,就必须使自己能够适应这个社会所需.自动化作为处在科技前沿的专业,我们学生就要打好基础,跟上时代的步伐.为了让同学们在做中学.同学们自己设计和制作智能小车,并从中深入了解和理解自动化嵌入式.从而为进一步实现人机对话,测量以及控制这些自动化的基本控制做基础。
从理论到实践,让同学们更好的理解嵌入式,增长同学的实践和设计能力。
应用P89V51RB2微控制器中端口、外部中断、定时器等基本模块,实现核心控制,再结合驱动板来控制电机的转速、转向,最后加上红外传感器,实现小车的智能寻迹。
其中端口结合SPI实现人机对话;定时器与中断结合实现匹配定时,捕获转速;端口、定时器的结合就实现了控制电机的方向与转速;端口与红外传感器结合,让小车可以寻找黑线,这样就实现了智能寻迹。
关键字:自动化;嵌入式;智能寻迹;实践;外部中断;定时器;能力目录第一章绪论 (5)1。
1 课题背景 (5)1。
2 课题概述 (5)1。
3 设计要求 (5)第二章统的系设计 (6)2.1 实践原理 (6)2.2 实践器材 (6)2。
3 实践目的 (7)第三章软件设计 (8)3。
1 硬件开发的软件介绍 (8)3.1。
1 TKStudio................................................................错误!未定义书签。
3。
1.2 原理图的绘制过程 ..........................................错误!未定义书签。
3。
2 编程环境介绍 (9)第四章系统实现 (9)4。
基于单片机的智能小车控制
信息工程专业课程设计(二)题目基于《STC89C52》单片机的智能小车姓名学号所在院系所在班级完成时间基于单片机的智能小车摘要:智能化作为现代电子产品的新趋势,是今后的电子产业的发展方向。
智能化设计的电子产品可以按照预先设定的模式在一个环境里自动运作,不需要人为的管理,可应用于科学勘探、环境监测、智能家居等方面。
基于单片机的智能小车控制就是其中的一个体现。
本设计实现了一种基于51单片机的按键操作控制和温度检测显示系统,通过温度传感器采集温度数据并且通过显示模块显示出来,通过对按键的操作,自动控制转向电机转向,改变行驶方向。
本课题设计的智能小车,具有按键控制前后左右的功能,温度采集功能,液晶显示功能。
序言 (1)第1章总体设计方案 (2)1.1课题任务分析 (2)1.2 方案论证 (3)1.2.1小车驱动部分 (3)1.2.2 温度显示部分 (3)第2章系统硬件构成 (4)2.1系统设计原理 (4)2.2主要元器件简介 (4)2.2.1 STC89C52RC简介 (4)2.2.2 液晶显示电路 (5)2.2.3 L298N芯片直流电机驱动模块 (6)2.2.4遥控部分独立按键电路 (7)第3章软件的设计与说明 (8)3.1软件设计 (8)3.2软件的说明 (9)3.2.1 控制部分主程序流程 (9)3.2.2 温度检测显示部分主程序流程图 (10)第4章调试与总结 (12)4.1 调试的总结 (12)参考文献 (13)致谢 (14)附录 (15)附件1 L298N电机驱动模块 (15)附件2 小车侧视图 (16)附件3 小车俯视图 (16)附件4 小车最终硬件图 (17)附件5 程序清单 (18)序言随着我国科学技术的进步,智能化和自动化技术越来越普及,各种高科技也广泛应用于智能小车和机器人玩具制造领域,使智能机器人越来越多样化。
智能小车是一个多种高新技术的集成体,它融合了机械、电子、传感器、计算机硬件、软件、人工智能等许多学科的知识,涉及到当今许多前沿领域的技术[1]。
智能车辆的车身控制系统
案例四:智能公交车的安全与舒适性控制
总结词
通过对智能公交车的安全与舒适性控制系统的设计和 实现进行深入探讨,提出了一种基于传感器融合和数 据挖掘技术的智能公交车安全与舒适性控制系统方案 。
详细描述
该方案包括车辆运行状态监测系统、乘客行为监测系统 、安全预警系统、舒适性控制系统等模块。车辆运行状 态监测系统通过对车辆的运行状态进行实时监测,为安 全预警系统和舒适性控制系统提供数据支持;乘客行为 监测系统通过视频监控和数据分析,实现对乘客行为的 监测和预警;安全预警系统通过数据挖掘和机器学习等 技术,实现对车辆安全隐患的预警和报警;舒适性控制 系统则通过对车辆内部环境的调节和控制,提高乘客的 乘坐舒适度。
电动化程度更高
电池技术的进步
随着电池技术的不断进步,未来的智能车辆将具备更长的续航里 程和更快的充电速度。
电动驱动系统的发展
电动驱动系统的发展将提高智能车辆的动力性能和能效。
智能化能源管理
通过智能化能源管理,实现电池荷电状态预测、充电策略优化等 功能,提高能源利用效率。
共享化程度更高
自动驾驶出租车
06
析
案例一:自动驾驶汽车的控制策略
总结词
通过分析自动驾驶汽车的控制系统,探讨了 自动驾驶汽车在行驶过程中如何实现稳定控 制、避障、路径规划等关键技术。
详细描述
自动驾驶汽车在行驶过程中需要实现稳定控 制、避障、路径规划等技术,这些技术的实 现需要通过传感器、控制器等设备进行信息 采集、处理和决策。其中,稳定控制需要考 虑车辆的动力学模型和行驶环境,避障需要 考虑障碍物的位置、大小和速度等信息,路 径规划需要考虑行驶路径的最优选择和实时
提高传感器精度
总结词
提升感知能力
飞思卡尔智能车完整程序
#include <hidef.h> /* common defines and macros */#include <mc9s12dg128.h> /* derivative information */ #include "lib.c"#include "funtion.h"#pragma LINK_INFO DERIV ATIVE "mc9s12dg128b"void s_ini(void) //系统初始化{uchar tmp;SYNR=3;REFDV=1;PLLCTL=0x50;delay(100);CLKSEL|=0x80; //超频到48M, 总线24M// INITRG = 0x00; /* lock registers block to 0x0000 */// INITRM = 0x39; /* lock Ram to end at 0x3FFF */// INITEE = 0x09; /* lock EEPROM block to end at 0x0fff */ delay(100);PORTB=0xff;DDRB=0xff;DDRA=0x00; //A口设置为输入PTH=0x00;DDRH=0x68; //PH1=inputPERH=0x97; //enable pullPPSH=0x80; //PH7,PH6,PH5 pull up, PH4 pull down PIEH=0x00; //使能遥控中断PH7PTP =0x00;DDRP=0x30; //PP4,PP5 outputDDRA=0x00;PUCR=0x01; //Port A enable pull upPTJ=0x00;DDRJ=0x00;PERJ=0x00; //diable pullPPSJ=0x80;PIEJ=0xc0; //enable PJ interruptPTT=0x00;DDRT=0x00; //PT7-PT4 =inputPERT=0x40; //enable pull for PT6// PACN3=0x00;// PACN2=0x00;// PACTL=0x40; //enable pulse couter B// DL YCT=0x00; //TIOS=0x80; //ch 7 compare modeOC7M=0x00;OC7D=0x00;// PACTL=0x74;TSCR2=0x0f; //when ch7 compare rst pre div =128 TC7=50000; //timer for 200mS //*/TSCR1=0x80; //enable timerTCTL1=0x00;TCTL2=0x00;TCTL3=0x20;TCTL4=0x00; //通道6下降沿输入捕捉TIE =0xC0; //中断使能ini_at45(); //初始化SPI0PWME=0xc3; //enable ch1, ch7PWMPOL=0xc3; //high level effectPWMDTY6=(uchar)(3000>>8);PWMDTY7=(uchar)(3000&0x00ff); //占空比PWMPER6=(uchar)(40000>>8); // 舵机PWMPER7=(uchar)(40000&0x00ff); //周期PWMDTY0=(uchar)(0>>8);PWMDTY1=(uchar)(0&0x00ff); //占空比// PWMPER0=(uchar)(2000>>8); //电机PWMPER1=(uchar)(2000&0x00ff); //周期PWMCLK=0x00;PWMPRCLK=0x40; //SB=Fck/1 SA=Fck/8PWMCTL=0x90; //4_16 bit PWM //*/SCI0BDH=0; //串口0初始化SCI0BDL=35; //set bandrate=57600bpsSCI0CR1=0x00;SCI0CR2=0x2c; //enable to sent and receivetmp=SCI0SR1;A TD0CTL2=0xc0; //enable ATD, interruptA TD0CTL3=0x08;A TD0CTL4=0x80; //8bit,A TD1CTL2=0xc0; //enable ATD, interruptA TD1CTL3=0x08;A TD1CTL4=0x80; //8bit,A TD0DIEN=0x00; //AD口数字输入使能,使能CCD输入A TD1DIEN=0x80; //CCD二元输入ECLKDIV=0x5C; //EEPROM时钟分频器INTCR=0xc0; //行同步中断, 下降沿触发,delay(10);SE_s; //舵机供电}interrupt 20 void sci0(void) //SCI0 interrupt{uchar sta,das;sta=SCI0SR1; //read the statedas=SCI0DRL;if(sta&0x40) //sent finish{}if(sta&0x20) //receve a data{speed(das*8);SCI0DRL=das;}}interrupt 15 void ch7(void) //ch7 interrupt 266mS {TFLG1=0x80; //clr flagif(m_en) //LED falshPORTB^=0xf0;}void choice(void) //choice a funtion{uchar kv;uchar pp=0;uchar tmp=0;V1: kv=0;wu(CN1[0],CN1[1],CN1[2],CN1[3]); //displayset(2);go(0,pp); //flashfor(;;) //loop{kv=key();if(kv==5&&pp) //lastpp--,go(0,pp);else if(kv==6&&pp<3) //nextpp++,go(0,pp);if(kv==8||kv==10) //enter{if(pp==0) //进入比赛{match();goto V1;}else if(pp==1) //传感受器测方式{text();goto V1;}else if(pp==2) //CCD 测试{t_ccd();goto V1;}else if(pp==3) //参数设定{setting();goto V1;}} //*/}}void main(void) {/* put your own code here */volatile uint t1=0;s_ini(); //系统初始化EnableInterrupts;get_s(); //获取设定参数choice(); //shoicefor(;;) {} /* wait forever *//* please make sure that you never leave this function */ }/****************************************************************************** FILE : datapage.cPURPOSE : paged data access runtime routinesMACHINE : Freescale 68HC12 (Target)LANGUAGE : ANSI-CHISTORY : 21.7.96 first version created******************************************************************************/#include "hidef.h"#include "non_bank.sgm"#include "runtime.sgm"#ifndef __HCS12X__ /* it's different for the HCS12X. See the text below at the #else // __HCS12X__ *//*According to the -Cp option of the compiler the__DPAGE__, __PPAGE__ and __EPAGE__ macros are defined.If none of them is given as argument, then no page accesses should occur andthis runtime routine should not be used !To be on the save side, the runtime routines are created anyway.If some of the -Cp options are given an adapted versions which only covers theneeded cases is produced.*//* if no compiler option -Cp is given, it is assumed that all possible are given : *//* Compile with option -DHCS12 to activate this code */#if defined(HCS12) || defined(_HCS12) || defined(__HCS12__) /* HCS12 family has PPAGE register only at 0x30 */#define PPAGE_ADDR (0x30+REGISTER_BASE)#ifndef __PPAGE__ /* may be set already by option -CPPPAGE */#define __PPAGE__#endif/* Compile with option -DDG128 to activate this code */#elif defined DG128 /* HC912DG128 derivative has PPAGE register only at 0xFF */#define PPAGE_ADDR (0xFF+REGISTER_BASE)#ifndef __PPAGE__ /* may be set already by option -CPPPAGE */#define __PPAGE__#endif#elif defined(HC812A4)/* all setting default to A4 already */#endif#if !defined(__EPAGE__) && !defined(__PPAGE__) && !defined(__DPAGE__)/* as default use all page registers */#define __DPAGE__#define __EPAGE__#define __PPAGE__#endif/* modify the following defines to your memory configuration */#define EPAGE_LOW_BOUND 0x400u#define EPAGE_HIGH_BOUND 0x7ffu#define DPAGE_LOW_BOUND 0x7000u#define DPAGE_HIGH_BOUND 0x7fffu#define PPAGE_LOW_BOUND (DPAGE_HIGH_BOUND+1)#define PPAGE_HIGH_BOUND 0xBFFFu#define REGISTER_BASE 0x0u#ifndef DPAGE_ADDR#define DPAGE_ADDR (0x34u+REGISTER_BASE)#endif#ifndef EPAGE_ADDR#define EPAGE_ADDR (0x36u+REGISTER_BASE)#endif#ifndef PPAGE_ADDR#define PPAGE_ADDR (0x35u+REGISTER_BASE)#endif/*The following parts about the defines are assumed in the code of _GET_PAGE_REG :- the memory region controlled by DPAGE is above the area controlled by the EPAGE andbelow the area controlled by the PPAGE.- the lower bound of the PPAGE area is equal to be the higher bound of the DPAGE area + 1*/#if EPAGE_LOW_BOUND >= EPAGE_HIGH_BOUND || EPAGE_HIGH_BOUND >= DPAGE_LOW_BOUND || DPAGE_LOW_BOUND >= DPAGE_HIGH_BOUND || DPAGE_HIGH_BOUND >= PPAGE_LOW_BOUND || PPAGE_LOW_BOUND >= PPAGE_HIGH_BOUND#error /* please adapt _GET_PAGE_REG for this non default page configuration */#endif#if DPAGE_HIGH_BOUND+1 != PPAGE_LOW_BOUND#error /* please adapt _GET_PAGE_REG for this non default page configuration */#endif/* this module does either control if any access is in the bounds of the specified page or *//* ,if only one page is specified, just use this page. *//* This behavior is controlled by the define USE_SEVERAL_PAGES. *//* If !USE_SEVERAL_PAGES does increase the performance significantly *//* NOTE : When !USE_SEVERAL_PAGES, the page is also set for accesses outside of the area controlled *//* by this single page. But this is should not cause problems because the page is restored to the old value before any other access could occur */#if !defined(__DPAGE__) && !defined(__EPAGE__) && !defined(__PPAGE__)/* no page at all is specified *//* only specifying the right pages will speed up these functions a lot */#define USE_SEVERAL_PAGES 1#elif defined(__DPAGE__) && defined(__EPAGE__) || defined(__DPAGE__) && defined(__PPAGE__) || defined(__EPAGE__) && defined(__PPAGE__)/* more than one page register is used */#define USE_SEVERAL_PAGES 1#else#define USE_SEVERAL_PAGES 0#if defined(__DPAGE__) /* check which pages are used */#define PAGE_ADDR PPAGE_ADDR#elif defined(__EPAGE__)#define PAGE_ADDR EPAGE_ADDR#elif defined(__PPAGE__)#define PAGE_ADDR PPAGE_ADDR#else /* we do not know which page, decide it at runtime */#error /* must not happen */#endif#endif#if USE_SEVERAL_PAGES /* only needed for several pages support *//*--------------------------- _GET_PAGE_REG --------------------------------Runtime routine to detect the right register depending on the 16 bit offset partof an address.This function is only used by the functions below.Depending on the compiler options -Cp different versions of _GET_PAGE_REG are produced.Arguments :- Y : offset part of an addressResult :if address Y is controlled by a page register :- X : address of page register if Y is controlled by an page register- Zero flag cleared- all other registers remain unchangedif address Y is not controlled by a page register :- Zero flag is set- all registers remain unchanged--------------------------- _GET_PAGE_REG ----------------------------------*/#if defined(__DPAGE__)#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEstatic void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */__asm {L_DPAGE:CPY #DPAGE_LOW_BOUND ;// test of lower bound of DPAGE#if defined(__EPAGE__)BLO L_EPAGE ;// EPAGE accesses are possible#elseBLO L_NOPAGE ;// no paged memory below accesses#endifCPY #DPAGE_HIGH_BOUND ;// test of higher bound DPAGE/lower bound PPAGE#if defined(__PPAGE__)BHI L_PPAGE ;// EPAGE accesses are possible#elseBHI L_NOPAGE ;// no paged memory above accesses#endifFOUND_DPAGE:LDX #DPAGE_ADDR ;// load page register address and clear zero flagRTS#if defined(__PPAGE__)L_PPAGE:CPY #PPAGE_HIGH_BOUND ;// test of higher bound of PPAGEBHI L_NOPAGEFOUND_PPAGE:LDX #PPAGE_ADDR ;// load page register address and clear zero flagRTS#endif#if defined(__EPAGE__)L_EPAGE:CPY #EPAGE_LOW_BOUND ;// test of lower bound of EPAGEBLO L_NOPAGECPY #EPAGE_HIGH_BOUND ;// test of higher bound of EPAGEBHI L_NOPAGEFOUND_EPAGE:LDX #EPAGE_ADDR ;// load page register address and clear zero flagRTS#endifL_NOPAGE:ORCC #0x04 ;// sets zero flagRTS}}#else /* !defined(__DPAGE__) */#if defined( __PPAGE__ )#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEstatic void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */__asm {L_PPAGE:CPY #PPAGE_LOW_BOUND ;// test of lower bound of PPAGE#if defined( __EPAGE__ )BLO L_EPAGE#elseBLO L_NOPAGE ;// no paged memory below#endifCPY #PPAGE_HIGH_BOUND ;// test of higher bound PPAGEBHI L_NOPAGEFOUND_PPAGE:LDX #PPAGE_ADDR ;// load page register address and clear zero flagRTS#if defined( __EPAGE__ )L_EPAGE:CPY #EPAGE_LOW_BOUND ;// test of lower bound of EPAGEBLO L_NOPAGECPY #EPAGE_HIGH_BOUND ;// test of higher bound of EPAGEBHI L_NOPAGEFOUND_EPAGE:LDX #EPAGE_ADDR ;// load page register address and clear zero flagRTS#endifL_NOPAGE: ;// not in any allowed page area;// its a far access to a non paged variableORCC #0x04 ;// sets zero flagRTS}}#else /* !defined(__DPAGE__ ) && !defined( __PPAGE__) */#if defined(__EPAGE__)#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEstatic void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */__asm {L_EPAGE:CPY #EPAGE_LOW_BOUND ;// test of lower bound of EPAGEBLO L_NOPAGECPY #EPAGE_HIGH_BOUND ;// test of higher bound of EPAGEBHI L_NOPAGEFOUND_EPAGE:LDX #EPAGE_ADDR ;// load page register address and clear zero flagRTSL_NOPAGE: ;// not in any allowed page area;// its a far access to a non paged variableORCC #0x04 ;// sets zero flagRTS}}#endif /* defined(__EPAGE__) */#endif /* defined(__PPAGE__) */#endif /* defined(__DPAGE__) */#endif /* USE_SEVERAL_PAGES *//*--------------------------- _SET_PAGE --------------------------------Runtime routine to set the right page register. This routine is used if the compilerdoes not know the right page register, i.e. if the option -Cp is used for more thanone pageregister or if the runtime option is used for one of the -Cp options.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- page part written into the correct page register.- the old page register content is destroyed- all processor registers remains unchanged--------------------------- _SET_PAGE ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _SET_PAGE(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGESTAB 0,X ;// set page registerL_NOPAGE:PULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {STAB PAGE_ADDR ;// set page registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_8 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- value to be read in the B register- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_8 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_8(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHA ;// save A registerLDAA 0,X ;// save page registerSTAB 0,X ;// set page registerLDAB 0,Y ;// actual load, overwrites pageSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:LDAB 0,Y ;// actual load, overwrites pagePULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerLDAB 0,Y ;// actual load, overwrites pageSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_16 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- value to be read in the Y register- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_16 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_16(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHA ;// save A registerLDAA 0,X ;// save page registerSTAB 0,X ;// set page registerLDY 0,Y ;// actual load, overwrites addressSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:LDY 0,Y ;// actual load, overwrites addressPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerLDY 0,Y ;// actual load, overwrites addressSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_24 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument. Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- value to be read in the Y:B registers- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_24 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_24(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHA ;// save A registerLDAA 0,X ;// save page registerSTAB 0,X ;// set page registerLDAB 0,Y ;// actual load, overwrites page of addressLDY 1,Y ;// actual load, overwrites offset of addressSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:LDAB 0,Y ;// actual load, overwrites page of addressLDY 1,Y ;// actual load, overwrites offset of addressPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerLDAB 0,Y ;// actual load, overwrites page of addressLDY 1,Y ;// actual load, overwrites offset of addressSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_32 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- low 16 bit of value to be read in the D registers- high 16 bit of value to be read in the Y registers- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_32 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_32(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGELDAA 0,X ;// save page registerPSHA ;// put it onto the stackSTAB 0,X ;// set page registerLDD 2,Y ;// actual load, low wordLDY 0,Y ;// actual load, high wordMOVB 1,SP+,0,X ;// restore page registerPULX ;// restore X registerRTSL_NOPAGE:LDD 2,Y ;// actual load, low wordLDY 0,Y ;// actual load, high wordPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {LDAA PAGE_ADDR ;// save page registerPSHA ;// put it onto the stackSTAB PAGE_ADDR ;// set page registerLDD 2,Y ;// actual load, low wordLDY 0,Y ;// actual load, high wordMOVB 1,SP+,PAGE_ADDR ;// restore page registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_8 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B register- value to be stored in the B registerResult :- value stored at the address- all registers remains unchanged- all page register still contain the same value--------------------------- _STORE_FAR_8 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_8(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHB ;// save B registerLDAB 0,X ;// save page registerMOVB 0,SP, 0,X ;// set page registerSTAA 0,Y ;// store the value passed in ASTAB 0,X ;// restore page registerPULB ;// restore B registerPULX ;// restore X registerRTSL_NOPAGE:STAA 0,Y ;// store the value passed in APULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHB ;// save A registerLDAB PAGE_ADDR ;// save page registerMOVB 0,SP,PAGE_ADDR ;// set page registerSTAA 0,Y ;// store the value passed in ASTAB PAGE_ADDR ;// restore page registerPULB ;// restore B registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_16 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B register- value to be stored in the X registerResult :- value stored at the address- all registers remains unchanged- all page register still contain the same value--------------------------- _STORE_FAR_16 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_16(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHALDAA 0,X ;// save page registerSTAB 0,X ;// set page registerMOVW 1,SP,0,Y ;// store the value passed in XSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:STX 0,Y ;// store the value passed in XPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerSTX 0,Y ;// store the value passed in XSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_24 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B register- value to be stored in the X:A registers (X : low 16 bit, A : high 8 bit)Result :- value stored at the address- all registers remains unchanged- all page register still contain the same value--------------------------- _STORE_FAR_24 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_24(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHALDAA 0,X ;// save page registerSTAB 0,X ;// set page registerMOVW 1,SP, 1,Y ;// store the value passed in XMOVB 0,SP, 0,Y ;// store the value passed in ASTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:STX 1,Y ;// store the value passed in XSTAA 0,Y ;// store the value passed in XPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerMOVB 0,SP, 0,Y ;// store the value passed in ASTX 1,Y ;// store the value passed in XSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_32 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address is on the stack at 3,SP (just below the return address)- value to be stored in the X:D registers (D : low 16 bit, X : high 16 bit)Result :- value stored at the address- all registers remains unchanged- the page part is removed from the stack- all page register still contain the same value--------------------------- _STORE_FAR_32 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_32(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHDLDAA 0,X ;// save page registerMOVB 6,SP, 0,X ;// set page registerMOVW 2,SP, 0,Y ;// store the value passed in X (high word)MOVW 0,SP, 2,Y ;// store the value passed in D (low word)STAA 0,X ;// restore page registerPULD ;// restore A registerBRA doneL_NOPAGE:MOVW 0,SP, 0,Y ;// store the value passed in X (high word)STD 2,Y ;// store the value passed in D (low word) done:PULX ;// restore X registerMOVW 0,SP, 1,+SP ;// move return addressRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHD ;// save D registerLDAA PAGE_ADDR ;// save page registerLDAB 4,SP ;// load page part of addressSTAB PAGE_ADDR ;// set page registerSTX 0,Y ;// store the value passed in XMOVW 0,SP, 2,Y ;// store the value passed in D (low word)STAA PAGE_ADDR ;// restore page registerPULD ;// restore D registerMOVW 0,SP, 1,+SP ;// move return addressRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _FAR_COPY_RC --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of the source int the X register- page part of the source in the A register- offset part of the dest int the Y register- page part of the dest in the B register- number of bytes to be copied is defined by the next 2 bytes after the return address.Result :- memory area copied- no registers are saved, i.e. all registers may be destroyed- all page register still contain the same value as before the call- the function returns after the constant defining the number of bytes to be copiedstack-structure at the loop-label:0,SP : destination offset2,SP : source page3,SP : destination page4,SP : source offset6,SP : points to length to be copied. This function returns after the sizeA usual call to this function looks like:struct Huge src, dest;; ...LDX #srcLDAA #PAGE(src)LDY #destLDAB #PAGE(dest)JSR _FAR_COPY_RCDC.W sizeof(struct Huge); ...--------------------------- _FAR_COPY_RC ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _FAR_COPY_RC(void) {#if USE_SEVERAL_PAGES__asm {DEX ;// source addr-=1, because loop counter ends at 1PSHX ;// save source offsetPSHD ;// save both pagesDEY ;// destination addr-=1, because loop counter ends at 1PSHY ;// save destination offsetLDY 6,SP ;// Load Return addressLDX 2,Y+ ;// Load Size to copySTY 6,SP ;// Store adjusted return addressloop:LDD 4,SP ;// load source offset。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1) 电机PWM输出子程序
38void SetMotorVoltage(int nLeftVol, int nRightVol)
{
short nPeriod; nPeriod = (short)getReg(PWM_PWMCM); if(nLeftVol > 0)
{
setReg(PWM_PWMVAL0, 0);
nLeftVol = mult(nLeftVol, nPeriod);
setReg(PWM_PWMVAL1, nLeftVol);
}
Else
{
nLeftVol = -nLeftVol; setReg(PWM_PWMVAL1, 0); nLeftVol = mult(nLeftVol, nPeriod);
setReg(PWM_PWMVAL0, nLeftVol);
}
if(nRightVol > 0)
{
setReg(PWM_PWMVAL3, 0);
nRightVol = mult(nRightVol, nPeriod);
setReg(PWM_PWMVAL2, nRightVol);
}
else
{
setReg(PWM_PWMVAL2, 0);
nRightVol = -nRightVol;
nRightVol = mult(nRightVol, nPeriod);
setReg(PWM_PWMVAL3, nRightVol);
}
}
这个子程序由下面的第二个程序调用。
第二个子程序:
MotorSpeedOut()
void MotorSpeedOut(void)
{
int nLeftVal, nRightVal;
nLeftVal = g_nLeftMotorOut;
nRightVal = g_nRightMotorOut;
if(nLeftVal > 0)
nLeftVal += MOTOR_OUT_DEAD_VAL;
else if(nLeftVal < 0)
nLeftVal -= MOTOR_OUT_DEAD_VAL;
if(nRightVal > 0) nRightVal += MOTOR_OUT_DEAD_VAL;
else if(nRightVal < 0)
nRightVal -= MOTOR_OUT_DEAD_VAL;
if(nLeftVal > MOTOR_OUT_MAX) nLeftVal = MOTOR_OUT_MAX;
if(nLeftVal < MOTOR_OUT_MIN) nLeftVal = MOTOR_OUT_MIN;
if(nRightVal > MOTOR_OUT_MAX) nRightVal = MOTOR_OUT_MAX; if(nRightVal < MOTOR_OUT_MIN) nRightVal = MOTOR_OUT_MIN; nLeftVal = nLeftVal << 4;
nRightVal = nRightVal << 4;
MOTOR_SET(nLeftVal, nRightVal);
}
2)模拟电压采集及车模倾角计算子程序
3)
3)车模直立控制子程序
4)
4)车模速度控制子程序
void MotorSpeedAdjustCal(void)
{
int nLeftSpeed, nRightSpeed;
int nDeltaValue, nP, nI;
int nSpeed;
nLeftSpeed = (int)g_nLeftMotorSpeedCount;
nRightSpeed = (int)g_nRightMotorSpeedCount;
nSpeed = (nLeftSpeed + nRightSpeed) / 2;
nDeltaValue = g_nMotorSpeedSet - nSpeed;
nP = mult_r(nDeltaValue, MOTOR_SPEED_P_INT);
nI = mult_r(nDeltaValue, MOTOR_SPEED_I_INT);
g_nMotorOutSpeedOld = g_nMotorOutSpeedNew;
g_nMotorOutSpeedKeep -= nI;
g_nMotorOutSpeedNew = (g_nMotorOutSpeedKeep >> 3) - nP;
if(g_nMotorOutSpeedKeep > MOTOR_OUT_MAX)
g_nMotorOutSpeedKeep = MOTOR_OUT_MAX;
if(g_nMotorOutSpeedKeep < MOTOR_OUT_MIN) g_nMotorOutSpeedKeep = MOTOR_OUT_MIN;
}
void CalculateMotorOutSpeed(void)
{
int nValue; nValue = g_nMotorOutSpeedNew - g_nMotorOutSpeedOld; nValue = nValue * (g_nCarMotionCount + 1) / (CAR_MOTION_PERIOD - 1) + g_nMotorOutSpeedOld;
g_nLeftMotorOutSpeed = g_nRightMotorOutSpeed = nValue;
}
5)车模方向控制子程序
void CarMagneticAdjust(void)
{
int nP;
long lnDelta;
int nSigma;
lnDelta = g_nCarMagneticRightAverage - g_nCarMagneticLeftAverage;
nSigma = (g_nCarMagneticLeftAverage / 2) + (g_nCarMagneticRightAverage / 2); if(nSigma == 0) return;
nP = (int)(lnDelta * CMA_P_MAX / nSigma) / 2;
g_nMotorLeftRightDiff = nP;
}
6)中断服务程序
void TI1_OnInterrupt(void)
{
unsigned int nLeftMotorSpeed, nRightMotorSpeed;
g_nCarSpeedCount ++; if(g_nCarSpeedCount >= CAR_SPEED_PERIOD) {
g_nCarSpeedCount = 0;
GetMotorSpeed(&nLeftMotorSpeed, &nRightMotorSpeed); ClearMotorSpeed(); g_nLeftMotorSpeed = (int)nLeftMotorSpeed; g_nRightMotorSpeed = (int)nRightMotorSpeed; if(!MOTOR_LEFT_SPEED_POSITIVE)
g_nLeftMotorSpeed = -g_nLeftMotorSpeed;
if(!MOTOR_RIGHT_SPEED_POSITIVE)
g_nRightMotorSpeed = -g_nRightMotorSpeed;
g_lnCarLeftPosition += g_nLeftMotorSpeed;
g_lnCarRightPosition += g_nRightMotorSpeed;
g_nLeftMotorSpeedCount += g_nLeftMotorSpeed; g_nRightMotorSpeedCount += g_nRightMotorSpeed;
} else if(g_nCarSpeedCount == 1)
{
ADC_Measure(0);
}
else if
(g_nCarSpeedCount == 2)
{
CarVoltageGet(); CarAngleAdjust();
}
else if(g_nCarSpeedCount == 3)
{
g_nCarMotionCount ++;
if(g_nCarMotionCount >= CAR_MOTION_PERIOD)
{
g_nCarMotionCount = 0;
MotorSpeedAdjust();
g_nLeftMotorSpeedCount = 0;
g_nRightMotorSpeedCount = 0;
CalculateMotorLeftRightDiff();
CalculateMotorOutSpeed();
}
else if
(g_nCarSpeedCount == 4)
{
g_nCarMagneticLeftAverage = (int)CV_MAGNETLEFT_VAL; g_nCarMagneticRightAverage = (int)CV_MAGNETRIGHT_VAL; CarMagneticAdjust();
}
}。