- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于C51单片机的直流电机PWM调速控制
--SQ
这是最近一阶段自己学习所获,现分享与大家。
这里采用AT89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等
注:考虑小直流电机自身因素,调速范围仅设有四级
电路原理图:
C语言程序源代码:
/******************** 硬件资源分配*********************/
数码管:
显示电机状态(启停、正反、速度)、运行时间、是否转弯
按键:
K4 启动/暂停
K3 正反转/转弯允许
K2 加速/左转/运行时间清零
K1 减速/右转/停止
定时器:
T0 数码管动态显示,输出PWM
T1 运行时间记录
********************************************************/
/*******主程序文件PWM.c******/
#include reg52.h
#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
文档评论(0)