精品资料(2021-2022年收藏)课程设计报告之直流电机控制C语言版_第1页
精品资料(2021-2022年收藏)课程设计报告之直流电机控制C语言版_第2页
精品资料(2021-2022年收藏)课程设计报告之直流电机控制C语言版_第3页
精品资料(2021-2022年收藏)课程设计报告之直流电机控制C语言版_第4页
精品资料(2021-2022年收藏)课程设计报告之直流电机控制C语言版_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、湖南大学电气院单片机课程设计学院:电气与信息工程学院 班级:07级电气工程及其自动化3班设计者:设计名称:直流电机调速指导老师:张志文 教授 目录 一. 课程设计题目及其实现目标3二. 设计原理图4三. 设计原理及其实现方法5四. 流程图6五. 程序清单7六.课程设计心得13一. 课程设计题目及其实现目标 课程设计题目:直流电机调速 实现的目标 1).通过键盘改变脉冲的占空比从而达到改变转速使得电机转速从高到低,从低到高 2).通过改变pwm的极性从而改变电机的转向,实现正反转 3).能够通过数码显示管显示电机的转速和电机的转向 4).通过启动键唯一启动电机,从而达到防止电机误启动的目的 5)

2、.能够通过键盘快速达到电机预先设定的速度和转向备注:由于没有传感器,所以本课程设计中没有设计测速模块,所显示的速度为理论速度,并非电机的实际转速二. 设计原理图注:本原理图采用proteus绘制三. 设计原理及其实现方法1. 速度调节的实现 通过控制L298的使能端“允许”或者“禁止”,通过改变a(脉冲宽度)的值,从而达到控制PWM脉冲宽度调节电机转速的目的2. 转向的控制 通过L298中的H桥,从AT89C51中的P1_6和P1_7输出控制信号控制BJT的基极电压,控制L298中H桥的BJT通断,从而达到控制电机转向的目的附:A. L298的原理图B.本设计所需要芯片以及作用AT89C51:

3、单片机L298:控制电机驱动和转向 74L408:四与门芯片8255A:用于扩展51端口,作显示用2803:显示缓冲用MAX239:串口通讯芯片四. 流程图 入口 启动 N YP1_5=1,P1_4=1停止P1_5=0 Y 加速 Na=a+n, P1_4=0 Ya>150 Na=150 Y a=a-n, P1_4=0减速 Y P1_6=0,P1_7=1, P1_4=1 Or P1_6=1,P1_7=0, P1_4=1a<10 N N反转/正传 Y a=10 N进入预先设定的值预设速度 Y N电机停转五.程序清单#include<at89x51.h>#include<

4、;motor_ctr.h>#include<absacc.h>#include<stdio.h>#include<intrins.h>#define PA XBYTE0x1FFF /A口地址;#define PB XBYTE0x3FFF /B口地址 ;#define PC XBYTE0x5FFF /C口地址;#define CON XBYTE0x7FFF /*控制字地 */ ;uchar key=0; /定义key为全局变量uint a=100;uchar n=5; /单次增加的步长,用于输出脉冲占空比控制uint k1=0,mn=10; /设置mn为

5、转向标志位uchar bai,shi,ge;uint seg_code11=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xff; /09的七段显示代码;/*THE MAIN PROCESS*/void main()CON=0x80;P1_5=0; /使电机停转 ;TMOD=0x15; /定时器1工作在模式1 TH1=0xFF; /定时器1的溢出中断时间为50ms;TL1=0xb0;ET1=1;TR1=1; while(1) key=GetKey();/*case 1case 9是预先设定的速度,方便电机直接调节到该速度,避免通过 + 键

6、调节*/ switch(key) case '1': a=10;break; case '2': a=25; break; case '3': a=40; break; case '4': a=55; break; case '5': a=70; break; case '6': a=90; break; case '7': a=110;break; case '8': a=130;break; case '9': a=150;break; case

7、'+': P1_4=0;control();break; /电机加速 case '-': control(); break; /-代表减速 case '=': P1_7=0; P1_6=1; mn=0;control(); break; /电机顺时针转 case 'c': P1_7=1; P1_6=0; mn=1;control() ; break;/逆时针转 case '/': control(); /键按下时,电机开始转动 default: break;/不影响电机运行 /*THE END OF MAIN PR

8、OCESS*/*THE INTERRUPTION FUNCTION*/void time()interrupt 3 /中断号为3,即是定时器1溢出中断 /此处是计时50ms中断一次 TR1=0;/此函数用于显示速度 k1+=TL0;display(a/100,a%100/10,a%10,mn); /*if(count=51) sprintf(s,"%04d",k1%1000);/注意sprintf的用法; /确保有四位输出 count=1; k1=0; display(a,bai,shi,ge);*/ TH1=0x3c; TL1=0xb0; TH0=0x00; TL0=0x

