题目: 基于单片机的测速装置
学院(系):
年级专业:
学 号:
学生姓名:
指导教师:
教师职称:
燕山大学课程设计(论文)任务书
院(系):电气工程学院 基层教学单位:自动化系
学 号 | 学生姓名 | 专业(班级) | ||||||
设计 题目 | 基于单片机的测速装置 | |||||||
设 计 技 术 参 数 | 1掌握PWM电机调速原理; 2掌握红外测速原理; 3合理设置电机控制周期。 | |||||||
设 计 要 求 | 1 测速装置采用20格光码盘; 2 主板选用STM32; 3 驱动采用双L298模块。 | |||||||
工 作 量 | 1、完成设计说明书一份;文稿打印; 2、设计说明书中要绘制原理图、流程图; 2、能够现场根据要求调试参数。 | |||||||
工 作 计 划 | 第1周:查阅相关资料,有老师讲授STM32开发版学习; 第2周:装配电机,实现正常行驶; 第3周:调试 第4周:规范化撰写课程设计说明书;最后进行答辩。 | |||||||
参 考 资 料 | 1 直流电机调速原理; 2 光电检测技术; 3 相应的微处理器原理及应用。 | |||||||
指导教师 签字 | 基层教学单位主任签字 |
摘要
本次综合训练是以基于Cortex-M3内核的STM32微控制器为控制工具去控制智能小车去检测黑线进行循迹,同时利用PWM测速原理去检测并传回转速值。
前言
随着科学技术迅猛发展,人们对设备越来越高的应用需要已经无法满足当前和未来高性能的应用与发展需求。显然,嵌入式系统的软、硬件技术和开发手段,正日益受到重视,成为各领域技术创新的重要基础。
目前,嵌入式系统是近年来发展很快的计算机方面的学科方向,并迅速渗透到控制、自动化、仪器仪表等学科。嵌入式方向包括了软硬件协同设计、嵌入式体系结构、实时操作系统、嵌入式产品设计等方面的知识,大于当代大学生,更需要掌握嵌入式系统设计的典型开发工具和开发核心技术。
近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,在通讯、网络、工控、医疗、电子等领域发挥着越来越重要的作用。嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一。
一 、STM32相关知识介绍
1.1 STM32介绍
首先Cortex-M3是ARM公司为要求高性能、低成本、低功耗的嵌入式应用专门设计的内核。STM32系列产品得益于Cortex-M3在架构上进行的多项改进,包括提升性能的同时又提高了代码密度的Thumb-2指令集和大幅度提高中断响应的紧耦合嵌套向量中断控制器,所有新功能都同时具有业界最优的功耗水平。
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按性能分成两个不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
1.2 固件库在STM32中的作用
STM32固件库是 32位基于ARM微控制器STM32F101xx与STM32F103xx的固件函数库。该函数库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例。通过使用本固件函数库,无需深入掌握细节,用户也可以轻松应用每一个外设。因此,使用本固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。所有的驱动源代码都符合“Strict ANSI-C”标准(项目于范例文件符合扩充ANSI-C标准)。
因为该固件库是通用的,并且包括了所有外设的功能,所以应用程序代码的大小和执行速度可能不是最优的。对大多数应用程序来说,用户可以直接使用之,对于那些在代码大小和执行速度方面有严格要求的应用程序,该固件库驱动程序可以作为如何设置外设的一份参考资料,根据实际需求对其进行调整。
二、智能小车介绍
2.1智能小车整体简介
智能小车可以分为三部分——传感器部分、控制器部分、执行器部分。控制器部分:接收传感器部分传递过来的信号,并根据事前写入的决策系统(软件程序),来决定机器人对外部信号的反应,将控制信号发给执行器部分。好比人的大脑。执行器部分:驱动机器人做出各种行为,包括发出各种信号(点亮发光二极管、发出声音)的部分,并且可以根据控制器部分的信号调整自己的状态。对机器人小车来说,最基本的就是轮子。这部分就好比人的四肢一样。 传感器部分:机器人用来读取各种外部信号的传感器,以及控制机器人行动的各种开关。好比人的眼睛、耳朵等感觉器官。用STM32控制的智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车能够实时显示时间、速度、里程,具有自动寻迹、寻光、避障功能,可程控行驶速度、准确定位停车,远程传输图像等功能。
2.2 4路红外线探测系统
简介:
此模块是为智能小车、机器人等自动化机械装置提供一种多用途的红外线探测系统的解决方案。使用红外线发射和接收管等分立元器件组成探头,并使用 LM339电压比较器(加入迟滞电路),防止临界输出抖动做为核心器件构成中控电路。此系统具有的多种探测功能能极大的满足各种自动化。智能化的小型系统的应用。
应用范围:
智能化轮式车和智能化履带车
1、巡线 2、避障 3、防跌落
特性:易于安装。4路分别工作,工作时不受数量中控板与探头分开,安装位置不受模块高度≤4厘米,安全工作电压范围在4伏特至6伏特之间4路全开工作电流30毫安至40毫安之间。
+5、GND:电源接线端
IN(1—4)、OUT:探头与中控板连接端
OUT1、OUT2、OUT3、OUT4: 对应输出端
LED3、LED4、LED6、LED7: 对应输出指示
R17、R18、R19、R20: 对应比较电压调节
输出端为集电极开路,板载4.7千欧上拉电阻
2.3 PWM测速原理及模块
ZK-measure测速模块
简介:
此模块是为智能小车、机器人等自动化机械装置。使用一休化对射红外发射接收管
WYC H206,并使用 74HC14(带施密特触发器反向器),防止临界输出抖动做为核心器件构成中控电路。
应用范围:智能化轮式车和智能化履带车
1、测速(配合编码盘)
留有安装孔易于安装,使用非常简便,灵敏度高。反应非常迅速。
测试测速模块:槽型不要有遮挡物,将模块接上电源+5V 后用万用表测 OUT 输出端电压。此时的电压电压为 0.3V 左右,D1 指示灯亮,当用大于 2MM 的不透明物体通过槽型光电,OUT 输出端电压应接近电源,D1指示灭(表示已检测到物体)。通过检测得到PWM波,利用STM32对其进行捕获,可以得到编码盘上栅格的频率,进而根据轮子上编码盘的齿数,轮子半径,得到小车轮子的速度。
2.4 L298驱动模块
小车直流电机工作电流一般是 200-400MA 有些更大,如果一个小车是二个轮子,那么总的电流在 400-800MA 左右,这些电机轮子都是要接受单片机指令执行相应的动作,而市面有的单片机 IO 口一般只能提供 5MA 到 10MA 的电流,直接驱动不了电机,所以需要加一个驱动模块。放大电流。驱动采用专业的 L298N驱动芯片。
L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。
三 、程序设计
3.1 外设的初始化和设置步骤
此步骤描述了如何初始化和设置任意外设。这里PPP代表任意外设。
1. 在主应用文件中,声明一个结构PPP_InitTypeDef,例如:
PPP_InitTypeDef PPP_InitStructure;
这里PPP_InitStructure是一个位于内存中的工作变量,用来初始化一个或者多个外设PPP。
2. 为变量PPP_InitStructure的各个结构成员填入允许的值。可以采用以下2种方式:
a)按照如下程序设置整个结构体
PPP_InitStructure.member1 = val1;
PPP_InitStructure.member2 = val2;
PPP_InitStructure.memberN = valN;
/* where N is the number of the structure members */
以上步骤可以合并在同一行里,用以优化代码大小:
PPP_InitTypeDef PPP_InitStructure = { val1, val2,.., valN}
b)仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数PPP_SturcInit(..)来初始化变量
PPP_InitStructure,然后再修改其中需要修改的成员。这样可以保证其他成员的值(多为缺省值)被正确填
入。
PPP_StructInit(&PPP_InitStructure);
PP_InitStructure.memberX = valX;
PPP_InitStructure.memberY = valY;
/*where X and Y are the members the user wants to configure*/
3. 调用函数PPP_Init(..)来初始化外设PPP。
4. 在这一步,外设PPP已被初始化。可以调用函数PPP_Cmd(..)来使能之。
PPP_Cmd(PPP, ENABLE);
可以通过调用一系列函数来使用外设。每个外设都有各自功能函数。
注:1. 在设置一个外设前,必须调用以下一个函数来使能它的时钟:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx, ENABLE);
2. 可以调用函数PPP_Deinit(..)来把外设PPP的所有寄存器复位为缺省值:
PPP_DeInit(PPP)
3. 在外设设置完成以后,继续修改它的一些参数,可以参照如下步骤:
PPP_InitStucture.memberX = valX;
PPP_InitStructure.memberY = valY; /* where X and Y are the only
members that user wants to modify*/
PPP_Init(PPP, &PPP_InitStructure);
3.2 程序设计流程和思路
一、利用对GPIO的控制对小车的四个电机控制使小车直线运行,在对其控制时先用延时函数仿制了一个PWM波,通过更改占空比可以改变小车轮子的速度;
二、通过4路红外探测返回的信号设置switch语句,使小车检测到黑线时自动进行轨迹循迹,这时可以改变占空比参数使其以合适的速度运行;
三、学习定时器中断相关知识,如NVIC初始化,TIM3初始化等,此时把PWM波真正写成,去控制小车轮子转速;
四、改进为使能四个轮子去控制转速;
五、学习串口相关知识后,利用串口中断写成收发数据的程序;
六、加入测速模块,利用定时器3的捕获通道1对PWM波进行捕获,每次捕获后进入中断用USART_SendData发出频率值,通过串口助手可以看到频率,进而得到轮子转速。
四、心得体会
本次综合训练过程中,利用程序控制STM32进而控制智能小车行进。训练中我们遇到很多的难题,很多东西都是第一次接触,通过老师详细讲解明白大概自己去摸索写程序去控制。然而坚持就是胜利,最后我们实现了小车循迹和测速。以前我对于嵌入式的知识学习的还是不太多,经过综合训练后感觉学到很多嵌入式知识。它还让我学会了如何通过自己的努力去认知一个新事物,更重要的是端正自己的学习态度,只有真正下功夫去学习,才能有收获,正所谓“一份耕耘,一份收获。”再者,通过本次训练,我也学会了如何去分析问题,如何找出自己设计中的不足,进而去排除解决问题,这就是一个自我学习的过程。当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。
此次实习学到了很多课内学不到的东西,比如思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅。在此,感谢老师的细心指导,也同样谢谢其他各组同学的无私帮助!
当然,在这其中,我也发现自己的许多不足之处,我相信在以后的学习工作中,我一定会端正自己的学习态度,一丝不苟的去对待每一件事。只有做好足够的准备,才能事半功倍!最后再次感谢两位老师的悉心指导!
五、参考资料
1 直流电机调速原理;
2 光电检测技术;
3 相应的微处理器原理及应用;
4 STM32库开发指南(刘火良、杨森著)
5、STM32固件库
六、程序附录
#include"stm32f10x.h"
#include"stdio.h"
//重新定义 int fputc(int ch, FILE *f) { USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等 while (!(USART1->SR & USART_FLAG_TXE)); return (ch); } void GPIO_Config(void); void delay(u32 z); void NVIC_Config(void );//嵌套向量中断控制器的配置 void TIM4_Config(void );//配置定时器4 3s中断一次 void PWM_Config(void ); void PWM(uint16_t left_up,uint16_t left_down,uint16_t right_up,uint16_t right_down);//0...1000 void USART1_Config(void ); void TIM3_Config(void ); void DelayTest(uint16_t z) { uint16_t i = 0; while(z--) { for(i = 0;i<1000;i++); } } void SendChar(uint8_t* table) { uint16_t i = 0; for(i = 0;table[i] != '\\0';i++) { USART_SendData(USART1,table[i]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); } } int main() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 |RCC_APB1Periph_TIM3,ENABLE); TIM4_Config(); PWM_Config(); GPIO_Config(); USART1_Config(); TIM3_Config(); NVIC_Config(); SendChar("ok"); GPIO_Write(GPIOD,0xAA00);//控制小车前进 IN1---IN8 printf("this is a TDC-GP21 module , designed by Yubin \\n\\r"); while(1) { switch(GPIO_ReadInputData(GPIOC) & 0xf000)//只读取PC15 --PB12位的数据 { case 0x8000: PWM(0,0,2000,2000);break; //1000 1000 case 0x4000: PWM(0,0,1800,1800);break; //1000 1000 case 0x2000: PWM(1800,1800,0,0);break; //0010 0010 case 0x1000: PWM(2000,2000,0,0);break; //0010 0010 default:PWM(1000,1000,1000,1000);break; } } } Void PWM(uint16_t left_up,uint16_t left_down,uint16_t right_up,uint16_t right_down)//0...1000 { TIM_SetCompare1(TIM4,left_up); TIM_SetCompare2(TIM4,left_down); TIM_SetCompare3(TIM4,right_up); TIM_SetCompare4(TIM4,right_down); } void GPIO_Config(void ) { GPIO_InitTypeDef GPIO_InitStruct; //PD8----PD15作为 IN1 -----IN7 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_8 |GPIO_Pin_9|GPIO_Pin_10 |GPIO_Pin_11 |GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD,&GPIO_InitStruct); //PC12 ----PC15 作为传感器OUT1 --- OUT4 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC,&GPIO_InitStruct); //PB6----PB9 作为驱动使能的ENA ---ENB GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB,&GPIO_InitStruct); //PA9 PA10作为串口输出。 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStruct); //PA6 、PA7作为输入捕获的通道 TIM3对应的通道1、2. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 ; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); } void NVIC_Config(void ) { NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; //中断源 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } void TIM4_Config(void ) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_Prescaler = (36-1);//2MHz TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = 2000;//计数10000us TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0x00; TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);//定时器初始化 TIM_Cmd(TIM4,ENABLE);//打开定时器 } void PWM_Config(void ) { TIM_OCInitTypeDef TIM_OCInitStruct; TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = 50; TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM4,&TIM_OCInitStruct); TIM_OC2Init(TIM4,&TIM_OCInitStruct); TIM_OC3Init(TIM4,&TIM_OCInitStruct); TIM_OC4Init(TIM4,&TIM_OCInitStruct); TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable); TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable); TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable); } void USART1_Config(void ) { USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate = 9600; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Mode = USART_Mode_Tx |USART_Mode_Rx; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART1,&USART_InitStruct); USART_Cmd(USART1,ENABLE); USART_ClearFlag(USART1,USART_FLAG_TC); } void TIM3_Config(void ) { TIM_ICInitTypeDef TIM_ICInitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_Prescaler = (72-1);//72000 000 /72 = 1MHz TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = 0xffff; TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0x00; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct); TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStruct.TIM_ICFilter = 0x0; TIM_ICInit(TIM3,&TIM_ICInitStruct); TIM_Cmd(TIM3,ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE); } 中断程序 #include "stm32f10x_it.h" extern void DelayTest(uint16_t z); __IO uint16_t IC3ReadValue1 = 0, IC3ReadValue2 = 0; __IO uint16_t CaptureNumber = 0; __IO uint32_t Capture = 0; __IO uint32_t TIM3Freq = 0; void TIM3_IRQHandler(void ) { if(TIM_GetITStatus(TIM3,TIM_IT_CC1) == SET) { if(CaptureNumber == 0) { IC3ReadValue1 = TIM_GetCapture1(TIM3); CaptureNumber = 1; } else if(CaptureNumber == 1) { IC3ReadValue2 = TIM_GetCapture1(TIM3); if (IC3ReadValue2 > IC3ReadValue1) { Capture = (IC3ReadValue2 - IC3ReadValue1); } else { Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2); } CaptureNumber = 0; } TIM3Freq = 1000000/Capture; USART_SendData(USART1,(TIM3Freq/10000%10+0x30)); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); USART_SendData(USART1,(TIM3Freq/1000%10+0x30)); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); USART_SendData(USART1,(TIM3Freq/100%10+0x30)); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); USART_SendData(USART1,(TIM3Freq/10%10+0x30)); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); USART_SendData(USART1,(TIM3Freq%10+0x30)); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); USART_SendData(USART1,' '); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); } TIM_ClearITPendingBit(TIM3,TIM_IT_CC1); } 电气学院综合训练评审意见表 ①该组学习态度 (认真 较认真 不认真) ②该组依赖他人进行设计情况 (有 无) ③该组设计有无创新点 (有 无) 该组电路设计情况(未实现 实现 创新) 该组程序设计情况(未实现 实现 创新) 指导教师签字: 年 月 日 ①设计巧妙,实现设计要求,并有所创新。 ②设计合理,实现设计要求。 ③实现了大部分设计要求。 ④没有完成设计要求,或者只实现了一小部分的设计要求。 答辩成绩: 组长签字: 年 月 日 年 月 日图面及其它成绩:(20) 指导教师评语:(40) 答辩小组评语:(20) 创新设计综合成绩:(20) 答辩小组成员签字: