![AVR单片机步进电机实验_第1页](http://file4.renrendoc.com/view/ed25c72a644dc473ced1452160986651/ed25c72a644dc473ced14521609866511.gif)
![AVR单片机步进电机实验_第2页](http://file4.renrendoc.com/view/ed25c72a644dc473ced1452160986651/ed25c72a644dc473ced14521609866512.gif)
![AVR单片机步进电机实验_第3页](http://file4.renrendoc.com/view/ed25c72a644dc473ced1452160986651/ed25c72a644dc473ced14521609866513.gif)
![AVR单片机步进电机实验_第4页](http://file4.renrendoc.com/view/ed25c72a644dc473ced1452160986651/ed25c72a644dc473ced14521609866514.gif)
![AVR单片机步进电机实验_第5页](http://file4.renrendoc.com/view/ed25c72a644dc473ced1452160986651/ed25c72a644dc473ced14521609866515.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 机电控制工程技术作 业AVR单片机步进电机实验姓名班级目录 TOC o 1-3 h z u 一、实验目的 PAGEREF _Toc388138515 h 1二、实验任务 PAGEREF _Toc388138516 h 1三、实验设备 PAGEREF _Toc388138517 h 1四、实验思路及过程 PAGEREF _Toc388138518 h 14.1实验箱中基本的器件及其控制方式: PAGEREF _Toc388138519 h 14.2程序流程图 PAGEREF _Toc388138520 h 24.3代码编写 PAGEREF _Toc388138521 h 3五、程序调试 PAG
2、EREF _Toc388138522 h 5六、感想 PAGEREF _Toc388138523 h 7七、项目分工 PAGEREF _Toc388138524 h 7八、附录 PAGEREF _Toc388138525 h 7实验目的学习使用单片机编程软件ICCV7 for AVR以及烧写软件progisp了解并使用ATmega8单片机及其外围电路实验任务通过电位计控制电机转速,按键控制转向,并在数码管上稳定的显示当前转速 实验设备机电控制工程实验教学平台实验箱PC一台实验思路及过程实验箱中基本的器件及其控制方式:实验箱中单片机开发板如下图:图表 SEQ 图表 * ARABIC 1 单片机开
3、发板硬件图解硬件介绍该实验中用到了,ATmega8的最小系统(晶振(11.059MHZ),滤波电路,复位电路,ISP下载,电源),以及外围器件(4位数码管及其驱动芯片ZLG7289,4个LED灯,2个中断按钮,1个旋转电位计,以及24BYJ48A 型步进电机和L298芯片)外围器件的工作原理简介4位数码管由ZLG7289芯片驱动,采用的驱动方式为动态显示,ATmega8通过PD57管脚与ZLG7289之间进行数据传送。4个LED灯与PC03管脚相连,当管脚输出低电平时,LED点亮。2个中断开关与PD2、PD3相连,其中断方式可以为电平触发和沿触发旋转电位计输出电压为05V,与ADC7相连,通过
4、ATmega8中ADC模块可以得到10位精度的电压数字量值。24BYJ48A 型步进电机为4相直流步进电机,其工作电压为12V,由L298芯片控制,L298芯片与ATmega8通过PA14相连。该步进电机的通电方式为四相单双八拍。其步距角=5.625/64其转速计算公式为n=605.625/64f360r/min程序流程图图表 SEQ 图表 * ARABIC 2 程序流程图否是初始化IO初始化定时器开中断采集AD计算电机频率f显示f计算定时器初值T1溢出中断T1重装载初值是否正转正转脉冲反转脉冲外部中断0外部中断1改变方向标志改变方向标志开始代码编写利用ICCV7 for AVR软件编写单片机
5、程序新建一个project,在project中新建一个c程序。利用Application Builder按钮辅助建立C程序。CPU设置:选择M8,晶振选11.059MHZ,选择INT0和INT1,选择下降沿中断;端口设置:port B 14,port C03,portD57改为输出(O),值默认为零时间计数器:选择Time1,计数溢出中断,初始计时时间选择50HZADC模块设置:启用ADC模块,ADC模块使能,选用开始转换和连续转换以及ADC 转换结束中断使能,10位精度,右对齐最后在设置中添加主函数即Include”main”()将其他控制代码添入程序,完整程序见附录程序控制的基本思路为,由
6、AD7采集电位计电量并进行模数转换后得到value,该value由对应的函数公式转换为定时计数器初值TCNT1H和TCNT1L,即改变定时长短,然后在定时计数溢出中断程序中,执行电机换相指令,即可以完成由电位器控制电机转速任务;电机正反转控制由外部中断INT0和INT1改变标志变量,进而电机换相方向即可;数码管显示由头文件中对应程序完成。程序调试在基础实验第一次运行时,不管怎么调电位计,电机的运行频率有变化,但是电机怎么都不转。后来查程序发现:当变量count1求得高八位并赋值给TCNT1H后,电机不转,当直接给TCNT1H赋值为0 xFF时,电机转动。在调试扩展实验的时候,发现不管怎么调节电
7、位计,数码管所显示的始终为0000,仔细检查发现了问题所在:计算角度的关系中,由于360/2048这两个数均为整型,相除后得零,应该改为0.087890625*2,。改后,单片机运行出现问题。当旋转电位计到一定值后,按下按键电机方向反向,数码管显示的角度一直减小到负值,同时在正向转动时,电位计旋转到最大值的时候,数码管也不显示360。这种现象有时候出现,有时候则正常,我们反复检查程序也没发现错误。经过思考,我们发现,如果当电机没有转到电位计AD值所对应的角度时,按下反向键就会产生这样的问题。因此在操作过程中,我们要避免电机还没停止的时候按下反向按键。之后程序一切正常。感想程序中容易出现一些不起
8、眼的小错误,比如漏掉分号,或者变量的类型不匹配导致赋值不成功;两个int变量相除时应该先转换为float型或者直接赋值;还有电机运行频率有一定范围,太小电机就不转了。程序最终调试成功,还是有一定成就感的,虽然程序在我们的独立思考和助教的帮助下,并没有那么难,但是毕竟是第一次接触单片机,能够调试成功还是付出了一番努力的。因为单片机对工科生很重要,我想,我在以后的工作和学习中还会再接触到它,我应该再接再励,在以后有机会的时候更加深入研究它,也让自己的能力有进一步的提高项目分工贺英杰:配置,基础实验电位计控制转速,扩展实验电位计控制转角崔家浩:基础实验数码管显示转速,扩展实验数码管显示角度孙汶慧:基
9、础作业四相八拍,扩展作业四相双四拍陈柯宇:LED灯显示速度快慢熊宇飞:基础实验正反转,扩展实验正反转附录基础实验/ICC-AVR application builder : 2014/5/11 23:58:19/ Target : M8/ Crystal: 11.059Mhz#include #include #include g7289.h#include delay.h#define A() (PORTB = 0B00000010) #define B() (PORTB = 0B00001000) #define C() (PORTB = 0B00000100) #define D() (
10、PORTB = 0B00010000) #define AB() (PORTB = 0B00001010) #define BC() (PORTB = 0B00001100) #define CD() (PORTB = 0B00010100) #define DA() (PORTB = 0B00010010)int step=0;int dir_flag=1;int speed=0;int num=0;float sum=0;float f=0;int temp;int value;char count1=0,count2=0;char count=0;void port_init(void)
11、 PORTB = 0 x00; DDRB = 0 x1E; PORTC = 0 x00; /m103 output only DDRC = 0 x0F; PORTD = 0 x00; DDRD = 0 xE0;/TIMER1 initialize - prescale:1024/ WGM: 0) Normal, TOP=0 xFFFF/ desired value: 50Hz/ actual value: 50.232Hz (0.5%)void timer1_init(void) TCCR1B = 0 x00; /stop TCNT1H = 0 xFF; /setup TCNT1L = 0 x
12、29; OCR1AH = 0 x00; OCR1AL = 0 xD7; OCR1BH = 0 x00; OCR1BL = 0 xD7; ICR1H = 0 x00; ICR1L = 0 xD7; TCCR1A = 0 x00; TCCR1B = 0 x05; /start Timer#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVFvoid timer1_ovf_isr(void) /TIMER1 has overflowed TCNT1H = 0 xFF; /reload counter high value TCNT1L = count
13、2; /reload counter low value if(dir_flag = 1) /正转 if(step = 0) A(); else if(step = 1) AB(); else if(step = 2) B(); else if(step = 3) BC(); else if(step = 4) C(); else if(step = 5) CD(); else if(step = 6) D(); else if(step = 7) DA(); else if(dir_flag = 0) /反转 if(step = 0) A(); else if(step = 1) DA();
14、 else if(step = 2) D(); else if(step = 3) CD(); else if(step = 4) C(); else if(step = 5) BC(); else if(step = 6) B(); else if(step = 7) AB(); step+; if(step = 8) step = 0;/ADC initialize/ Conversion time: 150uSvoid adc_init(void) ADCSR = 0 x00; /disable adc ADMUX = 0 x07; /select adc input 0 ACSR =
15、0 x80; ADCSR = 0 xEF;#pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void) value=ADCL; value|=(int)ADCH 800)/旋转电位计输出大小对应LED灯亮灭个数PORTC=0 xf0;else if(value600)PORTC=0 x01;else if(value400)PORTC=0 x03;else if(value200)PORTC=0 x07;elsePORTC=0 xff;/conversion complete, read value (int) using. / valu
16、e=ADCL; /Read 8 low bits first (important) / value|=(int)ADCH 8; /read 2 high bits and shift into top byte#pragma interrupt_handler int0_isr:iv_INT0void int0_isr(void) dir_flag=0;/external interupt on INT0#pragma interrupt_handler int1_isr:iv_INT1void int1_isr(void) dir_flag=1;/external interupt on
17、INT1/call this routine to initialize all peripheralsvoid init_devices(void) /stop errant interrupts until set up CLI(); /disable all interrupts port_init(); timer1_init(); adc_init(); MCUCR = 0 x0A; GICR = 0 xC0; TIMSK = 0 x04; /timer interrupt sources SEI(); /re-enable interrupts /all peripherals a
18、re now initialized/void main(void) init_devices(); while(1) temp=value; if(num10) sum+=temp; num+; else num=0; sum=sum/10; f=50.0+(450.0/1023.0)*sum; /count=255-10799.8/f; /count1=(int)(65535-10799.8/f)/256; count2=(int)(65535-10799.8/f)%256; sum=0; speed=100*60*f/(2*4*8*64); /速度放大100倍 G7289_SendByt
19、e(0 xa4); Show_num(speed); delay(300); /insert your functional code here.扩展实验(16组)/ICC-AVR application builder : 2014/5/13 9:39:19/ Target : M8/ Crystal: 11.059Mhz#include #include #include g7289.h#include delay.h#define A() (PORTB = 0B00000010) #define B() (PORTB = 0B00001000) #define C() (PORTB =
20、0B00000100) #define D() (PORTB = 0B00010000) #define AB() (PORTB = 0B00001010) #define BC() (PORTB = 0B00001100) #define CD() (PORTB = 0B00010100) #define DA() (PORTB = 0B00010010)int step=0;int n=0;int dir_flag=1;int angle=0;/int num=0;/float sum=0;/float f=0;/int temp;int value;int count1=0;int co
21、unt2=2046;void port_init(void) PORTB = 0 x00; DDRB = 0 x1E; PORTC = 0 x00; /m103 output only DDRC = 0 x0F; PORTD = 0 x00; DDRD = 0 xE0;/TIMER1 initialize - prescale:1024/ WGM: 0) Normal, TOP=0 xFFFF/ desired value: 50Hz/ actual value: 50.232Hz (0.5%)void timer1_init(void) TCCR1B = 0 x00; /stop TCNT1
22、H = 0 xFF; /setup TCNT1L = 0 x29; OCR1AH = 0 x00; OCR1AL = 0 xD7; OCR1BH = 0 x00; OCR1BL = 0 xD7; ICR1H = 0 x00; ICR1L = 0 xD7; TCCR1A = 0 x00; TCCR1B = 0 x05; /start Timer#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVFvoid timer1_ovf_isr(void) /TIMER1 has overflowed TCNT1H = 0 xFF; /reload cou
23、nter high value TCNT1L = 0 x35; /reload counter low value if(dir_flag = 1) /正转 if(step = 0) AB(); else if(step = 1) BC(); else if(step = 2) CD(); else if(step = 3) DA(); if (count12*value) PORTB = 0B00000000; else count1+; n+; else if(dir_flag = 0) /反转 if(step = 0) AB(); else if(step = 1) DA(); else
24、 if(step = 2) CD(); else if(step = 3) BC(); if (count22*value) PORTB = 0B00000000; else count2-; n-; step+; if(step = 4) step = 0;/ADC initialize/ Conversion time: 150uSvoid adc_init(void) ADCSR = 0 x00; /disable adc ADMUX = 0 x07; /select adc input 0 ACSR = 0 x80; ADCSR = 0 xEF;#pragma interrupt_ha
25、ndler adc_isr:iv_ADCvoid adc_isr(void) value=ADCL; value|=(int)ADCH 800)PORTC=0 xf0;else if(value600)PORTC=0 x01;else if(value400)PORTC=0 x03;else if(value200)PORTC=0 x07;elsePORTC=0 xff; /conversion complete, read value (int) using. / value=ADCL; /Read 8 low bits first (important) / value|=(int)ADCH 8; /read 2 high bits and shift into top byte#pragma interrupt_handler int0_isr:iv_INT0void int0_isr(void) dir_flag=0; co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湘教版数学七年级上册2.5《整式的加法和减法》听评课记录1
- 人教版九年级数学下册:28.2.2 《应用举例》听评课记录3
- 生态供应链管理合同(2篇)
- 环境检测设备销售代理合同(2篇)
- 人教版九年级数学下册:26.1.1《反比例函数》 听评课记录1
- 鲁教版(五四制)地理六年级上册《学习与探究 学用交通地图》听课评课记录1
- 湘教版地理七年级上册1.2《我们怎样学地理》听课评课记录
- 人教部编版道德与法治七年级下册:6.2 《集体生活成就我》 听课评课记录4
- 2022年新课标八年级上册道德与法治第一单元 走进社会生活 听课评课记录(1、2课共4课时)
- 苏科版数学八年级下册《菱形》听评课记录
- 商业银行的风险审计与内部控制
- 2024项目管理人员安全培训考试题及参考答案AB卷
- 2025年与商场合作协议样本(5篇)
- 网络与社交媒体管理制度
- 2025年新能源汽车销售佣金返点合同范本6篇
- 2025-2030年中国配电变压器市场未来发展趋势及前景调研分析报告
- GB/T 45120-2024道路车辆48 V供电电压电气要求及试验
- 2025年上海市嘉定区中考英语一模试卷
- 润滑油、润滑脂培训课件
- 2025年中核财务有限责任公司招聘笔试参考题库含答案解析
- 寒假综合实践活动作业展示
评论
0/150
提交评论