单片机应用技术(C 语言版)任务19 制作电动机控制器_第1页
单片机应用技术(C 语言版)任务19 制作电动机控制器_第2页
单片机应用技术(C 语言版)任务19 制作电动机控制器_第3页
单片机应用技术(C 语言版)任务19 制作电动机控制器_第4页
单片机应用技术(C 语言版)任务19 制作电动机控制器_第5页
已阅读5页,还剩26页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

主编:李文华“十四五”职业教育国家规划教材经全国职业教育教材审定委员会审定制作电动机控制器任务19任务要求单片机的fosc=11.0592MHz,P2.0、P2.1引脚上外接直流电机的控制电路,P1.0、P1.1、P1.2、P1.3引脚上外接4只独立式按键S0、S1、S2、S3,用按键控制电动机的运行。其中,S0键是启动/停止复用键,奇数次按S0键时启动电动机运转,偶数次按S0键时停止电动机运行。S1键是左转/右转复用键,奇数次按S1键时电动机左转,偶数次按S1键时电动机右转。S2键是加速键,每按一次S2,电动机的转速就增加一个级别,直至全速,到达全速后再按S2键,电动机的转速不变。S3键是减速键,每按一次S3,电动机的转速就减小一个级别,直至最低速,到达最低速度后再按S3键,电动机的转速不变。相关知识1、复用键的处理方法复用键:按键按下的次数不同,按键具有不同的功能的按键例如,按键第1次按下时的功能是启动,第2次按下的功能是暂停,第3次按下的功能是清0,如此反复,这种按键就是3功能的复用键。

一个按键可以定义成多种功能的复用键,但在实际应用中一般是2种功能的复用键。1、复用键的处理方法含有二功能复用键的按键处理流程含有复用键的按键处理方法先为每个复用键定义一个全局变量kcnt,用来保存每个复用键的按下次数。对于二功能复用键而言,由于复用键的功能只有2种,一般是选用可以记录2种状态的位变量作为按键按下计数器。有键按下并且按键未处理时,再判断按键的键值,若为非复用键,则按前面介绍的方法进行普通按键的功能解释。若为复用键,则将按键的计数值加1,然后依据计数值进行功能解释。对于一位二进制数而言,加1与取反是等价的,但位变量只能对其取反,所以在二功能复用键处理流程中采用对位变量计数器取反来代替按键计数值加1。1、复用键的处理方法二功能复用键的键盘处理程序中的全局变量变量类型功能初值取值含义downbit标识按键是否按下过00:未按下过keytreatedbit标识按键是否解释处理过00:未处理过kcntbit记录按键按下的次数00:第2种功能1、复用键的处理方法bit down,keytreated,kcnt; //定义全局变量……void key(void) //按键处理程序{ucharkeyval; //1定义局部变量,keyval:按键的键值keyport=0xff; //2按键端口置1,准备读按键端口keyval=keyport; //3读按键输入keyval=~keyval; //4键值取反方便判断if(keyval) //5判断键值,0:无键按下{ //有键按下时处理6~18if(down&&!keytreated) //6若10ms前键按下且键未处理{ switch(keyval) //7判断键值 {case 复用键的键值: //8为复用键时处理9~12 kcnt=~kcnt; //9按键计数值加1(1位取反等价于1位加1) if(kcnt) 第1种功能解释 //10计数值为1,解释成第1功能

else第2种功能解释 //11计数值为0,解释成第2功能

break; //12复用键处理结束键盘处理程序的框架结构1、复用键的处理方法

case 非复用键的键值://13为非复用键,进行非复用键功能解释 非复用键的功能解释 //14 } //15 keytreated=1; //16置按键已处理标志} //17down=1; //18置键按下过标志} //19else //20无键按下时,处理21~22{ down=0; //21置键没按下标志

keytreated=0; //22置键没处理标志} //23} //241、复用键的处理方法键盘处理程序的框架结构2、直流电机的正反转控制电机的转向与其两端所加电压的极性相关,给直流电机的两端加上正向电压,直流电机就会正转,加上反向电压,直流电机就会反转。用单片机控制直流电机时常用“H”桥电路控制2、直流电机的正反转控制图中,三极管Q3、Q4、Q5、Q6构成了“H”桥的4个臂,电动机的两端接在桥臂的中点,单片机通过控制桥臂上的三极管导通与截止来改变加在电动机两端电压的极性,从而实现电动机的正反转控制。P2.0=0、P2.1=0时,UAB=0,电动机停止。P2.0=0、P2.1=1时,UAB=-VCC,电动机反转。P2.0=1、P2.1=0时,UAB=VCC,电动机正转。P2.0=1、P2.1=1时,UAB=0,电动机停止。图中,D1、D2、D3、D4为续流二极管,用来保护所并接的三极管。

