基于51單片機的PWM直流電機調速控制程序與仿真,是通過電位器控制直流電機,并將電機運行狀態顯示在LCD上。
PWM直流電機調速控制.rar
(86.12 KB, 下載次數: 73)
2019-5-4 06:19 上傳
點擊文件名下載附件
基于51單片機的PWM直流電機調速控制程序與仿真 下載積分: 黑幣 -5
PWM調速.jpg (159.28 KB, 下載次數: 75)
下載附件
2019-5-4 06:20 上傳
//*************************************************************************************************
//*************************************************************************************************
**
//**<功能>:通過電位器控制直流電機,并將電機運行狀態顯示在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;
}
|