1、 一、 教学目的 通过课程设计培养学生综合运用所学知识和能力、提高分析和解决实际问题能力的一个重要环节,专业课程设计时建立的专业基础课程和专业方向课的基础上的,是学生根据所学课程进行的工程基本训练,课程设计的目的在于: 1. 培养学生综合运用所学的基础理论和专业知识,独立进行机电控制系统(产品)的初步设计工作,并结合设计或试验研究课题进一步巩固和扩大知识领域。 2. 培养学生搜索、阅读和综合分析参考资料,运用各种标准和工具书籍一集编写技术文件的能力、提高计算、绘图等基本能力。 3. 培养学生掌握机电产品设计的一半程序和方法,进行工程师基本素质的训练。 4. 树立正确的设计思想及严肃
2、认真的工作作风。 二、 设计要求 1. 电机驱动方式:步进电机。 2. 机械传动方式:螺旋丝杠。 3. 电气控制方式:单片微机控制。 4. 功能控制要求:速度控制。 5. 主要设计参数:单向工作行程1000mm,移动负载质量50kg,负载移动阻力50N,移动速度控制3m/min。 三、 总体方案设计 2.1方案概述: 本系统将采用ATMEL公司生产的MEGA-16L系列产品作为控制单元。通过控制单片机的引脚发送的脉冲信号控制步进电机的速度然后将步进电机产生的力矩通过减速器进行一级减速之后输入螺旋丝杠端驱动工作平台的移动。同时该系统将采用实时控制系统通过按键的控
3、制调整当前的速度值并将速度值显示在显示系统中,显示系统由12864屏幕承担工作任务,可以显示中文字符,通过将当前的速度值显示在屏幕上可以方便控制者对系统的操作。 2.2方案特点: 本系统与其他同类产品相比具有以下的特点: 1. 单片机控制具有较强的灵活性,可以处理多种可能发生的情况。 2. 响应速度快,提高控制的实时性。 3. 造价比较便宜,系统扩展方便。 4. 可视化程度高,方便控制。 四、 机械传动系统设计 给定参数: 单向工作行程:1000mm 移动负载质量:50kg 负载移动阻力:50N 移动速度控制:3m/min 4.1滑动螺旋传
4、动计算 一、确定丝杠的导程 查手册知导程为10MM的丝杠其公称直径范围最大,且在这个公称直径范围内的丝杠其优先腿脚选用的稻城也为10MM,因此,确定选用导程Ph=10MM的丝杠。 二、丝杠的转速 三、丝杠的平均载荷 四、预期额定动载荷 (1)按预期工作时间估计 查表:轻微冲击=1.2 精度等级1-3,取=1.0 可靠性96%,取=0.53 已知:寿命=15000h 得: 五、丝杠
5、副的型号 根据所选定的导程=10mm以及动载荷选用FFZD型丝杠,型号FFZD3210,其主要参数如下: 公称直径32mm 导程10mm 丝杠大径30mm 轴端直径<=24mm 动负荷32KN 静载荷70KN 刚度1170N/um 六、耐磨性计算 选择梯形螺纹 ξ的值为:0.8 整体式螺母的φ值在1.2-2.5之间选取φ值为1.8 φ的值为:1
6、8 许用压强在18 MPa -25 MPa之间 ,选取[p]为22 MPa 许用压强[p]为:22MPa 七、验算自锁 螺旋副摩擦系μs在0.08-0.1之间,选取螺旋摩擦系数为0.088 螺旋副摩擦系数μs为:0.088 根据得出螺纹升角 螺纹升角为:1.658° 根据得出当量摩擦角 =5.21 八、计算驱动转矩 、为轴承摩擦力矩 驱动转矩T为:258(N*mm) 九、计算螺杆强度 []取71-118.333
7、Mpa 螺杆当量应力σ的值为:0.043MPa < [] 合格 十、螺纹牙强度计算 螺杆 螺母 螺杆 螺母 螺纹牙底宽度为:5.2mm 螺杆抗剪强度为:0.008MPa 螺杆抗弯强度为:0.018MPa 螺母抗剪强度为:0.077MPa 螺母抗弯强度为:0.178MPa 十一、螺杆的稳定性计算 螺杆的最大工作长度l为:1300mm 两端固定长度系数μ为:0.5 螺杆材料的弹性模量E为:207000MPa 应使 (不能满足此条件应该加
8、大) 临界载荷Fc的值为:326929.962N 十二、螺杆的刚度计算 螺杆材料的切变模量G为:83000MPa 轴向载荷使导程产生的变形量δLF为:0mm 转矩使导程产生的变形量δLT为:0mm 导程的总变形量δL为:0mm 十三、计算横向振动 螺杆两支承间的最大距离lc为:1000mm 两端固定的系数μ1为:4.730 临界转速nc为: 5255.678(r/min) 十四、计算效率 轴承效率为:0.99 效率
9、为:0.26678 4.2电动机的选择 选用步进电机: 工作机所需输入功率:=(50+50N)*3m/min=5w 电机所需功率: 其中, 为高速级联轴器效率,0.99 为滚动轴承效率,0.99 为闭式圆柱齿轮效率,0.97(按8级精度) 为螺旋传动效率,0.26678 所以查表选电机型号为:75BF001 电机参数: 型号: 75BF001 相数: 3 步距角(°): 1.5 电压/V: 24 相电流/A: 3 最大静转矩/(N·m): 0.392 空载起动频率/(step/s
10、): 1750 空载运行频率/(step/s): 电感/mH: 19 电阻/Ω: 0.62 分配方式: 三相六拍 外形尺寸/mm: φ75×53 质量/kg: 1.1 4.3轴承选择 查表采用固定式E型、F型轴承、轴承型号为7602020TVP,主要参数如下: 内径d=20mm 外径D=47mm 宽度B=14mm 球径Dw=5.953mm 球数Z=15 动负荷Ca=19600N 预加负载F0=230
11、0N 极限转速nm=3000r/min 重量m=0.123kg 4.4轴承校核 (1)由设计条件知,负载很小G=mg=500N<19600,因此轴承承载能力能完全满足要求。 (2)寿命设计: =1.1 =1 4.6润滑与密封 轴承的润滑: 根据轴颈的圆周速度,轴承可以用润滑脂和润滑油润滑,由于齿轮的转速根据以知是大于2m/s,所以润滑可以靠机体的飞溅直接润滑轴承。 齿轮的润滑: 采用浸油润滑,由于低速级周向速度为2.87m/s,所以浸油高度约为六分之一大齿轮半径 齿轮与轴承用同种润滑油较为便利,
12、考虑到该装置用于小型设备,选用L-AN15润滑油。 密封: 采用迷宫式密封件,圆周速度小于等于10m/s,环境温度低于润滑脂溶点 五、电气控制系统设计 5.1控制芯片选择 本系统将采用ATMEL公司生产的AVR系列MEGA-16L产品作为控制单元。其具有以下优点: 一、简便易学,费用低廉 首先,对于非专业人员来说,选择AVR单片机的最主要原因,是进入AVR单片机开发的门槛非常低,只要会操作电脑就可以学习AVR单片机的开发。单片机初学者只需一条ISP下载线,把编辑、调试通过的软件程序直接在线写入AVR单片机,即可以开发AVR单片机系列中的各种封装的器件。AVR单
13、片机因此在业界号称“一线打天下”。 其次,AVR单片机便于升级。AVR程序写入是直接在电路板上进行程序修改、烧录等操作,这样便于产品升级。 再次,AVR单片机费用低廉。学习AVR单片机可使用ISP在线下载编程方式(即把PC机上编译好的程序写到单片机的程序存储器中),不需购买仿真器、编程器、擦抹器和芯片适配器等,即可进行所有AVR单片机的开发应用,这可节省很多开发费用。程序存储器擦写可达10000次以上,不会产生报废品。 二、高速、低耗、保密 首先,AVR单片机是高速嵌入式单片机: 1、AVR单片机具有预取指令功能,即在执行一条指令时,预先把下一条指令取进来,使得指
14、令可以在一个时钟周期内执行。 2、多累加器型,数据处理速度快。AVR单片机具有32个通用工作寄存器,相当于有32条立交桥,可以快速通行。 3、中断响应速度快。AVR单片机有多个固定中断向量入口地址,可快速响应中断。 其次,AVR单片机耗能低。对于典型功耗情况,WDT关闭时为100nA,更适用于电池供电的应用设备。有的器件最低1.8 V即可工作。 再次,AVR单片机保密性能好。它具有不可破解的位加密锁Lock Bit技术,保密位单元深藏于芯片内部,无法用电子显微镜看到。 三、I/O口功能强,具有A/D转换等电路 1. AVR单片机的I/O口是真正的I/O口,能
15、正确反映I/O口输入/输出的真实情况。工业级产品,具有大电流(灌电流)10~40 mA,可直接驱动可控硅SCR或继电器,节省了外围驱动器件。 2. AVR单片机内带模拟比较器,I/O口可用作A/D转换,可组成廉价的A/D转换器。ATmega48/8/16等器件具有8路10位A/D。 3. 部分AVR单片机可组成零外设元件单片机系统,使该类单片机无外加元器件即可工作,简单方便,成本又低。 4. AVR单片机可重设启动复位,以提高单片机工作的可靠性。有看门狗定时器实行安全保护,可防止程序走乱(飞),提高了产品的抗干扰能力。 四、有功能强大的定时器/计数器及通讯接口 定
16、时/计数器T/C有8位和16位,可用作比较器。计数器外部中断和PWM(也可用作D/A)用于控制输出,某些型号的AVR单片机有3~4个PWM,是作电机无级调速的理想器件。 AVR单片机有串行异步通讯UART接口,不占用定时器和SPI同步传输功能,因其具有高速特性,故可以工作在一般标准整数频率下,而波特率可达576K。 5.2.电机驱动芯片选择 在电机驱动芯片我选用L298n,它能驱动的最高电压为50V,单向电流最大可达5A L298n芯片采用以下接线方式: 5.3稳压电源芯片的选择
17、 在稳压电源上我选择三端稳压集成电路7805为单片机供电。 电子产品中,常见的三端稳压集成电路有正电压输出的78 ×× 系列和负电压输出的79××系列。顾名思义,三端IC是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。它的样子象是普通的三极管,TO- 220 的标准封装,也有9013样子的TO-92封装。 用78/79系列三端稳压IC来组成稳压电源所需的外围元件极少,电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜。该系列集成稳压IC型号中的78或79后面的数字代表该三端集成稳压电路的输出电压,如7806表示输出电压为正6V,7909
18、表示输出电压为负9V。 因为三端固定集成稳压电路的使用方便,电子制作中经常采用。 在实际应用中,应在三端集成稳压电路上安装足够大的散热器(当然小功率的条件下不用)。当稳压管温度过高时,稳压性能将变差,甚至损坏。 当制作中需要一个能输出1.5A以上电流的稳压电源,通常采用几块三端稳压电路并联起来,使其最大输出电流为N个1.5A,但应用时需注意:并联使用的集成稳压电路应采用同一厂家、同一批号的产品,以保证参数的一致。另外在输出电流上留有一定的余量,以避免个别集成稳压电路失效时导致其他电路的连锁烧毁。 在78 ** 、79 ** 系列三端稳压器中最常应用的是TO-220 和T
19、O-202 两种封装。这两种封装的图形以及引脚序号、引脚功能如附图所示。 图中的引脚号标注方法是按照引脚电位从高到底的顺序标注的。这样标注便于记忆。引脚①为最高电位,③脚为最低电位,②脚居中。从图中可以看出,不论正压还是负压,②脚均为输出端。对于78**正压系列,输入是最高电位,自然是①脚,地端为最低电位,即③脚,如附图所示。对与79**负压系列,输入为最低电位,自然是③脚,而地端为最高电位,即①脚,如附图所示。 5.3串行通讯设计 在本系统中我设计了串行通讯的模块,可以使单片机接受上位电脑发送过来的数据进而控制电机的转动,实时的通讯系统方便了对该平台的控制,同时
20、能实现远程控制。 在串行通讯中我设计使用的是MAX232N芯片,以下是其接线电路与引脚配置图。 5.4控制电路设计 首先设计的部分是ATmega16单片机的最小外围电路,包括:晶振电路、复位电路、ISP下载电路、供电电源电路。 晶振电路图如下: 复位电路如下: 稳压电源电路: ISP下载电路如图: 5.5显示系统设计 改系统的显示部分我采用12864屏幕作为显示元件,它作为汉字屏幕能显示4*8个汉字。同时能使用穿行方式与单片机进行通信接受单片机发送的数据并显示 工作于串行
21、模式时的引脚定义: PIN1------------ GND 电源-, 一般接0V。 PIN2------------VDD 电源+, 一般接5V。 PIN3------------V0 对比度调整端。 PIN4------------CS,片选 PIN5------------SID,数据 PIN6------------SCK,脉冲 PIN7------------NC,不连接 PIN8------------NC,不连接 PIN9------------NC,不连接 PIN10-----------NC,不连接 PIN11-----------NC,不
22、连接 PIN12-----------NC,不连接 PIN13-----------NC,不连接 PIN14-----------NC,不连接 PIN15-----------PSB 并行:PSB=1,可以接VCC; 串行:PSB=0,一般接GND PIN16 ----------NC,不连接 PIN17-----------RST,模块复位(低电平有效) PIN18 ----------NC,不连接 PIN19 ----------LED+ ,背光 +,一般接5V。 PIN20 ----------LED- ,背光 -,一般接GND。
23、
下图是12864的驱动电路:
12864屏幕的指令集:
六、部分程序
// 串口通讯
// 芯片: Mega16
// 晶振: 16M
//计算机串口发送字节后 单片机接收到返回,
#include
24、UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x67; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}
//tansmit-------------------------------串口发-----
void uart_t( unsigned char datax )
{
while ( !( UCSRA & (1< 25、E)) );
UDR = datax;
}
/* 字符输入函数 */
unsigned int uart_r(void)
{
while(!(UCSRA& (1< 26、void uart0_rx_isr(void)
{
//uart has received a character in UDR
temp=UDR;
uart_t(temp); //送什么发什么
PORTD=temp;
////////////////////////////////这里可以收到串口助手发来的数据
}
七、参考文献
[1]康永泽,论机电一体化的发展。(论文)
[2]上海电器科学研究所,电机与控制应用(期刊)。
[3]计时鸣,机电一体化控制技术与系统。
[4]尚涛,机电控制技术。
[5]尹志强,机电一 27、体化系统设计课程设计指导书。
[6]刘同法,单片机外围接口电路与工程实践。
[7]龙威林,单片机应用入门:AT89S51和AVR 。
[8]陈忠平,单片机基础和最小系统实践。
[9]白静,数字电路与逻辑设计。
[10]董景新,控制工程基础。
[11]程志红,机械设计。
[12]程志红,机械设计课程上机与设计。
[13]肖兴明,机电控制及自动化。
[14]李朝青,单片机原理及接口技术。
[15]路敦民,机电传动及控制。
八、程序附页
主程序:
#include 28、e 29、/
void delay_us(uint US)
{
uint i;
US=US*10/4;
for( i=0;i 30、port_init(void)////////端口初始化
{
DDRA = 0xFF;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0x00;
}
//************************************T1初始化
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; ////////////////////setup 初值
TCNT1L = 0x30;
TCCR1A = 0x00;///////// 31、tart Timer
TCCR1B = 0x02;
}
/********************************************
函数名称: KeyPress
参 数: 扫描键值
返回值 : 1,2,3,4
/********************************************/
unsigned char KeyPress()
{
uchar i=0;
DDRD&=0xf0;
PIND|=0xf0;
PORTD=0xff;
switch PIND
{
case 0 32、xef:
{
// delay_ms(1);
if(PIND==0xef)
{
i=1;
return i;
break;
}
}
case 0xdf:
{
// delay_ms(1);
if(PIND==0xdf)
{
i=2;
return i;
break;
}
}
case 0xbf:
33、 {
// delay_ms(1);
if(PIND==0xbf)
{
i=3;
return i;
break;
}
}
case 0x7f:
{
// delay_ms(1);
if(PIND==0x7f)
{
i=4;
return i;
break;
}
}
case 0xff:
{
34、 // delay_ms(1);
if(PIND==0xff)
{
i=0;
return i;
break;
}
}
}
}
void init_devices()
{
CLI();
port_init();
timer1_init();
SEI();
}
void speedup()
{
speed++;
}
void speeddown()
{
speed--;
}
35、void speeddown()
{
CLI();
}
void back()
{
if(turn==0) turn=1;
if(turn==1) turn=0;
}
/********************************************/
void main()
{
init_devices();
while(1)
{
write_12864(0,0,1/speed*1.5*60/360+48);
write_12864(6,0,"r/min");
data 36、KeyPress();
if(data==1) speedup();
if(data==2) speeddown();
if(data==3) stop();
if(data==4) back();
}
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void) //TIMER1 has overflowed
{
TCNT1H = speed; //reload counter high value
TCNT1L = 0xF8; //reload co 37、unter low value
flag++;
flag%=9;
if(turn==0)
{
switch(flag)
{
case 0:
PORTB|=BIT(0);
PORTB&=~BIT(1);
PORTB&=~BIT(2);
case 1:
PORTB|=BIT(0);
PORTB|=BIT(1);
PORTB&=~BIT(2);
case 2:
PORTB|=BIT(1);
PORTB&=~BIT(2);
PORTB&=~BIT(0);
case 3: 38、
PORTB|=BIT(1);
PORTB|=BIT(2);
PORTB&=~BIT(0);
case 4:
PORTB|=BIT(2);
PORTB&=~BIT(0);
PORTB&=~BIT(1);
case 5:
PORTB|=BIT(2);
PORTB|=BIT(0);
PORTB&=~BIT(1);
}
}
if(turn==1)
{
switch(flag)
{
case 0:
PORTB|=BIT(0);
POR 39、TB&=~BIT(1);
PORTB&=~BIT(2);
case 1:
PORTB|=BIT(0);
PORTB|=BIT(1);
PORTB&=~BIT(2);
case 2:
PORTB|=BIT(1);
PORTB&=~BIT(2);
PORTB&=~BIT(0);
case 3:
PORTB|=BIT(1);
PORTB|=BIT(2);
PORTB&=~BIT(0);
case 4:
PORTB|=BIT(2);
PORTB&=~BIT(0);
POR 40、TB&=~BIT(1);
case 5:
PORTB|=BIT(2);
PORTB|=BIT(0);
PORTB&=~BIT(1);
}
}
}
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x67; //set baud rate lo
UBRRH = 0x00; //set bau 41、d rate hi
UCSRB = 0x98;
}
//tansmit-------------------------------串口发-----
void uart_t( unsigned char datax )
{
while ( !( UCSRA & (1< 42、
12864屏幕驱动程序:
//////////////////////////////////////////////////////////////////////////////
///////////////////// LCD 12864 汉字屏 ////////////////////////////
///////////////////// 运行环境: ICC AVR ////////////////////////////
///////////////////// 目标系统: Atmega16L 43、 ////////////////////////////
///////////////////// 编辑时间: 2010-1-8 ////////////////////////////
///////////////////// 编辑人 : zhanggan
#include 44、 x2 0x88
#define y 0x80
#define comm 0
#define dat 1
端口操作定义
#define LCD_RS_CLR PORTC&=~0X01;delay(5)
#define LCD_RW_CLR PORTC&=~0X02;delay(5)
#define LCD_E_CLR PORTC&=~0X04;delay(5)
#define LCD_RS_SET PORTC|= 0X01;delay(5)
#define LCD_RW_SET PORTC|= 0X02;delay(5) 45、
#define LCD_E_SET PORTC|= 0X04;delay(5)
#define LCD_OUT DDRA = 0XFF;delay(5)
#define LCD_IN DDRA = 0X00;delay(5)
#define LCD_Data PORTA
通用延时函数
void delay(uint us) //delay time
{
while(us--);
}
void delay_nms(uint ms)
{
uint i,j;
for(i=0;i 46、
for(j=0;j<700;j++);
}
忙检测函数
void chk_busy (void)
{
LCD_Data=0xff;
LCD_RS_CLR;
LCD_RW_SET;
LCD_E_SET;
LCD_IN;
while(PINA&0X80);
LCD_OUT;
LCD_E_CLR;
}
字节数据写入函数
void wr_lcd (uchar dat_comm,uchar content)
{
chk_busy ();
LCD_OUT;
if(dat_comm)
47、 {
LCD_RS_SET; //data
LCD_RW_CLR; //write
}
else
{
LCD_RS_CLR; //command
LCD_RW_CLR; //write
}
LCD_Data=content; //output data or comm
LCD_E_SET;
LCD_E_CLR;
}
清DDRAM-函数
void clrram (void)
{
wr_lcd (comm,0x30);
wr 48、lcd (comm,0x01);
}
液晶屏初始化函数
void init_lcd (void)
{
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
wr_lcd (comm,0x06); /*光标的移动方向*/
wr_lcd (comm,0x0c); /*开显示,关游标*/
}
全屏字符显示函数
void chn_disp (uchar const *chn)
{
uchar i,j;
uchar add[]={ 49、0,2,1,3};
wr_lcd (comm,0x30);
wr_lcd (comm,0x80);
for (j=0;j<4;j++)
{
for (i=0;i<16;i++)
wr_lcd (dat,chn[add[j]*16+i]);
}
}
显示图形函数
void img_disp (uchar const *img)
{
uchar i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34); 50、
wr_lcd (comm,y+j);
wr_lcd (comm,x1+i);
wr_lcd (comm,0x30);
wr_lcd (dat,img[j*16+i*2]);
wr_lcd (dat,img[j*16+i*2+1]);
}
}
for(j=32;j<64;j++)
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j-32);
wr_lcd (comm,x2+