3、直流电机的调速控制转速n与端电压U的关系式中,I为电机绕组中的电流,R为电枢电路的总电阻,φ为每极的磁通量,K为电机的结构常数。结论:转速n与端电压U成线性关系,调整端电压U就可以调节电机的转速。端电压的调整一般是采用脉冲宽度调制(PWM)控制。调整方法:给电动机的两端加上如图所示的周期固定、脉冲宽度可调的脉冲信号。电动机的端电压U为:3、直流电机的调速控制用定时/计数器模拟产生PWM信号的方法设PWM信号的周期T=Nt0,脉冲宽度TH=nt0,用一个定时/计数器作时长为t0的定时器,用一个全局变量timcnt记录t0时间中断的次数。然后对timcnt值进行判断,timcnt<n时,表示当前处在产生高电平期,则输出高电平。N>timcnt≥n时,表示当前处在产生低电平期,则输出低电平。timcnt=N时,表示已计满了一个脉冲周期,此时将timcnt调整为0,并开始下一周期的输出。3、直流电机的调速控制用定时器模拟产生PWM信号的流程图脉冲周期系数N越大,则输出电压的分辨率越高3、直流电机的调速控制单片机的fosc=11.059MHz,定时/计数器的定时时长为0.1ms,脉冲周期为10ms,用定时/计数器T0模拟产生PWM信号时可选择方式2定时模式,产生PWM信号的程序如下:#include <reg51.h>#define uchar unsigned char#define CPWM 100 //1CPWM:PWM周期系数10ms/0.1ms=100uchar timcnt; //2timcnt:0.1ms中断次数计数器uchar hwide; //3hwide:脉冲宽度系数,程序中改变其值,就可调整脉冲宽度bit pout; //4PWM输出变量,用不同口线输出此变量值即可实现多个PWM口void main(void) //5main函数{ timcnt=0; //6中断次数计数器赋初值0 hwide=1; //7脉宽度系数赋初值1 TMOD=0x02; //8设置T0的工作方式和模式 TH0=256-92; //9装入计数初值0.1ms

TL0=256-92; //10 ET0=1; //11开定时中断

EA=1; //12开全局中断

TR0=1; //13启动T0 while(1) //14死循环{ /*其他事务处理*/ }//15死循环的循环体} //16main函数结束3、直流电机的调速控制//T0中断服务函数,产生PWM信号void tim0(void) interrupt 1 using 1 //17{ timcnt++; //18中断计数次数加1 if(timcnt<hwide) //19若计数次数小于脉宽系数 pout=1; //20输出高电平

else //21若计数次数大于等于脉宽系数

{ if(timcnt<CPWM) //22判断计时是否超过一个周期

pout=0; //23未计满一个周期,则输出低电平

else //24计满一个脉冲周期

{ timcnt=0;//25计数值回0,开始下一周期处理

pout=1; //26输出高电平

} //27计满一个脉冲周期处理结束

} //28计数大于脉宽系数处理结束

/*其他事务处理*/ //29} //30中断服务结束3、直流电机的调速控制【说明】①程序中我们是用变量pout保存PWM输出的。这安排的目的是,便于在程序中动态地选择不同的引脚输出PWM信号。例如,用下列语句代替第15句,就可以依据变量a的值分别从P2.0、P2.1引脚输出PWM信号:if(a) { P21=0; P20=pout; }else { P20=0; P21=pout; }3、直流电机的调速控制②如果要固定地用P2.0引脚输出PWM信号,将第4句改为“sbitpout=P2^0”。③程序中,改变变量hwide的值就可以输出不同脉宽的脉冲信号。任务实施1、搭建电路电路图如下:2、编写软件程序⑴流程图用定时/计数器T0作0.1ms的PWM基准时间定时器,定时/计数器可选用自动重装初值的方式2。PWM的周期选用10ms,PWM的周期系数为100,用全局变量hwide保存脉宽系数,用全局变量pout保存PWM输出。在键盘处理程序中,停止电机时,则将P2.0、P2.1都置为0,启动电机或者切换电机左转时,将P2.1置0,从P2.0引脚输出变量pout的值,切换电机右转时,将P2.0置0,从P2.1引脚输出变量pout的值,加速电机时,增大全局变量hwide的值,减速电机时,减小hwide的值。将键盘处理程序也放在T0定时(0.1ms)中断服务函数中。在程序中引入了另一个软件计数器ktim,对0.1ms定时中断的次数进行计数,当ktim计满10ms(100次)时,就进行一次键盘处理。任务20的流程图如图所示按键处理流程图⑵程序代码#include <reg51.h> //包含定义特殊功能寄存器的头文件reg51.h#define uchar unsigned char //宏定义:用uchar代表unsignedchar#define CPWM 100 //宏定义:CPWM(PWM周期系数)代表100#define keyport P1 //宏定义:keyport代表P1(键盘口为P1口)uchar timcnt; //全局变量定义:timcnt为0.1ms中断次数计数器(PWM用)uchar ktim; //全局变量定义:ktim为0.1ms中断次数计数器(键盘处理用)uchar hwide; //全局变量定义:hwide为PWM脉宽系数bit down,keytreated;//down:10ms前按键按下过,keytreated:按键已处理bit pout; //定义PWM输出变量bit kstart; //定义启/停键按下次数计数器bit kleft; //定义左转/右转按下次数计数器sbit PLEF=P2^0; //定义左转输出控制口sbit PRIG=P2^1; //定义右转输出控制口void key(void); //函数说明,key():按键处理函数2、编写软件程序void main(void) //main函数{ timcnt=0; //0.1ms中断次数计数器赋初值0 ktim=0; //0.1ms中断次数计数器赋初值0 hwide=1; //脉宽系数为1 down=0; //10ms前按键未按下

