基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

更新时间:2023-08-30 01:31:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

基于C51单片机的直流电机PWM调速控制

--SQ

这是最近一阶段自己学习所获,现分享与大家。

这里采用AT89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等

注:考虑小直流电机自身因素,调速范围仅设有四级

电路原理图:

C语言程序源代码:

/********************硬件资源分配*********************/

数码管:

显示电机状态(启停、正反、速度)、运行时间、是否转弯

按键:

K4启动/暂停

K3正反转/转弯允许

K2加速/左转/运行时间清零

K1减速/右转/停止

定时器:

T0数码管动态显示,输出PWM

T1运行时间记录

********************************************************/

/*******主程序文件PWM.c******/

#include<reg52.h>

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

#include"Afx.h"

#include"Config.c"

#defineCIRCLE5//脉冲周期

//按键定义

ucharkey,key_tmp=0,_key_tmp=0;

//显示定义

ucharLedState=0xF0;//LED显示标志,0xF0不显示,Ox00显示ucharcodeLED_code_d[4]={0xe0,0xd0,0xb0,0x70};//分别选通1、2、3、4位uchardispbuf[4]={0,0,0,0};

uchardispbitcnt=0;

ucharmstcnt=0;

ucharCenti_s=0,Sec=0,Min=0;

//程序运行状态标志

bitMotState=0;

bitDirState=0;

ucharState1=-1;

ucharState2=-1;

ucharState3=0;

ucharState4=-1;

ucharLSpeed=0;

ucharRSpeed=0;

//其他

uintRunTime=0;

uintRTime_cnt=0;

uintLWidth;

uintRWidth;

uintWidcnt=1;

uintDispcnt;

//函数声明

voidkey_scan(void);

voidDisBuf(void);

voidK4(void);

voidK3(void);

voidK2(void);

voidK1(void);

voiddisp(ucharH,ucharn);//待显示数组//选通、显示的位//分、秒、1%秒//电机启停标志//方向标志0前,1后//脉宽

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

voidmain(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)

{

case0x80:K1();break;

case0x40:K2();break;

case0x20:K3();break;

case0x10:K4();break;

default:break;

}

key=0;

DisBuf();

LWidth=LSpeed;

RWidth=RSpeed;

}

}

//按键扫描**模拟触发器防抖

voidkey_scan(void)

{

key_tmp=(~P3)&0xf0;

if(key_tmp&&!_key_tmp)

{

key=(~P3)&0xf0;

}

_key_tmp=key_tmp;

}

//按键功能处理/逻辑控制

voidK4(void)//有键按下

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

{

if(State4==-1)

{

State4=1;

TR1=1;

dispbuf[3]=1;

LedState=0x00;

MotState=1;

LSpeed=1;

RSpeed=1;

}

elseif(State4==1)

{

State4=0;

TR1=0;

MotState=0;

}

elseif(State4==0)

{

MotState=1;

if(State3==0)

{

State4=1;

TR1=1;

}

elseif(State3==1)

{

LSpeed=2;

RSpeed=2;

}

}

}

voidK3(void)

{

if(State4==1)

DirState=!DirState;

if(State4==0)

{

if(State3==0)

{

State3=1;

TR1=1;

dispbuf[3]=9;

MotState=1;//打开LED//打开电机//初速设为1//关闭电机//可以转向标志1可以,0不可以

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

LSpeed=2;

RSpeed=2;

}

elseif(State3==1)

{

State3=0;

TR1=0;

dispbuf[3]=0;

MotState=0;

}

}

}

voidK2(void)

{

if(State4==1&&LSpeed<4&&RSpeed<4){

LSpeed++;

RSpeed++;

}

elseif(State4==0)

{

if(State3==0)

{

//State4=-1;

//LedState=0xF0;

MotState=0;

Sec=0;

Min=0;

}

elseif(State3==1&&LSpeed<4&&RSpeed<4){

//TurnState=0;

LSpeed=2;

RSpeed++;

}

}

}

voidK1(void)

{

if(State4==1&&LSpeed>1&&RSpeed>1){

LSpeed--;

RSpeed--;

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

elseif(State4==0)

{

if(State3==0)

{

State4=-1;

LedState=0xF0;

MotState=0;

}

elseif(State3==1&&LSpeed<4&&RSpeed<4){

//TurnState=1;

LSpeed++;

RSpeed=2;

}

}

}

//显示预处理

voidDisBuf(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)//正转//反转

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

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驱动

voiddisp(ucharH,ucharn){

P1=n;

P1|=LedState;

P1|=LED_code_d[H];

}

//T0中断**显示/方波输出voidTime_0()interrupt1{

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;

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

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中断**运行时间

voidTime_1()interrupt3{

TH1=0xDB;

TL1=0xFF;

RTime_cnt++;

}

/******配置文件Afx.h******/#ifndef_AFX_

#define_AFX_

typedefunsignedcharuchar;typedefunsignedintuint;typedefunsignedlongulong;#endif

/******IO配置文件Config.c******/

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

#ifndef_Config_#define_Config_#include"Afx.h"#include<reg52.h>//显示定义sbitled=P3^2;//电机引脚定义

sbitLMot_P=P2^2;sbitLMot_M=P2^3;sbitRMot_P=P2^0;sbitRMot_M=P2^1;#endif

本文来源:https://www.bwwdw.com/article/432i.html

Top