




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录一、实验目的1二、设计过程22.1 Motor Speed Control工作原理22.2结构分析22.3 实训步骤7三、运行结果8四、程序代码11五、心得体会19六、参考文献21一、实验目的 本程序由5人共同设计,用以实现以下程序:微控制器应用Motor Speed Control程序设计打开Programmers Notepad 。用C语言完成程序的编写,再打开AVR studio,把程序载入到Butterfly实验板进行调试,最终实现由微控制器控制的风扇的转动。过程中,要求有实际的程序,并保证程序的正确性与可操作性,运行可执行程序,得到运行结果,风扇转动,对结果进行分析,结果是否合理,不合理要对实验程序进行重新调试,通过PC机对程序进行故障排查。二、设计过程2.1 Motor Speed Control工作原理微程序控制器的工作原理:是依据读来的机器指令的操作码找到与之对应的一段微程序的入口地址,并按由指令具体功能所确定的次序,逐条从控制存储器中读出微指令,以“驱动”计算机各功能部件正确运行。 微程序控制的基本思想,就是仿照通常的解题程序的方法,把操作控制信号编成所谓的“微指令”,存放到一个只读存储器里当机器运行时,一条又一条地读出这些微指令,从而产生全机所需要的各种操作控制信号,使相应部件执行所规定的操作。2.2结构分析参考课本,将书上编写好的程序载入相应的实验电路板中。实验器件:一个9V的电动机,一个9V的电池,一个9V的电池连接器,一个4N28光隔离器,一个TIP115功率晶体管,一个150Ohm 电阻,还有一个2.2k的电阻。我已经包括了简单原理的光导体,它帮助减少我们在修改这一电路的状态,以致我们将破坏这个微控制器。我实际上设法将光导体和大功率的晶体管燃烧,当以开玩笑的言行做这个设计。至少对我来说,这不是太夸张了。因为这不是一个电子文本,我们不需要学习关于电流是怎么工作的。对应插图,我们就不会有任何的问题。画出原理图打开Programmers Notepad软件设计出实验程序打开AVR studio把程序载入到Butterfly实验板进行调试。具体过程:1.马达可以用泡沫芯板切割下来组成和黏贴来作为底部,左边直立部分用于下一个工程来做光导体。Figure21:Motor BaseFigure 22 :Motor Wheel Stationary and Spinning2.风扇部分类似于车轮的模式在课本的附录6,剪下来贴在一张比较坚实的薄硬纸板上,用电胶带贴在轴上,使得轮子中心部分沿着径向是可滑动的,工作的。如图的抠图图象用于下一个工程。光导体的引脚1对应3V光导体的引脚2 对应一个200ohm 的电阻200ohm 的电阻对应电池的接地。光导体的引脚3对应PORTB 引脚4。光导体引脚4对应电池的接地。Figure24 : Opto Interrupter Glued on Motor Base3.我们用一个光隔离器来隔离电机功率电路从而帮助减少在蝴蝶效应中产生爆炸的可能性。光绝缘体是一个类似于光隔离器的装置,它有一个空中通道在IR 灯发光二极管和IR检测晶体管之间,如图23。它这个不透明的对象通过二极管和检测器导致晶体管熄灭因此电流“中断”。我们可以把晶体管联结到蝴蝶效应的引脚和检测器的中断上。你有没有注意到在图22中的轮子的开关?Figure 23: Opto Interrupt Switch H21A1如果你拼凑电机基地,使车轮通过在光绝缘体槽旋转时,每次开放通行证。晶体管的开启和关闭时回槽已经过去。如果我们写我们的软件,以便于附着在光绝缘体引脚电压变化导致的蝴蝶中断,我们可以法庭的中断。如果我们指望正好一秒,我们有多少次每秒旋转的车轮,这是在HZ.COOL转速!到光隔离器焊接长的电线,然后添加电工胶带,以防止短路的腿。下仔细胶水到在一个位置索姆电机基地,通过它旋转的车轮。确保车轮平衡,会变成干净(说起来容易,然后完成),完全封锁和解除封锁和解除封锁的车轮转的光隔离器插槽。图22.面包板布线如下图:2.3 实训步骤(1) 启动运行programmers软件做相应设计,如图:(2) 打开控制程序pc_comm.c和makefile文件,按相应步骤进行编译.(3) 编译无误后,打开AVR studio 4软件,如图:(4) 在上图中打开pc_comm.cof文件,装入给定程序模板,运行演示;(5) 运行成功三、运行结果截图如下:Figure 25: Speedometer四、程序代码/ Demonstrator.c Motor Speed Control version#include PC_Comm.h#include Demonstrator.hunsigned char milliseconds = 0;unsigned int second = 0; / count to 1000 and trigger one second eventunsigned int speed = 0; / IR detector count per secondunsigned int lastspeed = 0; / IR detector count per secondvoid initializer()/ Calibrate the oscillator: OSCCAL_calibration(); / Initialize the USARTUSARTinit();/ Set for pin change on PINB0DDRB = (1 PINB0); / set pin 0 to outputPORTB = (1 PINB0); / set pin 0 to enable pullupPCMSK0 = (1 PINB0); / EIFR = (1 7); / flag for PCINT15-8EIMSK = (1 7); / mask for PCINT15-8DDRB = 0X00; / set PORTB for input PORTB = 0xFF; / enable pullup on for input/ set PORTD for outputDDRD = (1 PIND0); / set pin 0 to outputPORTD = (1 PIND0); / set pin 0 to enable pullupmilliSecInit(127); / 50% duty cycle 1kHz signal/ say hellosendString(rPC_Comm.c ready to communicate.r); / identify yourself specificallysendString(You are talking to the Motor Speed Control demo.r);sendString(setxxx to set speedr);void parseInput(char s)/ parse first characterswitch (s0)case s:if( (s1 = e) & (s2 = t)parse_set(s);break;case d:if( (s1 = e) & (s2 = m) & (s3 = o) & (s4 = ?) )sendString(You are talking to the Motor Speed Control demo.r);break;default:sendString(rYou sent: );sendChar(s0);sendString( - I dont understand.r);break;s0 = 0;int parse_set(char s)char set11;unsigned char i = 3, j = 0;while( (si != 0) & (j = 0) & (si 4)/ must be 256sendString(Error - Parse_set number too large);return 0;elseset_speed(atoi(set);return 1;void set_speed(int count)char speed11;sendString(Setting the Compare Timer Count to: );itoa(count,speed,10);sendString(speed);sendChar(r);milliSecInit(count);/*The USART init set the system oscillator to 2 mHz. We set the Timer0 prescalerto clk/8 which gives a 250 kHz input to the timer/counter. A compare of 250 throwsan interrupt every millisecond.*/void milliSecInit(unsigned char count) / Enable timer0 compare interruptTIMSK0 = (1OCIE0A);/ Sets the compare valuesetOCR0A(count);/ Set PWM Phase Correct mode, CLK/8 prescalerTCCR0A = (0FOC0A)|(0WGM01)|(1WGM00)|(1 64)count = 0;string0 = 0;sendString(Error - received 64 characters); return 0;char isCharAvailable()/ Does the RX0 bit of the USART Status and Control Register/ indicate a char has been received?if ( (UCSR0A & (0x80) ) return 1;else return 0;char receiveChar()/ Return the char in the UDR0 registerreturn UDR0;void sendChar(char data) int i = 0; / To send data with the USART put the data in the USART data register UDR0 = data; / Check to see if the global interrupts are enabled if(SREG & 0x80) / Wait until the byte is sent or we count outwhile ( !(UCSR0A&0x40) & (i10000) )i+; else / Wait until the byte is sent while( !(UCSR0A&0x40) ); / Clear the TXCflag UCSR0A=UCSR0A|0x40; void sendString(char s)int i = 0;while(i 64) / dont get stuck if it is a bad stringif( si = 0 ) break; / quit on string terminatorsendChar(si+);void USARTinit() / Increase the oscillator to 2 Mhz for the 19200 baudrate: CLKPR = (1CLKPCE); / set Clock Prescaler Change Enable / set prescaler = 4, Inter RC 8Mhz / 4 = 2Mhz CLKPR = (18); UBRR0L = 12;/(unsigned char)baudrate; / Enable 2x speed change UCSR0A = (1U2X0); / Enable receiver and transmitter UCSR0B = (1RXEN0)|(1TXEN0)|(0RXCIE0)|(0UDRIE0); / Set the USART to asynchronous at 8 bits no parity and 1 stop bit UCSR0C = (0UMSEL0)|(0UPM00)|(0USBS0)|(3UCSZ00)|(0UCPOL0); / Enable interrupts sei(); / Setup the interrupt mask and flagsPCMSK1 = (1PINB6) | (1PINB4); / set pin-change interrupt mask EIFR = (1PCIF1); / clear external intterupt flag 1EIMSK = (1PCIE1); / enable external interrupt 1 /Calibrate the internal OSCCAL byte, using the external /32,768 kHz crystal as referencevoid OSCCAL_calibration(void) unsigned char calibrate = 0;/FALSE; int temp; unsigned char tempL; CLKPR = (1CLKPCE); / set Clock Prescaler Change Enable / set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz CLKPR = (1CLKPS1) | (1CLKPS0); TIMSK2 = 0; /disable OCIE2A and TOIE2 ASSR = (1AS2); /select asynchronous operation of timer2 (32,768kHz) OCR2A = 200; / set timer2 compare value TIMSK0 = 0; / delete any interrupt sources TCCR1B = (1CS10); / start timer1 with no prescaling TCCR2A = (1CS20); / start timer2 with no prescaling while(ASSR & 0x01) | (ASSR & 0x04); /wait for TCN2UB and TCR2UB to be cleared / wait for external crystal to stabilisefor(int i = 0; i 10; i+)_delay_loop_2(30000); while(!calibrate) cli(); / mt _disable_interrupt(); / disable global interrupt TIFR1 = 0xFF; / delete TIFR1 flags TIFR2 = 0xFF; / delete TIFR2 flags TCNT1H = 0; / clear timer1 counter TCNT1L = 0; TCNT2 = 0; / clear timer2 counter while ( !(TIFR2 & (1OCF2A) ); / wait for timer2 compareflag TCCR1B = 0; / stop timer1 sei(); / _enable_interrupt(); / enable global interrupt if ( (TIFR1 & (1TOV1) ) temp = 0xFFFF; / if timer1 overflows, set the temp to 0xFFFF else / read out the timer1 counter value tempL = TCNT1L; temp = TCNT1H; temp = (temp 6250) OSCCAL-; / the internRC oscillator runs to fast, decrease the OSCCAL else if (temp 6120) OSCCAL+; / the internRC oscillator runs to slow, increase the OSCCAL else calibrate = 1;/TRUE; / the interRC is correct TCCR1B = (1CS10); / start timer1 五、心得体会经过了2011年6月13日至2011年6月17日为期一周的C语言课程设计。在这个星期里,我们在专业老师的带领下进行了c语言程序实践学习。在这之前,我们已经对c语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里面的好多东西还是很陌生,更多的在运用起来的时候还是感到很棘手,毕竟,万事开头难嘛。 由于时间的关系,我们的这次实践课程老师并没有给我们详细的介绍,只是给我们简单的介绍了几个比较重要的实际操作。上机实验是学习程序设计语言必不可少的实践环节,特别是c语言灵活、简洁,更需要通过编程的实践来真正掌握它。对于程序设计语言的学习目的,可以概括为学习语法规定、掌握程序设计方法、提高程序开发能力,这些都必须通过充分的实际上机操作才能完成。 学习c程序设计语言除了课堂讲授以外,必须保证有不少于课堂讲授学时的上机时间。因为学时所限,课程不能安排过多的统一上机实验,所以希望学生有效地利用课程上机实验的机会,尽快掌握用c语言开发程序的能力,为今后的继续学习打下一个良好的基础。个人认为课程上机实验的目的,不仅仅是验证教材和讲课的内容、检查自己所编的程序是否正确,课程安排的上机实验的目的可以概括为如下几个方面:1、加深对课堂讲授内容的理解课堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用c语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致。学习c语言不能停留在学习它的语法规则,而是利用学到的知识编写c语言程序,解决实际问题。即把c语言作为工具,描述解决实际问题的步骤
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农发行沧州市吴桥县2025秋招数据分析师笔试题及答案
- 2025无人机资格证模拟试题含答案详解【能力提升】
- 执业药师之《药事管理与法规》通关测试卷附答案详解(达标题)
- 浦发银行芜湖市弋江区2025秋招笔试EPI能力测试题专练及答案
- 民生银行宁波市宁海县2025秋招笔试行测高频题及答案
- 驾校安全考试题及答案
- 光大银行上饶市信州区2025秋招笔试价值观测评题专练及答案
- 农发行长沙市望城区2025秋招笔试性格测试题专练及答案
- 2025自考专业(汉语言文学)测试卷【考点提分】附答案详解
- 招商银行重庆市永川区2025秋招半结构化面试题库及参考答案
- otc药品管理办法
- 康复医学科病历书写规范与质量控制
- 商用厨房设计汇报
- 战术搜索教学课件
- 教科版五年级科学上册第一单元《光》测试卷及答案(含四题)
- Linux操作系统基础任务式教程(慕课版)课件 任务4 使用Linux操作系统中的硬盘
- 自控系统报警管理制度
- 口腔服务5S管理
- 保安投诉管理制度
- 2025年高考江苏卷物理真题(原卷版)
- 【公开课】种子植物+第2课时课件-2024-2025学年人教版生物七年级上册
评论
0/150
提交评论