keytreated=0; //键按下未处理

kstart=0; //启/停键按下0次

kleft=0; //左转/右转键按下0次

TMOD=0x02; //设置T0的模式工作方式:方式2、定时

TL0=256-92; //T0赋初值0.1ms TH0=256-92; // ET0=1; //开T0中断

EA=1; //开全局中断

TR0=1; //启动T0 while(1) //死循环

{PCON=PCON|0x01; }//睡眠CPU} //main函数结束2、编写软件程序//T0中断服务函数void tim0(void) interrupt 1 using 1 { timcnt++; //PWM用0.1ms中断次数计数值加1 if(timcnt<hwide) //计满脉宽时间吗?

pout=1; //脉宽计时未满,输出高电平

else //计时到

{ if(timcnt<CPWM) //计满一个PWM周期吗?

{ pout=0; }//未计满一个PWM周期,则输出低电平

else //计满一个PWM周期

{ timcnt=0; //计时回0 pout=1; //输出高电平

} // } //PWM处理结束

ktim++; //按键用0.1ms中断计数值加1 if(ktim>99) //判断是否计满10ms { ktim=0; //计满10ms则计数值回0 key(); //调用key函数进行键盘处理

} //计满10ms处理结束} //T0中断服务结束2、编写软件程序void key(void) //按键处理函数{uchar keyval; //定义局部变量keyval(按键键值)keyport=0xff; //键盘端口写1,准备读键盘口keyval=keyport; //读键盘口并保存至keyval中keyval=~keyval; //键值取反,方便程序处理if(keyval) //判断是否有键按下{//有键按下if(down&&!keytreated) //若10ms前键按下,并且键未处理{ switch(keyval) //判断键值

{case 0x01: //启/停键按下(复用键) kstart=~kstart; //按键次数加1 if(kstart) //判断按键的次数

{ hwide=1; //奇次按键,解释为启动:脉宽系数数设为1 PRIG=0; //右转控制输出低电平

PLEF=pout; //左转控制输出PWM信号

} //启动功能解释结束

else //停止功能解释

{ PRIG=0; //右转控制输出低电平

PLEF=0; //左转控制输出低电平

} //停止功能解释结束

break; //启/停键解释结束2、编写软件程序

case 0x02: //左转/右转按下(复用键) kleft=~kleft; //按键次数加1 if(kleft) //判断按键的次数

{ PRIG=0; //奇次按键,解释为左转:右转控制输出低电平

PLEF=pout; //左转控制输出PWM信号

} //左转解释结束

else //右转解释

{ PLEF=0; //左转控制输出低电平

PRIG=pout; //右转控制输出PWM信号

} //右转解释结束

break; //左/右转键解释结束 case 0x04: //加速键按下

hwide++; //脉宽系数加1 if(hwide>=CPWM) //超界处理 hwide=CPWM-1; //脉冲系数达到周期系数

break; //加速键处理结束2、编写软件程序

case 0x08: //减速键按下

hwide--; //脉宽系数减1 if(hwide<=1) //超界处理

hwide=1; //若脉冲系数达到最小值1,则赋值1 } // keytreated=1; //置键按下已处理标志} //按键解释结束down=1; //置键已按下标志} //键按下处理结束else //无键按下{ down=0; //置键未按下标志

keytreated=0; //置键未处理标志} //按键处理结束} //key函数结束2、编写软件程序应用总结与拓展直流电机的控制包括正反转控制和调速控制。正反转控制的方法是改变电动机两端电压的极性,其实现方法是用“H”桥控制电动机,用单片机控制“H”桥四臂上三极管或者场效应管的导通与截止,

温馨提示

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

评论

0/150

提交评论