9、00; TR1=1;/* THE INTERRUPTION FUNCTION */*THE GETKEY FUNCTION WHICH WAS USED TO GET THE INFORMATION FROM THE KEY */ /*行信号从P1口的低四位读进,列信号从P2口的高四位读进*/uchar GetKey() P1_0=0; P1_1=1; P1_2=1; P1_3=1;P2_0=1;P2_1=1;P2_2=1; P2_3=1;_nop_();_nop_(); / 适当的延时以便消除抖动if(!P2_0)return '7' if(!P2_1)return '

10、;8' if(!P2_2)return '9' if(!P2_3)return '/' P1_0=1; P1_1=0; P1_2=1; P1_3=1;_nop_();_nop_();if(!P2_0)return '4' if(!P2_1)return '5' if(!P2_2)return '6' if(!P2_3)P1_4=0;return '*' P1_0=1; P1_1=1; P1_2=0; P1_3=1;_nop_();_nop_();if(!P2_0)return '1&

11、#39; if(!P2_1)return '2' if(!P2_2)return '3' if(!P2_3)return '-'P1_0=1; P1_1=1; P1_2=1; P1_3=0;_nop_();_nop_();if(!P2_0)return 'c' if(!P2_1)P1_4=0;return '0' / P1_4和P1_5脚通过一个“与”门用来防止误启动 if(!P2_2)return '=' if(!P2_3)return '+'return 0;/*延时程序*/*T

12、HE DELAY FUNCTION*/void delay(uint i) uint j,k;for(;i>0;i-)for(j=10;j>0;j-)for(k=10;k>0;k-);/*THE DISPLAY FUNCTION*/void display(uchar bai,uchar shi,uchar ge ,uint mn) PB=0x08; /0000 1000 PA=seg_codege; delay(2); PB=0x04;/0000 0100 PA=seg_codeshi; delay(2); PB=0x02;/0000 0010 PA=seg_codebai

13、; delay(2); PB=0x01;/0000 0001 PA=seg_codemn;delay(2); /注意这儿的延时越短越好,应为处理终端的时间越短,对电机 / 的实时性显示就越好; /*THE CONTROL FUNCTION*/* 由于参数 a 是一个全局变量,代表着脉冲的占空比,每次调用函数时;必须注意参数 a 值;*/ /* 如果按键为 -,+(加速减速)以及c',=(正转反转)时,不需跳出循环,按其他键时,需要跳出循环,必须需要重新设置占空比*/* P1_4和P1_5脚通过一个“与”门用来防止误启动 */void control() EA=1; while(1) i

14、f(a>=150) a=150; /设置了 a 的最大值,限定了电机的最高速度 if(a<=10) a=10; / 设置了 a 的最小值,限定了电机的最高速度 P1_5=1; / 与P1_4信号形成控制L298的控制信号达到控制转速的目的 delay(a); / 调用延时,形成脉宽的调节 P1_5=0; /电机逐渐停转 ; delay(160-a);/*以下的程序改变 a 的值达到改变脉冲宽度的目的*/ key=GetKey(); if(key='-') / 减速 a=a-n; else if(key='+') a=a+n; / 加速 else if

15、(key='=') / 如果按下=键,则电机顺时针转; P1_6=1; P1_7=0; mn=0; else if(key='c') /反转 P1_7=1; P1_6=0;P1_4=1;mn=1; else if(key='*'|key='0') /如果按下停止键*或者0; P1_5=0;P1_4=1; /ENA=0(P1_5=0)电机停转; break; else if(key!=0)/如果没有按键按下,则继续在此while循环中运行 switch(key) case '1': a=10; break; case

16、 '2': a=25; break; case '3': a=40; break; case '4': a=55; break; case '5': a=70; break; case '6': a=90; break; case '7': a=110; break; case '8': a=130; break; case '9': a=150; break; default : break ; EA=1; 附: motor_ctr.h FILEtypedef un

17、signed char uchar;typedef unsigned int uint ;extern uchar GetKey();extern void delay(uint i);extern void control();void display(uchar bai,uchar shi,uchar ge ,uint mn);六.课程设计心得 两周的课程设计结束了,总得算来,这两周的课程设计体会颇多。这是我们第一次亲自设计一个系统,包括硬件和软件,还自己动手焊接了诸多的元器件,体会到了科研的滋味。 起初我们想用汇编编写的,因为我们才刚刚学过AT89C51的汇编语言,印象很深刻。但是在编写的过程中,我感觉到,用汇编语言,我很难表达出自己的意思,很难达到目的。后来思来想去还是决定改用C语言,毕竟我对C语言自我感觉还是很好的。但是,面对的首要问题是,如何将C语言和硬件结合起来编程,面对这一个问题,我先后从图书馆借来了单片机C语言教程和手把手教你学单片机C语言这两本,老老实实的学习了这方面的内容。但是,随着编程的进行,我发现之前的原理图设计存在问题,因为我原先设计是将列信

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论