北航机电控制作业三.docx
- 文档编号:3774919
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:14
- 大小:378.81KB
北航机电控制作业三.docx
《北航机电控制作业三.docx》由会员分享,可在线阅读,更多相关《北航机电控制作业三.docx(14页珍藏版)》请在冰豆网上搜索。
北航机电控制作业三
《机电控制工程技术》
任务三:
AVR单片机实验
班级:
100712
学号:
10071158
姓名:
杨永真
2013-06-01
目录
一、实验目的3
二、实验任务3
三、实验设备3
四、背景知识3
1.实验箱开发板介绍4
2.了解ATmega8单片机5
3.步进电机的控制5
五、单片机设置7
六、单片机程序设计7
(1)编写软件流程图7
(2)编写程序9
七、调试程序9
八、学习心得9
九、附录10
一、实验目的
(1)掌握AVR单片机系统简单应用;
(2)学习使用单片机编程软件ICCV7forAVR以及烧写软件progisp;
(3)了解并使用ATmega8单片机及其外围电路;
(4)学习使用单片机控制步进电机。
二、实验任务
(1)使用中断0,1来控制步进电机的方向;
(2)通过定时器1和AD采样实现一定频率脉冲的产生进而控制步进电机的转速;
(3)通过电位计控制电机转速,按键控制转向,并在数码管上稳定的显示当前转速。
三、实验设备
(1)机电控制工程实验教学平台实验箱;
(2)Pc一台。
四、背景知识
1.实验箱开发板介绍
ATmega8的最小系统包括:
晶振(11.059MHZ),滤波电路,复位电路,ISP下载;
外围器件包括4位数码管及其驱动芯片ZLG7289,4个LED灯,2个中断按钮,1个旋转电位计,以及24BYJ48A型步进电机和L298芯片。
2.了解ATmega8单片机
(1)4位数码管由ZLG7289芯片驱动,采用的驱动方式为动态显示,ATmega8通过PD5~7管脚与ZLG7289之间进行数据传送。
(2)4个LED灯与PC0~3管脚相连,当管脚输出低电平时,LED点亮。
(3)2个中断开关与PD2、PD3相连,其中断方式可以为电平触发和沿触发。
(4)旋转电位计输出电压为0~5V,与ADC7相连,通过ATmega8中ADC模块可以得到10位精度的电压数字量值。
3.步进电机的控制
本次实验用到的是减速永磁式步进电机,型号是24BYJ48A,工作电压为12V,采用AVR单片机作为主控单元,L298作为驱动芯片,L298芯片与ATmega8通过PB1~4相连。
控制框图如下:
该步进电机的控制采用四相单双八拍,数值表如下,在单片机程序中延时一段时间后按顺序轮转输出以使其正转或反转。
其步距角
,其转速计算公式为
.
引脚PB1、PB3、PB2、PB4分别控制步进电机的A、B、C、D四相(见下图),控制拍子顺序倒置即让电机反转;速度控制实际上就是控制系统发出脉冲的频率。
相关程序如下
#defineA()(PORTB=0B00000010)
#defineB()(PORTB=0B00001000)
#defineC()(PORTB=0B00000100)
#defineD()(PORTB=0B00010000)
#defineAB()(PORTB=0B00001010)
#defineBC()(PORTB=0B00001100)
#defineCD()(PORTB=0B00010100)
#defineDA()(PORTB=0B00010010)
if(step_choice==EIGHTBEATS)//四相八拍
{
if(dir_flag==FORWARD)
{
if(step==0)A();
elseif(step==1)AB();
elseif(step==2)B();
elseif(step==3)BC();
elseif(step==4)C();
elseif(step==5)CD();
elseif(step==6)D();
elseif(step==7)DA();
}
elseif(dir_flag==BACKWARD){…}
step++;
if(step==8)step=0;
}
五、单片机设置
(1)CPU设置:
选择M8,晶振选11.059MHZ,选择INT0和INT1,选择下降沿中断;
(2)端口设置:
portB1~4,portC0~3,portD5~7改为输出(O),值默认为零;
(3)时间计数器:
选择Timer1,计数溢出中断,初始计时时间选择50HZ;
(4)ADC模块设置:
启用ADC模块,ADC模块使能,选用开始转换和连续转换以及ADC换结束中断使能,10位精度,右对齐;
六、单片机程序设计
(1)编写软件流程图
(2)编写程序
本实验的程序涉及到中断触发、LED显示、AD采集等内容,因此程序有些复杂。
整个程序的主要思路:
电机转向由外部中断INT0和INT1控制,从而改变相序;电机转速是由电位计控制,由AD7采集电量并模数转换后通过公式转换成定时计数器的初值,从而在定时计数溢出中断程序中,执行电机换向。
在程序编写软件ICCV7forAVR中建立一个project,在该project中建立一个C程序,并利用ApplicationBuilder建立初始程序,最后再添加其他代码,完成整个程序。
完整的程序代码见附录。
七、调试程序
在调试过程中,遇到了很多问题,比如g7289的头文件没有添加还有delay函数的应用,除此之外在程序语言上有很多问题,主要是由于对语言不够熟练,还有程序逻辑的问题,比如定时计数器的应用等等,不过我们都一一改正了过来,最终调试成功。
最后,将写好的程序利用progisp烧写入单片机中。
八、学习心得
通过本次试验,我对AVR单片机有了初步的了解,学习了单片机的硬件知识、I/O输入输出、定时器、AD数模转换、数码管显示、串口通信、步进电机的控制以及单片机编程等等知识,使我对单片机有了一定的认识。
本次实验是通过电位计控制电机转速,按键控制转向,并在数码管上稳定的显示当前转速。
这个实验综合了所学的单片机的知识,把很多内容联系起来完成对步进电机的稳定控制。
在编程过程中,我们遇到了很多困难,虽然整体的思路可以把握,但是对单片机的语言还没有掌握的很好,总是出现各种各样的问题。
在经过了查阅大量资料和很多次调试后,终于调试成功,我们的努力也没有白费。
以后我会继续学习单片机,把单片机真正学懂学透,并学以致用。
九、附录
#include
#include
#include"g7289.h"
#include"delay.h"
#defineADC_Filter_Num10
#defineA()(PORTB=0B00000010)
#defineB()(PORTB=0B00001000)
#defineC()(PORTB=0B00000100)
#defineD()(PORTB=0B00010000)
#defineAB()(PORTB=0B00001010)
#defineBC()(PORTB=0B00001100)
#defineCD()(PORTB=0B00010100)
#defineDA()(PORTB=0B00010010)
intdir_flag=0;
charstep=0;
unsignedintdigtemp,temp;
intnum=0;
floatsum=0;
floatf=0;
charcount=0;
voidport_init(void)
{
PORTB=0x00;
DDRB=0x1E;
PORTC=0x00;
DDRC=0x0F;
PORTD=0x00;
DDRD=0xE0;
}
//TIMER1initialize-prescale:
1024
//WGM:
0)Normal,TOP=0xFFFF
//desiredvalue:
50Hz
//actualvalue:
50.232Hz(0.5%)
voidtimer1_init(void)
{
TCCR1B=0x00;
TCNT1H=0xFF;
TCNT1L=0x29;
OCR1AH=0x00;
OCR1AL=0xD7;
OCR1BH=0x00;
OCR1BL=0xD7;
ICR1H=0x00;
ICR1L=0xD7;
TCCR1A=0x00;
TCCR1B=0x05;
}
#pragmainterrupt_handlertimer1_ovf_isr:
iv_TIM1_OVF
voidtimer1_ovf_isr(void)
{
TCNT1H=0xFF;//reloadcounterhighvalue
TCNT1L=count;//reloadcounterlowvalue
if(dir_flag==0)
{
if(step==0)A();
elseif(step==1)AB();
elseif(step==2)B();
elseif(step==3)BC();
elseif(step==4)C();
elseif(step==5)CD();
elseif(step==6)D();
elseif(step==7)DA();
}
elseif(dir_flag==1)
{
if(step==0)DA();
elseif(step==1)D();
elseif(step==2)CD();
elseif(step==3)C();
elseif(step==4)BC();
elseif(step==5)B();
elseif(step==6)AB();
elseif(step==7)A();
}
step++;
if(step==8)step=0;
}
//ADCinitialize
//Conversiontime:
75uS
voidadc_init(void)
{
ADCSR=0x00;//disableadc
ADMUX=0x07;//selectadcinput7
ACSR=0x80;
ADCSR=0xEE;
}
#pragmainterrupt_handleradc_isr:
iv_ADC
voidadc_isr(void)
{
digtemp=ADCL;
digtemp|=(int)ADCH<<8;
//conversioncomplete,readvalue(int)using...
//value=ADCL;//Read8lowbitsfirst(important)
//value|=(int)ADCH<<8;//read2highbitsandshiftintotopbyte
if(digtemp>800)
PORTC=0xf0;
elseif(digtemp>600)
PORTC=0x01;
elseif(digtemp>400)
PORTC=0x03;
elseif(digtemp>200)
PORTC=0x07;
else
PORTC=0xff;
}
#pragmainterrupt_handlerint0_isr:
iv_INT0
voidint0_isr(void)
{
dir_flag=0;//externalinteruptonINT0
}
#pragmainterrupt_handlerint1_isr:
iv_INT1
voidint1_isr(void)
{
dir_flag=1;
}
//callthisroutinetoinitializeallperipherals
voidinit_devices(void)
{
//stoperrantinterruptsuntilsetup
CLI();//disableallinterrupts
port_init();
timer1_init();
adc_init();
MCUCR=0x0A;
GICR=0xC0;
TIMSK=0x04;//timerinterruptsources
SEI();//re-enableinterrupts
//allperipheralsarenowinitialized
}
//
voidmain(void)
{
init_devices();
while
(1)
{
temp=digtemp;
if(num<10)
{
sum+=temp;
num++;
}
else
{
num=0;
sum=sum/10;
f=50.0+(450.0/1023.0)*sum;
count=256-10799.8/f;
sum=0;
G7289_SendByte(0xa4);
Show_num(f);
delay(250);
}
}
//insertyourfunctionalcodehere...
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北航 机电 控制 作业
![提示](https://static.bdocx.com/images/bang_tan.gif)