资源描述
电
动
车
跷
跷
板
姓名:许睿
班级:测控技术与仪器1101
学号:1102020138
项目建议书
项目名称:电动车跷跷板
项目负责人:许睿
项目审核:
项目批准:
项目建议书
一、项目概况
1.项目名称:电动车跷跷板
2.项目概要:电动车跷跷板由电动车和跷跷板组成。本系统是基于自动控制原理,针对多通道多样化传感器综合控制;采用PWM技术动态控制电机的转速和转向;利用光电检测器检测道路上的标志。系统的控制部分以凌阳单片机SPCE061A精简开发板(61板)为核心,通过步进电机对电动车和跷跷板的可移动配重进行运动控制,实现电动车在跷跷板上自动往返行驶,自动寻找平衡位置,同时利用LED动态显示行驶时间及语音播报平衡位置,使得本设计更趋智能化、人性化。另外,本系统采用两套控制系统分别控制电动车的行驶和配重物块的指定移动,以便容易方便控制,实现了具有一定自适应能力的控制系统。
3.建议书产生情况:本项目建议书由XXX提出,XXX拟制,XXX审核。
二、项目背景
1. 产业背景:
2. 市场背景:主要是小朋友的玩具和工程上应用
3. 技术背景:
4. 项目与本企业产业方向和发展战略的关系:
三、主要技术方案
1. 总体技术方案:以凌阳单片机SPCE061A精简开发板(61板)为核心,查询按键的输入,传输各种参数的显示,两台电机的正反转和速度控制以及两台电机的协调运动,负责光电检测信号的接收和对信号的处理,从而能够确定小车轨迹,在B点停止和返回,并最终停止。
角度传感器把角度信号输给单片机,把检测到的角度和基准角度比较,从而确定翘翘板的平衡点。寻找平衡点时主要是采用PID闭环控制算法,在小车行驶过程中每当小车翻过平衡点的时候都令小车向后退一段路程,直到小车再次翻过平衡点,小车再次向前行驶一段比前一段要小的距离直到翻过平衡点,最终找到平衡点。
电机驱动模块
SPCE061A单片机
语音模块
LED显示模块
平衡模块
路面引导模块
电源模块
步进电机
2. 关键技术及实现途径:
3.2.1 控制单元
方案一:采用传统8位89C51单片机作为控制单元,价格低廉,但处理速度慢,功能单一,RAM、ROM小。本系统需要计算速度,角度等大量的浮点数。需扩展RAM和ROM,而且硬件工作量必然加大。
方案二:采用凌阳公司推出的SPCE061A单片机及其开发板--61板作为控制模块。SPCE061A的CPU时钟为0.32MHz~49.152MHz,速度可以满足电机控制对实时性的要求;内置2K Words 的SRAM,为浮点运算提供了足够的数据存储器空间。此外使用凌阳公司提供的音频函数库和SPCE061A丰富的时基中断可以方便地实现功能扩展。
鉴于SPCE061A的以上优点,采用方案二。
3.2.2 电机及其驱动
方案一:采用步进电机,可准确控制转速和旋转的角度,但是体积大,质量大,并且需要另配驱动器,成本较高。在电动车上安装比较复杂。
方案二:采用减速直流电机,体积适中,安装简单,转速慢,车速容易控制,并且转矩和扭矩较大,驱动采用H桥,可自行制作。
综上所述,采用方案二。
3.2.3 寻迹电路
方案一:采用CCD器件,分辨率高,前瞻性远,但是价格贵,电路调试相对比较复杂,占用单片机的资源较多,在只需要实现简单的寻迹功能时,无需采用CCD器件。
方案二:集成断续式光电开关探测器,它具有简单、可靠的工作性能,只要调节探头上的一个旋钮就可以控制探头的灵敏度。但其体积较大,安装在小型电动车上会影响电动车整体的美观性。
方案三:反射式红外光电传感器,利用物体对红外光的反射和吸收来实现对被测物体的测量和计数的,容易受到外界光的干扰,但其体积小,安装简单,当其安装位置较低时,可以大大减轻外界光对传感器的干扰,在平缓的路径中,可以完成寻迹功能。
由于跷跷板的引导线为直线,路径信息简单,所以采用方案三。.
3.2.4 测速电路
方案一:采用反射式光电开关,体积小,电路简单,但需要配合码盘一起使用,而光电开关的可靠性要依赖码盘的安装位置的合理性以及暗室效果,如果码盘受到阳光的直射,光点开关可能偶尔忽略它的黑白条纹的切换,因此工作的可靠性较差,况且本系统采用履带式,码盘不容易安装。
方案二:采用霍尔元件,基本的想法是把小磁铁粘贴在驱动轮内侧的圆周上,不过相邻磁铁的间距十分有限,具体的间距与磁铁的磁场强度和传感器的灵敏度都有关系。履带式电动车的驱动轮较小,这种测速方案的分辨率相对较低。
方案三:采用增量式旋转编码器,通过内部两个光敏接受管转化其角度码盘的时序和相位关系,得到其角度码盘角度位移量增加(正方向)或减少(负方向)。在接合单片机后,增量式旋转编码器在角度测量和角速度测量较绝对式旋转编码器更具有廉价和简易的优势。其稳定性好,分辨率高。
综上所述,选择方案三。
3. 技术可行性分析:本系统使用凌阳公司推出的SPCE061A单片机做主控制器,10 PU-M步进电机驱动、辅以光电传感器和角度传感器等测量器件,设计并实现了电动小车自动行驶上跷跷板,利用水平倾角自动判断寻找到翘翘板上的平衡点。通过LED灯给出平衡指示,并在平衡点停留指定时间后行驶至跷跷板另外一端、停留指定时间后返回至起点的全过程,全程用LCD液晶实时显示工作状态及平衡时角度、行驶时间等参数。经过测试,电动小车控制效果令人满意。
四、项目实施所需的资源和条件:
1.企业实施项目的优势:本企业具有自己的研发基地与科研团队。企业的具有研发其他电子的经验。基地的技术人才全面,其产品已有良好的口碑。拥有顶尖的科研、开发、生产、管理、销售团队,对市场需求及市场开发有很强的挖掘能力和拥有决对的实力。
2.资源及建设条件要求: 资源合理且充实利用,要求开发的产品必须符合国家标准,符合本项目的所有要求。全面的技术人才,雄厚的资金支持,广阔的销售市场。
3.项目对人才、设备、开发环境的要求:需要全面的人才,精密的测量仪器,先进的生产设备,科研的基地
五、经费估算和资金筹措:
市场考察,材料,人员工资,科研的杂费等费用。资金全靠公司投资。
六、项目的进度计划和阶段考核目标:
一个半月生产出样机,两个月生产出产品。
七、经济和社会效益分析:
1.成本和市场定价测算、项目实施后的新增产值、利税
2.项目对公司主流业务和发展战略的贡献:扩大公司的业务,带动其他产品的销售。
3.项目的社会效益分析:让小朋友的童年更加的快乐
4.项目的敏感性分析:
八、结论意见
1、多渠道运作,深挖市场。作为一个新的品牌,要想在市场上被消费者接受和认可,不能只依靠公司的资源,更要靠公司和经销商的主观能动性,想尽各种办法,深挖市场,采取多渠道运作,多条腿走路的方式。
2、企业要将做品牌放在首位。只有树立起做品牌的理念,才能引导企业向更好的方向发展,每一位新员工进厂必须接受品牌定位的培训,让每一位员工都要清楚我们要生产什么样的产品,提供什么样的优质服务。
3、团队的科学建设和打造。团队成员的互相信任,对企业的忠诚等,都是以公司的信誉承诺作为坚强后盾的。
项目任务书
编号:001
项目名称:电动车跷跷板
项目负责人:许睿
审核:
批准:
项目任务书
l 项目名称:电动车跷跷板
l 项目简介:电动车跷跷板由电动车和跷跷板组成。本系统是基于自动控制原理,针对多通道多样化传感器综合控制;采用PWM技术动态控制电机的转速和转向;利用光电检测器检测道路上的标志。系统的控制部分以凌阳单片机SPCE061A精简开发板(61板)为核心,通过步进电机对电动车和跷跷板的可移动配重进行运动控制,实现电动车在跷跷板上自动往返行驶,自动寻找平衡位置,同时利用LED动态显示行驶时间及语音播报平衡位置,使得本设计更趋智能化、人性化。另外,本系统采用两套控制系统分别控制电动车的行驶和配重物块的指定移动,以便容易方便控制,实现了具有一定自适应能力的控制系统。
l 项目开发内容:通过步进电机对电动车和跷跷板的可移动配重进行运动控制,实现电动车在跷跷板上自动往返行驶,自动寻找平衡位置,同时利用LED动态显示行驶时间及语音播报平衡位置,使得本设计更趋智能化、人性化。
l 技术关键及实施方案:
1) 控制单元:采用凌阳公司推出的SPCE061A单片机及其开发板--61板作为控制模块。SPCE061A的CPU时钟为0.32MHz~49.152MHz,速度可以满足电机控制对实时性的要求;内置2K Words 的SRAM,为浮点运算提供了足够的数据存储器空间。此外使用凌阳公司提供的音频函数库和SPCE061A丰富的时基中断可以方便地实现功能扩展。
2) 电机及其驱动:采用减速直流电机,体积适中,安装简单,转速慢,车速容易控制,并且转矩和扭矩较大,驱动采用H桥,可自行制作。
3) 寻迹电路:反射式红外光电传感器,利用物体对红外光的反射和吸收来实现对被测物体的测量和计数的,容易受到外界光的干扰,但其体积小,安装简单,当其安装位置较低时,可以大大减轻外界光对传感器的干扰,在平缓的路径中,可以完成寻迹功能。
4) 测速电路: 采用增量式旋转编码器,通过内部两个光敏接受管转化其角度码盘的时序和相位关系,得到其角度码盘角度位移量增加(正方向)或减少(负方向)。在接合单片机后,增量式旋转编码器在角度测量和角速度测量较绝对式旋转编码器更具有廉价和简易的优势。其稳定性好,分辨率高。
l 样机数量及项目进度:预计生产一台样机
l 项目人员情况、分工及职责:
项目负责人签字: 许睿
单位领导签字:
项目进度表及阶段成果报告
项目进度表(Project甘特图表)
结项报告书
l 电动车跷跷板项目结项验收报告
l 项目名称:电动车跷跷板
l 项目经理:许睿
l 项目开始日期:2013年4月16日
l 项目结束日期:2013年5月15日
结项报告书
一、 项目概况
(一)项目概况表:要求设计出有直线调节、平衡调节、能停止、返回的小车,实现跷跷板的功能。
(二)项目主要人员:设计组,生产组
二、 项目实施情况
(一)项目进度:
(二)项目预算:从设计到生产出样品预计花费14100元。
三、成品实验情况:本系统设计方案完整、合理,运行平稳,完全达到了题目基本部分和发挥部分的要求。
四、 投入产出分析:性价比挺高,花费资金不多。产品销售量稳定。
五、项目的贡献:在本系统的创新设计中,为电动车增加了人性化的功能设计,并且注重了小车外形工艺的设计。为体现小车控制的灵活性,增设了避障和板上掉头,并为其设计了应用场景。
六、 项目经验、教训总结:在产品研发阶段,必须弄清单片机实现的原理以及基本结构,这样才能更好的进行软、硬件设计,使产品性能得以完善,以方便进一步提高。另外,在进行外观设计的时候,要新颖,适合儿童的心理,使产品的销售更加突出。
七、 附件
**项目部
2013年5月13日
软件流程图
软件清单
#include "SPCE061V004.H"
#include "7279a.h"
extern second;
extern second1;
extern flag_dao;
extern
transform();
main()
{int flag_time=0;
int flag_balnc=0;
unsigned int ADValue = 0,Value=0;
unsigned char ci=0xffff,cy=1;
unsigned int flag_sip=0;
unsigned int flag_qian=0;
unsigned int flat=0;
second=0;
*P_IOA_Dir=0xff00; ////设置A口
*P_IOA_Attrib=0xffff;
*P_IOA_Data=0xff00;
*P_IOB_Dir=0xc300; //设置B口
*P_IOB_Attrib=0xc300;
*P_IOB_Data=0x4300; //83正向 43反向 c3旋转 03旋转
*P_ADC_MUX_Ctrl = 0x0002; //模拟电压信号通过LINE_IN1输入
*P_ADC_Ctrl |= 0x0001; //允许AD转换
*P_TimerA_Data=0xfff8; //TIMA初值
*P_TimerA_Ctrl=C_SourceA_8192Hz+C_SourceB_1+C_Duty8; //计时中断
*P_TimerB_Data=0xfff8; //TIMB初值
*P_TimerB_Ctrl=C_SourceC_8192Hz+C_Duty8;
*P_INT_Ctrl=C_IRQ5_2Hz;//+C_IRQ3_EXT1+C_IRQ3_EXT2 ; //开2Hz中断
asm("IRQ ON"); //开中断
*P_Watchdog_Clear=1;
while (!(*P_ADC_MUX_Ctrl & 0x8000));
Value =*P_ADC_LINEIN_Data;
while (!(*P_ADC_MUX_Ctrl & 0x8000));
i=*P_ADC_LINEIN_Data;
Value =transform(i)/10;
while(1)
{ *P_Watchdog_Clear=1;
while (!(*P_ADC_MUX_Ctrl & 0x8000));
i=*P_ADC_LINEIN_Data;
ADValue =transform(i)/10;
if(second>15&&flag_time==0)
{ *P_Watchdog_Clear=1;
flag_time=1;
*P_TimerA_Data=0xfff0;
*P_TimerB_Data=0xfff0;
*P_TimerA_Ctrl=C_SourceA_4096Hz+C_SourceB_1+C_Duty1;
*P_TimerB_Ctrl=C_SourceC_4096Hz+C_Duty1;
flag_qian=1;
}
if(flag_sip==0&&flag_time==1&&flat==0)
{ *P_Watchdog_Clear=1;
if(ADValue>Value+80)
{
*P_IOB_Data=0x4300;
*P_TimerA_Ctrl=C_SourceA_8192Hz+C_SourceB_1+C_DutyOff;
*P_TimerB_Ctrl=C_SourceC_8192Hz+C_DutyOff;
*P_TimerA_Data=0xfff8;
*P_TimerB_Data=0xfff8;
second1=0;
while(1)
{if(second1<=5)*P_Watchdog_Clear = 0x0001;
xianshi(13,0FH,0FH,second1);
else if(second1>5) break;
}
flag_qian=0;
*P_TimerA_Data=0xfff8;
*P_TimerB_Data=0xfff8;
*P_TimerA_Ctrl=C_SourceA_8192Hz+C_SourceB_1+C_Duty8;
*P_TimerB_Ctrl=C_SourceC_8192Hz+C_Duty8;
flag_sip=1;
}
}
/*行使轨迹*/
if((IOB2|IOB3)&&(flag_qian==0))
{ if(IOB3==0&&IOB2==1)
{
while(1)
{*P_Watchdog_Clear = 0x0001;
if(IOB3==0&&IOB2==1)
{ *P_TimerA_Ctrl=C_SourceA_4096Hz+C_SourceB_1+C_Duty4;
}
else break;}
*P_TimerA_Ctrl=C_SourceA_8192Hz+C_SourceB_1+C_Duty8;
}
else if(IOB2==0&&IOB3==1)
{
while(1)
{*P_Watchdog_Clear = 0x0001;
if(IOB2==0&&IOB3==1)
{ *P_TimerB_Ctrl=C_SourceC_4096Hz+C_Duty4;
}
else break;}
*P_TimerB_Ctrl=C_SourceC_8192Hz+C_Duty8;
}
}
if((IOB2==0&&IOB3==0)&&(flag_qian==0))
{
if(IOB2==0&&IOB3==0)
{ *P_TimerA_Ctrl=C_SourceA_0+C_SourceB_1+C_DutyOff;
*P_TimerB_Ctrl=C_SourceC_0+C_DutyOff;
*P_Watchdog_Clear=1;
}
second1=0;
while(1)
{if(second1<=5)*P_Watchdog_Clear = 0x0001;
else if(second1>5) break;
}
*P_IOB_Data=0x8300;
*P_TimerA_Ctrl=C_SourceA_8192Hz+C_SourceB_1+C_Duty14;
*P_TimerB_Ctrl=C_SourceC_8192Hz+C_Duty14;
flag_dao=1; flag_qian=1 ;
}
if(flag_dao==1)
{if(IOB0||IOB1)
{ if(IOB1==0&&IOB0==1)
{
while(1)
{*P_Watchdog_Clear = 0x0001;
if(IOB1==0&&IOB0==1)
{ *P_TimerA_Ctrl=C_SourceA_4096Hz+C_SourceB_1+C_Duty4;
}
else break;}
*P_TimerA_Ctrl=C_SourceA_8192Hz+C_SourceB_1+C_Duty8;
}
else if(IOB0==0&&IOB1==1)
{
while(1)
{*P_Watchdog_Clear = 0x0001;
if(IOB0==0&&IOB1==1)
{ *P_TimerB_Ctrl=C_SourceC_4096Hz+C_Duty4;
}
else break;}
*P_TimerB_Ctrl=C_SourceC_8192Hz+C_Duty8;
}
}
if(IOB0==0&&IOB1==0)
{
while(1)
{if(IOB0==0&&IOB1==0)
{ *P_TimerA_Ctrl=C_SourceA_0+C_SourceB_1+C_DutyOff;
*P_TimerB_Ctrl=C_SourceC_0+C_DutyOff;
*P_Watchdog_Clear=1;
}
else break;
}
}
}
*P_Watchdog_Clear=1;
}
*P_Watchdog_Clear=1;
}
transform(unsigned int cc)//AD 数据转换
{unsigned int sum=0;
cc=cc>>6;
cc=cc*0x0020;
if((cc&0x0001)==0x0001)
sum+=1;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=2;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=4;
cc=cc>>1;
*P_Watchdog_Clear=1;
if((cc&0x0001)==0x0001)
sum+=8;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=16;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=32;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=64;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=128;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=256;
*P_Watchdog_Clear=1;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=512;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=1024;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=2048;
*P_Watchdog_Clear=1;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=4096;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=8192;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=16384;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=32768;
cc=cc>>1;
if((cc&0x0001)==0x0001)
sum+=65536;
return(sum);
}
/*中断子程序*/
#include "SPCE061V004.H"
#include "7279a.h"
unsigned char time=0,d=0xaa00;
char second;
char second1;
char second2;
int flag_dao;
int time1;
int time2;
flag_dao=0;
void BREAK(void) __attribute__ ((ISR));
void BREAK(void)
{
}
void FIQ(void) __attribute__ ((ISR));
void FIQ(void)
{
}
void IRQ0(void) __attribute__ ((ISR));
void IRQ0(void)
{
}
void IRQ1(void) __attribute__ ((ISR));
void IRQ1(void)
{
}
void IRQ2(void) __attribute__ ((ISR));
void IRQ2(void)
{
}
void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
}
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{
}
void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void)
{
if(*P_INT_Ctrl&C_IRQ5_2Hz)
{
*P_INT_Clear=C_IRQ5_2Hz;
time++;
if(time%2==0)
{
second++;
*P_Watchdog_Clear=1;
second1++;
if(second1!=1)xianshi(14,second/100,(second/10)%10,second%10);
if(second1==1) xianshi(14,second/100,(second/10)%10,second%10);
if(second2==1) xianshi(14,second/100,(second/10)%10,second%10);
}
}
else
*P_INT_Clear=C_IRQ5_4Hz;
}
void IRQ6(void) __attribute__ ((ISR));
void IRQ6(void)
{
}
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
}
/*显示子程序*/
#include "7279a.h"
#include "SPCE061V004.h"
void xianshi(unsigned int Bai,unsigned int Shi,unsigned int Ge,unsigned int Shi_d)
{write7279(0x80,Bai);
write7279(0x81,Shi);
write7279(0x82,Ge);
write7279(0x83,Shi_d);
}
/*7279发送*/
void write7279(unsigned char cmd,unsigned char ta)
{send_byte(cmd);
send_byte(ta);
}
void send_byte(unsigned char out_byte)
{ unsigned char i;
// cs=0;//cs=P1^0;
long_delay();
for(i=0;i<8;i++)
{ if(out_byte&0x0080) dat=1;
else dat=0;//dat=p1^2;
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2;
}
dat=0;
}
void long_delay (void)
{ unsigned char i;
for(i=0;i<0x0015;i++);
}
void short_delay (void)
{ unsigned char i;
for(i=0;i<2;i++);
}
/*7279子程序*/
unsigned char read7279(unsigned char command)
{ unsigned char i;
send_byte(command);
*P_IOA_Dir=0xf3f1;
i=receive_byte();
// *P_IOA_Dir=0xf7f0;
return(i);
}
unsigned char receive_byte (void)
{
unsigned char i,in_byte;
dat=1;
long_delay();
for (i=0;i<8;i++)
{
clk=1;
short_delay();
in_byte=in_byte*2;
if(dat)
{
in_byte=in_byte|0x01;
}
clk=0;
short_delay();
}
dat=0;
return(in_byte);
}
软件设计说明
一 设计名称:电动车跷跷板
二 设计者:许睿
三 报告日期:2013年5月13日
四 设计目标:
1) 控制小车的行驶方向,防止小车驶离跷跷板;
2) 寻找平衡点,通过采集模拟数据,
展开阅读全文