基于C51单片机的直流电机PWM调速控制(包含原理图及C源...
----
基于C51单片机的直流电机PWM调速控制
--SQ
这是最近一阶段自己学习所获,现分享与大家。
这里采用AT89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等
注:考虑小直流电机自身因素,调速范围仅设有四级
电路
模拟电路李宁答案12数字电路仿真实验电路与电子学第1章单片机复位电路图组合逻辑电路课后答案
原理图:
C语言程序源代码:
/******************** 硬件资源分配*********************/ 数码管:
显示电机状态(启停、正反、速度)、运行时间、是否转弯
按键:
K4 启动/暂停
K3 正反转/转弯允许
K2 加速/左转/运行时间清零
K1 减速/右转/停止
定时器:
T0 数码管动态显示,输出PWM
T1 运行时间记录
********************************************************/
/*******主程序文件PWM.c******/
#include
-
----
#include "Afx.h"
#include "Config.c"
#define CIRCLE 5 //脉冲周期
//按键定义
uchar key,key_tmp=0, _key_tmp=0;
//显示定义
uchar LedState=0xF0; //LED显示标志,0xF0不显示,Ox00显示
uchar code LED_code_d[4]={0xe0,0xd0,0xb0,0x70}; //分别选通1、2、3、4位
uchar dispbuf[4]={0,0,0,0}; //待显示数组 uchar dispbitcnt=0; //选通、显示的位 uchar mstcnt=0;
uchar Centi_s=0,Sec=0,Min=0; //分、秒、1%秒
//程序运行状态标志
bit MotState=0; //电机启停标志 bit DirState=0; //方向标志 0前,1后 uchar State1=-1;
uchar State2=-1;
uchar State3=0;
uchar State4=-1;
uchar LSpeed=0;
uchar RSpeed=0;
//其他
uint RunTime=0;
uint RTime_cnt=0;
uint LWidth;
uint RWidth; //脉宽
uint Widcnt=1;
uint Dispcnt;
//
函
关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函
数声明
void key_scan(void);
void DisBuf(void);
void K4(void);
void K3(void);
void K2(void);
void K1(void);
void disp( uchar H, uchar n );
-
----
void main(void)
{
P1|=0xF0;
EA=1;
ET0=1;
ET1=1;
TMOD=0x11;
TH0=0xFC;
TL0=0x66; //T0,1ms定时初值
TH1=0xDB;
TL1=0xFF; //T1,10ms定时初值
TR0=1;
Widcnt=1;
while(1)
{
key_scan();
switch(key)
{
case 0x80: K1(); break;
case 0x40: K2(); break;
case 0x20: K3(); break;
case 0x10: K4(); break;
default:break;
}
key=0;
DisBuf();
LWidth=LSpeed;
RWidth=RSpeed;
}
}
//按键扫描**模拟触发器防抖
void key_scan(void) {
key_tmp=(~P3)&0xf0;
if(key_tmp&&!_key_tmp) //有键按下
{
key=(~P3)&0xf0;
}
_key_tmp=key_tmp ; }
//按键功能处理/逻辑控制
void K4(void)
-
----
{
if(State4==-1)
{
State4=1;
TR1=1;
dispbuf[3]=1;
LedState=0x00; //打开LED
MotState=1; //打开电机
LSpeed=1;
RSpeed=1; //初速设为1
}
else if(State4==1)
{
State4=0;
TR1=0;
MotState=0; //关闭电机
}
else if(State4==0)
{
MotState=1;
if(State3==0)
{
State4=1;
TR1=1;
}
else if(State3==1)
{
LSpeed=2;
RSpeed=2;
}
}
}
void K3(void)
{
if(State4==1)
DirState=!DirState;
if(State4==0)
{
if(State3==0)
{
State3=1; //可以转向标志 1可以,0不可以
TR1=1;
dispbuf[3]=9;
MotState=1;
-
----
LSpeed=2;
RSpeed=2;
}
else if(State3==1)
{
State3=0;
TR1=0;
dispbuf[3]=0;
MotState=0;
}
}
}
void K2(void)
{
if(State4==1&&LSpeed<4&&RSpeed<4)
{
LSpeed++;
RSpeed++;
}
else if(State4==0)
{
if(State3==0)
{
//State4=-1;
//LedState=0xF0;
MotState=0;
Sec=0;
Min=0;
}
else if(State3==1&&LSpeed<4&&RSpeed<4)
{
//TurnState=0;
LSpeed=2;
RSpeed++;
}
}
}
void K1(void)
{
if(State4==1&&LSpeed>1&&RSpeed>1)
{
LSpeed--;
RSpeed--;
-
----
}
else if(State4==0)
{
if(State3==0)
{
State4=-1;
LedState=0xF0;
MotState=0;
}
else if(State3==1&&LSpeed<4&&RSpeed<4)
{
//TurnState=1;
LSpeed++;
RSpeed=2;
}
}
}
//显示预处理
void DisBuf(void) {
if(RTime_cnt==100)
{
Sec++;
RTime_cnt=0;
}
if(Sec==60)
{
Min++;
Sec=0;
}
if(State4==1)
{
dispbuf[0]=Sec%10;
dispbuf[1]=Sec/10;
dispbuf[2]=Min;
if(!DirState) //正转
dispbuf[3]=LSpeed;
if(DirState) //反转
dispbuf[3]=LSpeed+4;
}
if(State4==0)
-
----
{
if(State3==0)
{
dispbuf[0]=Sec%10;
dispbuf[1]=Sec/10;
dispbuf[2]=Min;
dispbuf[3]=0;
}
if(State3==1)
{
dispbuf[0]=RSpeed;
dispbuf[1]=LSpeed;
dispbuf[2]=Min;
dispbuf[3]=9;
}
}
}
//LED驱动
void disp( uchar H, uchar n ) {
P1=n;
P1|=LedState ;
P1|=LED_code_d[H];
}
//T0中断**显示/方波输出
void Time_0() interrupt 1 {
TH0=0xFC;
TL0=0x66;
Widcnt++;
Dispcnt++;
//电机驱动/方波输出
if(Widcnt>CIRCLE)
{
Widcnt=1;
}
if(Widcnt<=LWidth)
LMot_P=!DirState&&MotState;
else
LMot_P=DirState&&MotState;
LMot_M=DirState&&MotState;
-
----
if(Widcnt<=RWidth)
RMot_P=!DirState&&MotState;
else
RMot_P=DirState&&MotState;
RMot_M=DirState&&MotState;
//显示
if(Dispcnt==5)
{
disp(dispbitcnt,dispbuf[dispbitcnt]);
dispbitcnt++;
if(dispbitcnt==4)
{
dispbitcnt=0;
}
Dispcnt=0;
}
}
//T1中断**运行时间
void Time_1() interrupt 3 {
TH1=0xDB;
TL1=0xFF;
RTime_cnt++;
}
/******配置文件Afx.h******/
#ifndef _AFX_
#define _AFX_
typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong;
#endif
/******IO配置文件Config.c******/
-
----
#ifndef _Config_ #define _Config_ #include "Afx.h" #include
//显示定义
sbit led=P3^2;
//电机引脚定义
sbit LMot_P=P2^2;
sbit LMot_M=P2^3;
sbit RMot_P=P2^0;
sbit RMot_M=P2^1;
#endif
-