1、http:/ 电子发烧友 http:/ 电子技术论坛毕业实习 毕业设计 毕业论文题 目: 基于 AVR 单片机的 步进电机控制器设计 年 级: 2005 级 专 业: 机电一体化技术 姓 名: 学 号: 指导教师: 日 期: 黑龙江大学职业技术学院制I摘 要介绍了步进电动机的发展史,及国内的现状和步进电动机未来的应用前景。并且阐述了步进电动机转速、角度、转矩的控制原理。本文阐述了一种步进电机控制器的设计方案,并绘制了原理图和 PCB 板图,撰写了程序源代码。实现了对步进电动机转速、角度的控制,并完成了实物的制作。这期间主要使用 protel99se 软件绘制原理图和制板,使用proteus7.
2、1 软件进行程序代码的仿真和功能的理论验证。最后通过硬件的调试验证程序代码的实际功能,完成对控制器的设计。关键词AVR 单片机;步进电动机;控制器。IIAbstractIntroduction step enter electric motor of development history, and local present condition and step enter electric motor future of application foreground.And elaborated a step to enter electric motor to turn soon, an
3、gle, turn Ju of control principle.This text elaborated a kind of step enter electrical engineering controller of design project, and drew principle diagram and PCB plank diagram, composed a procedure source a code.Realization to step enter the electric motor turn soon, angle of control, and completi
4、on real object of creation.This period main usage the protel 99 se the software draw principle diagram and make plank, usage proteus 7.1 softwares carry on an imitate of procedure code true with the theories of the function verification.The end experiment certificate procedure a code through an adju
5、st of hardware of actual function, completion design controller.Key wordsAVR MCU; Stepper Motor; Controller. 目 录摘要Abstract第一章、引言11.1 步进电机发展史11.2 我国步进电机发展11.3 步进电机应用的前景1第二章、步进电机控制系统22.1 步进电机控制系统22.2 控制单元22.3 驱动电路22.4 通信端口32.5 其它3第三章、Atmega16L 单片机43.1 Atmega16L 主要功能43.2 Atmega16L 引脚功能4第四章、控制器电路图6第五章、步
6、进电动机原理与控制85.1 步进电动机的结构85.2 步进电动机的控制原理85.3 L297/L298 85.3.1 L297 芯片简介 85.3.2 L298 芯片简介 95.3.3 L297298 步进电机控制95.3.4 控制机制 10第六章、实现 116.1 main 主程序流程图116.2 程序代码 12第七章、结构图30结论31参考文献32致谢33附录34基于 AVR 单片机的步进电机控制器1第一章、引 言1.1 步进电机发展史步进电机又称电动机或阶跃电动机,国外一般称为 Step motor 或 Stepping motor 等。步进电机的机理是基于最基本的电磁铁作用,其原始模型
7、起源于 1830 年至 1860 年间。1870 年前后开始以控制为目的的尝试,应用于氩弧灯的电极输送机构中。这被认为是最初的步进电动。此后,在电话自动交换机中广泛使用了步进电动机。不久又在缺乏交流电源的船舶和飞机等独立系统中广泛使用。20 世纪 60 年代后期,随着永磁性材料的发展,各种实用性步进电动机应运而生,而半导体技术的发展则推进了步进电动机在众多领域的应用。在近 30 年间,步进电动机迅速地发展并成熟起来。从发展趋向来讲,步进电动机已经能与直流电动机、异步电动机,以及同步电动机并列,从而成为电动机的一种基本类型。1.2 我国步进电机发展我国步进电动机的研究及制造起始于本世纪 50 年
8、代后期。从 50 年代后期到 60 年代后期,主要是高等院校和科研机构为研究一些装置而使用或开发少量产品。这些产品以多段结构三相反应式步进电动机为主。70 年代初期,步进电动机的生产和研究有所突破。除反映在驱动器设计方面的长足进步外,对反应式步进电动机本体的设计研究发展到一个较高水平。70 年代中期至 80 年代中期为成品发展阶段,新品种高性能电动机不断被开发。自80 年代中期以来,由于对步进电动机精确模型做了大量研究工作,各种混合式步进电动机及驱动器作为产品广泛利用。13 步进电机的应用前景目前,随着电子技术、控制技术以及电动机本体的发展和变化,传统电机分类间的界面越来越模糊。步进电机必然会
9、成为机电一体化元件组件的必然趋势。由于步进电机具有控制方便、体积小等特点,所以在数控系统、自动生产线、自动化仪表、绘图机和计算机外围设备中得到广泛应用。微电子学的迅速发展和微型计算机的普及与应用,为步进电动机的应用开辟了广阔前景,使得以往用硬件电路构成的庞大复杂的控制器得以用软件实现,既降低了硬件成本又提高了控制的灵活性,可靠性及多功能性。市场上有很多现成的步进电机控制机构,但价格都偏高。应用 SGS 公司推出的 L297 和 L298 两芯片可方便的组成步进电机驱动器,并结合 Atmega16L 单片机可以构成很好的步进电机控制系统。 基于 AVR 单片机的步进电机控制器2第二章、步进电机控
10、制系统2.1 步进电动机控制系统步进电动机本体、步进电动机驱动电路和控制单元构成步进电动机系统不可分割的三大部分。系统框图见下图 2-1:图 2-1 步进电动机系统框图22 控制单元控制单元 、驱动电路为控制系统的核心部分。控制单元是整个系统最核心的部分,是系统的指挥中心。用于协调各部分的运行,主要负责接收通信端口或输入电路送来的信息,并对其进行识别,译码,并做出相应的动作,发出控制信号用以控制步进电动机。控制单元实质上是具有处理能力的微处理器芯片。控制单元可以由:单片机、DSP、PLC 等充当。本文选用由 ATEML 公司生产的Atmega16l 单片机。23 驱动电路驱动电路是负责将控制单
11、元送来的微电流信号进行放大用以驱动步进电动机运转,驱动电路实质上是功率放大器。常见的驱动电路:单电压型功放电路、高低压切换型功放电路、斩波恒流功放电路等再就是采用专用的集成芯片。本文采用 L297/L298 芯片,由这两种芯片构成的驱动电路具有控制方便、精度高、并且不需要外围扩展。基于 AVR 单片机的步进电机控制器324 通信端口通信端口是步进电机控制器与上位机(主要是指计算机)进行通信的接口,PC 机串口采用的通信标准 RS-232 标准。使用单片机的 USART 端口与计算机的串口(9 芯)相连进行通信。25 其它显示屏:人机交互的窗口,使用 JHD162A 液晶屏。输入电路:用于输入控
12、制信息,告诉控制器如何运转。基于 AVR 单片机的步进电机控制器4第三章、Atmega16L 单片机Atmega16L是由ATMEL公司生产的高性能、低功耗的 8 位AVR 微处理器芯片,具有16KB 系统内可编程 Flash。3.1 Atmega16L主要功能Atmega16L单片机的功能及特点简述如下:1、16KB的系统内编程flash、512B的EEPROM、1KB的SRAM;2、四通道的PWM;3、两个可编程串行USART;4、可工作于主机/从机模式的SPI;5、具有独立片内振荡器的可编程看门狗定时器;6、片内/片外中断源;7、32个双向I/O端口,可单独控制;8、TWI模块;9、3个
13、定时计数器等。3.2 Atmega16L引脚功能Atmega16L双列直插式(PDIP)引脚如图3-1:图3-1 Atmega16L(PDIP)图基于 AVR 单片机的步进电机控制器5引脚功能简述如下:A/VCC: 模拟/数字电源;AREF: A/D转换参考电压;XTAL1/2:晶振;RESET: 复位;AREF: A/D转换参考电压;PAPD: 双向I/O口;TXD: USART输出引脚;RXD: USART输入引脚;OC1A: PWM波形输出端;注:USART,是一个高度灵活的串行通讯设备,通用同步和异步串行接收器和转发器的英文缩写。基于 AVR 单片机的步进电机控制器6第四章、控制器电路
14、图基于 AVR 单片机的步进电机控制器7原理图说明:本原理图,用Protel99se绘制。以总路线和网络标号连接,即相同的的网络标号具有电气连接。Jrs-RS-232串口;Rp-Vref调节电阻;LM2575-稳压片;JVCC-电源接入口(俗称火牛头) ;Jlcd-JHD162A液晶屏接口;JM-步进电机接线口;JTAG-仿真下载器连接口;LED_B-电源指示;MAX-202-电平转换芯片;L297/298-构成相序产生电路和驱动电路;放大图见附录。基于 AVR 单片机的步进电机控制器8第五章、步进电动机原理与控制从广义上讲,步进电动机的类型分为机械式、电磁式和组合式三大类型。5.1 步进电动
15、机的结构(图5-1)图5-1 HB型步进电动机结构示意图5.2 步进电动机的控制原理步进电机是一种将电脉冲信号变为相应的直流位移的数字/模拟变换器。每当电机绕组接收一个脉冲时,转子就转过一个相应的角度(步距) 。步进电机的角位移量和输入脉冲的个数严格成正比。在时间上与输入脉冲同步,因而只要控制输入脉冲的数量、频率和电机绕组的相序,即可获得所需要的转速和转动方向。5.3 L297/L2985.3.1 L297 芯片简介L297芯片是一种硬件环分集成芯片,它可产生四相驱动信号,用于两相双极或四相单极步进电动机的控制。它的心脏部分是一组译码器它能产生各种所需的相序,这一部分是由两种输入模式控制,方向
16、控制(CW/CCW)和HALF/FULL,步进式时钟CLOCK将译码器从一阶梯推进至另一阶梯。译码器有四个输出点连接到输出逻辑部分,提供抑制和斩波功能所需的相序。L297能产生三种相序信号,对应于三种不同的工作方式:即半步方式(HALF STEP) ;基本步距(FULL STEP)一相激励方式;基本步距两相激励方式。L297另一个重要组成是由两个PWM斩波器来控制相绕组电流,实现恒流斩波控制以获基于 AVR 单片机的步进电机控制器9得良好的矩频特性。5.3.2 L298 芯片简介L298芯片是一种高压、大电流双全桥式驱动器,其设计是为接受标准TTL逻辑电平信号和驱动电感负载的,例如继电器、圆筒
17、形线圈、直流电机和步进电机,具有两抑制输入来使器件不受输入信号影响。每桥的三级管的射极是连接在一起的,相应外接线端可用来连接外设传感电阻。可安置另一输入电源,使逻辑能在低压下工作。L298芯片是具有15个引出脚的多瓦数直插封闭的集成芯片。5.3.3 L297/298 步进电机的控制L297/298的连接如下图5-2:图5-2 L297/298连接图这里我只使用:半步工作方式和两相激励的基本步距工作方式。两种工作方式见下表5-1:基于 AVR 单片机的步进电机控制器10工作方式 半步工作方式 两相激励基本步距引脚状态 HALF/FULL=1,CONTROL=1 HALF/FULL=0,CONTR
18、OL=1输出波形表5-1 L297半步/两相激励基本步距工作方式注:采用基本步距一相激励,存在一个缺点,在电流切换过程即通电状态改变过程中,有一瞬间可能所有的定子控制绕组都不通电,电磁转矩瞬间为零,这就使得电磁转距在电机运行中波动很大。所以我不采用这种工作模式。5.3.4 控制机制L297/298组成的完整系统,通过不同的连接可以驱动两相步进电动和驱动四相步进电机(可承受的最高电压为45V,每相电流可达2A) 。单片机(简称mcu)发出时钟信号、正反转信号、工作模式信号、复位信号、使能信号及控制信号。CW/CCW控制电机的转向,取1和取0时转向相反。CLOCK为步进脉冲信号输入端,在每一个脉冲
19、的下降沿,电机产生一步步进。HALF/FULL为半步或基本步距模式设置,为1时是半步模式,为0时是基本步距。(具体组合方式见表5-1)CONTORL斩波控制,当为0时,控制INH1和INH2;当为1时控制ABCD。ENABLE使能输入,当为0时,INH1、INH2、A,B,C和D都为0。RESET输入,当为0时,脉冲分配器回到初状态(HOME) 。L297通过控制L298双H集成电路,来驱动步进电机。电路中,L297的15引脚上的两个电阻用来调节斩波器电路的参考电压。该电压通过管脚13、14所反馈的电位的大小比较,来确定是否进行斩波控制,以达到控制电机绕组电流峰值、保护步进电机的目的。综上所述
20、:步进电机的转速取决于CLOCK的脉冲频率,角位移取决于CLOCK的脉冲个数,转矩大小则取决于参考电压Vref的大小。基于 AVR 单片机的步进电机控制器11第六章、实现6.1 main主程序流程图基于 AVR 单片机的步进电机控制器12初始化读串口程序 K 4 按下否 ?N“ 欢迎信息 ! ” K 4 按下否 ?A D C 子程序YN脉冲频率设定子程序“ 1 . S e t f r e q u e n c y ? ”“ 2 . S e t m o d e ? ” K 4 按下否 ?N模式选择子程序k e y 1 _ t e m p | | k e y 2 _ t e m p工作方式子程序执行
21、子程序 K 4 按下否 ?NYYYN6.2 程序代码/*head.h*基于 AVR 单片机的步进电机控制器13#ifndef _HEAD_H#define _HEAD_H #include#include#include#include#include#define TOP OCR1A#define PWMCONREG1 TCCR1A#define PWMCONREG2 TCCR1B#define PWM_IO DDRD|=_BV(PD5)#define L297_DIR PORTD#define L297_OUT DDRD|=0xfc#define RESET 0X40#define HF
22、0X08#define CC 0X10#define CONTROL 0X80#define S_RESET L297_DIR|=RESET#define C_RESET L297_DIRunsigned char mode=1,direction=+,key_value,ch=1,key1_temp,key2_temp;unsigned char str_mode20=“1.wave_mode?“,str_mode120=“HALF STEP MODE?“,str_mode220=“correct?“;unsigned char str_way20=“1.on-off mode“,pulse
23、10=“000000000“,cursor_i,pulse_i,ky,adc_str5;/*whole_variable.c(结束)*/*key.c*#include“head.h“unsigned char key(void)unsigned char key_value;key_value=(KEY_PINif(key_value) /是否有键按下 ,无返回0,有进入switch(key_value)case 0x01 : while(KEY_PIN return 1 ;case 0x02 : while(KEY_PIN return 2 ;case 0x40 : while(KEY_PI
24、N return 3 ;基于 AVR 单片机的步进电机控制器16case 0x80 : while(KEY_PIN return 4 ;elsereturn(0);/*key.c(结束)*/*JHD162A.c*#include“head.h“#define LCD_DIR DDRB /方向寄存器#define LCD_DAR PORTB /数据寄存器#define RS_H LCD_DAR|=0x04 /RS-PB2#define RS_L LCD_DAR /产生一个下降沿_delay_us(2); /必须=2usE_L;void lcd_send(unsigned char temp)LC
25、D_DAR /清高四位LCD_DAR|=(temp /发送高四位temp0?(0x80+0x40+x):(0x80+x) ;lcd_com(addr);基于 AVR 单片机的步进电机控制器18void jhd_init(void)LCD_DIR=0XFF;_delay_ms(16); /延时=15mslcd_com(0x22);_delay_ms(4.1); /=4.1mse_h2l();_delay_us(100); /=100use_h2l();e_h2l();lcd_com(0x28);lcd_com(0x0c);void display_char(unsigned char x,uns
26、igned char y,unsigned char dat)unsigned char addr;addr=y0?(0x80+0x40+x):(0x80+x) ;lcd_com(addr);lcd_data(dat);void display_str(unsigned char x,unsigned char y,unsigned char *dat)unsigned char addr;addr=y0?(0x80+0x40+x):(0x80+x) ;lcd_com(addr);while(lcd_data(*dat+),*dat) ;void clear(void) /清屏子函数基于 AV
27、R 单片机的步进电机控制器19display_str(0,0,“ “);/*JHD162A.c(结束 )*/*PWM.c*#include“head.h“void PWM(unsigned pps) /脉冲控制函数counter=0;vn=0;topfix=1000000/pps;n1=(10000-topfix)/STEP+2)*(2*N) ;if(nn2) display_str(0,0,“move down.! “) ; else display_str(0,0,“isopluse.!“) ;adcdisplay();/*PWM.c(结束)*基于 AVR 单片机的步进电机控制器20/*L
28、297.c*#include“head.h“void double_half_mode1(void) /半步工作方式HALF;S_CONTROL;void double_full_mode2(void) /两相激磁基本步距FULL;S_CONTROL;/on-off mode模式执行子函数void L297_1(unsigned char mode ,char direction,unsigned pps) ky=0;n=0xffffffff;L297_OUT;S_RESET;switch(mode) /L297工作模式选择case 1: double_half_mode1(); break;
29、case 2: double_full_mode2(); break;default : display_str(0,0,“mode error!“);switch(direction) /正反方向选择case +: CW; break;case -: CCW; break;基于 AVR 单片机的步进电机控制器21default : display_str(0,0,“direction error!“);PWM(pps);display_str(0,0,“ Stop! “);/ dot-place mode 模式执行子函数void L297_2(unsigned char mode ,char
30、 direction,unsigned pps) ky=1;L297_OUT;S_RESET;switch(mode) /L297工作模式选择case 1: double_half_mode1(); break;case 2: double_full_mode2(); break;default : display_str(0,0,“mode error!“);switch(direction) /正反方向选择case +: CW; break;case -: CCW; break;default : display_str(0,0,“direction error!“);n=n*2;PWM(
31、pps); /调用PWM函数/*L297.c(结束)*/*interrupt_def.c*#include“head.h“基于 AVR 单片机的步进电机控制器22/*输出比较匹配A中断服务子程序 */SIGNAL(SIG_OUTPUT_COMPARE1A) /中断服务程序 ,脉冲数、频率控制)counter+; /脉冲计数器vn+; /加速间隔if(counter=n) CLI; CLOSE_CMP1A; /是否达到/脉冲数,是关闭TC、中断else if(counter2*N) TOP=(TOP-STEP)n2)vn=0;/恒速阶段/*interrupt_def.c(结束)*/*main.c
32、*基于 AVR 单片机的步进电机控制器23#include“head.h“void set_fre(void) /频率设定子函数clear(); /清屏display_str(0,0,“1000pps“);while(1)do key_value=key();if(key_value=4) return ; while(!key_value) ;if(key_value=2)ch=(ch+1=58)?1:(ch+1) ;fre=(fre+1000=10000)?1000:(fre+1000);else if(key_value=3)ch=(ch-1=48)?9:(ch-1) ;fre=(fre
33、-1000=0)?9000:(fre-1000) ;display_char(0,0,ch);void change_mode(void) /模式选择子函数clear(); /清屏display_str(0,0,str_mode);基于 AVR 单片机的步进电机控制器24while(1)dokey_value=key();if(key_value=4) return; while(!key_value) ;if(key_value=2)|(key_value=3)if(!strcmp(str_mode,“1.wave_mode?“) strcpy(str_mode,“2.direction?“
34、);else if(!strcmp(str_mode,“2.direction?“) strcpy(str_mode,“1.wave_mode?“);clear();display_str(0,0,str_mode);void set_mode(void) /模式设定子函数if(!strcmp(str_mode,“1.wave_mode?“) /“wave_mode“模式则进入,程序体执行 clear();display_str(0,0,str_mode1);while(1)dokey_value=key();if(key_value=4)key1_temp=0; return ; while
35、(!key_value) ;基于 AVR 单片机的步进电机控制器25if(key_value=2)|(key_value=3)if(!strcmp(str_mode1,NORMALSTR) strcpy(str_mode1,HALFMODESTR); mode=MODE1; else if(!strcmp(str_mode1,HALFMODESTR) strcpy(str_mode1,NORMALSTR); mode=MODE2; clear();display_str(0,0,str_mode1);else if(!strcmp(str_mode,“2.direction?“) /否则,进入
36、/ “direction“语句体执行 (接上注释)clear();display_str(0,0,str_mode2);while(1)dokey_value=key();if(key_value=4) key2_temp=0; return ; while(!key_value) ;if(key_value=2)|(key_value=3)if(!strcmp(str_mode2,CORRECTSTR) strcpy(str_mode2,MINUSTR); direction=MINUS; else if(!strcmp(str_mode2,MINUSTR) strcpy(str_mode2,CORRECTSTR); direction=CORRECT;