基于51单片机的PWM直流电机调速控制程序与仿真,是通过电位器控制直流电机,并将电机运行状态显示在LCD上。
PWM直流电机调速控制.rar
(86.12 KB, 下载次数: 73)
//*************************************************************************************************
//*************************************************************************************************
**
//**<功能>:通过电位器控制直流电机,并将电机运行状态显示在LCD上。 **
//**可以通过电位器控制电机转向和速度,修改了PWM计算方法。 **
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************
//* *
//* ******************************头文件及宏定义************************** *
//* *
//*************************************************************************************************
#include "includes.h"
#define TIME1H 0xFF
#define TIME1L 0x9C //定时器1溢出时间:0.1ms
#define MOTORPORT P1 //电机接口。
#define MO_COMMON 0x08 //点击运行状态。
#define MO_OPPOSE 0x06
#define MO_CUTOFF 0x00
#define MO_STOP 0x0A
//*************************************************************************************************
//* *
//* *******************************全局变量***************************** *
//* *
//*************************************************************************************************
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<PWM调制计数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uc_MoCount=0; //PWM调制计数。
unsigned char uc_PWM; //存储PWM。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<DA转换>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uc_DAResult; //存储DA转换结果。
//*************************************************************************************************
//* *
//* ********************************主函数****************************** *
//* *
//*************************************************************************************************
void main()
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<初始化定时器1,用于PWM调制计数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TMOD=0x10;
TH1=TIME1H;
TL1=TIME1L;
TR1=1;
ET1=1;
EA=1; //开总中断。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<初始化LCD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vdInitialize();
vWriteCMD(0xC4);
vShowChar("PWM:");
vWriteCMD(0x81);
vShowChar("Status:");
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<初始化电机>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MOTORPORT=MO_COMMON;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<主循环>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
while(1)
{
uc_DAResult=ucADTransform(); //将DA转换结果赋给uc_MoChange,改变转速。
vWriteCMD(0xC9);
vShowNumber(uc_PWM);
vWriteCMD(0x89); //在LCD上显示电机运行状态。
if(uc_DAResult==128||uc_DAResult==127)
vShowChar("Stop ");
else
{
if(uc_DAResult>128)
vShowChar("Common");
else
vShowChar("Oppose");
}
}
}
//*************************************************************************************************
//* *
//* ****************************定时器1中断,用于PWM调制计数**************************** *
//* *
//*************************************************************************************************
void vTimer0() interrupt 3 //根据DA转换结果计算PWM,PWM值在1~127之间。
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<当DA转换结果等于127或者128时,电机停止>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(uc_DAResult==128||uc_DAResult==127)
{
uc_PWM=0;
MOTORPORT=MO_CUTOFF;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<当DA转换结果大于128时,电机正常运行>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
else
{
if(uc_DAResult>128)
{
uc_PWM=uc_DAResult-128;
if(uc_MoCount<=uc_PWM)
MOTORPORT=MO_COMMON;
else
MOTORPORT=MO_CUTOFF;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<当DA转换结果小于127时,电机反向运行>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
else
{
uc_PWM=127-uc_DAResult;
if(uc_MoCount<=uc_PWM)
MOTORPORT=MO_OPPOSE;
else
MOTORPORT=MO_CUTOFF;
}
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<循环计数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(uc_MoCount<(uc_PWM+2)) //循环计数总是比PWM大1。
uc_MoCount++;
else
uc_MoCount=0;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复定时器1>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH0=TIME1H;
TL0=TIME1L;
}
|