资源简介
在protues平台建立直流电机速度控制仿真系统,通过pic单片机对其开关、加减速、正反转进行控制
代码片段和文件信息
/************交流学习个人 QQ:105609700*******************************/
/**电机速度控制器******/
/******功能描述**********/
/*
开机状态:key1---停止/开启;key2---加速;key3---减速;Key4---方向
*/
/******硬件描述***********/
/*
MPLAB IDE v 8.4 ,HI-TECH C PRO v9.65, PIC16F883, 4MHz
*/
#include
#define key1 RB0//开/关键
#define key2 RB1//加速
#define key3 RB2//减速
#define key4 RB3//方向
const unsigned char ucduty[]={0x170x200x260x2C0X330X3D};//占空比:40%、50%、60%、70%;赋给CCPRxL,低两位忽略。
volatile bit status=0;//0:电机停止状态;1:电机转动状态
volatile bit orient=0;//0:反转;1:正转;
volatile signed int uclevel=0;//档位状态;uclevel=1234;
/****PWM模块初始化****/
void init_CCP(void)
{
CCP1CON=0x3C;//bit5-4:10位占空比的低两位;P1A 和P1C 为高电平有效; P1B 和P1D 也为高电平有效;
CCP2CON=0x3C;
TRISC=0x06;//b0000 0110TRISC1TRISC2设置为输入,关闭PWM输出驱动器。
PR2=0X3E;//PWM频率设为1KHz;
}
/********端口B按键扫描初始化**********/
void init_PROTB()
{
ANSELH=0x00;//将B端口设置为I/O口。
TRISB=0XFF;//设置为输入。
// IOCB=0x07;//RB0、RB1、RB2允许点评变换中断。
// PEIE = 1;
// GIE = 1;
//必须初始化ANSELH 寄存器以将模拟通道配置为数字输入。配置为模拟输入的引脚
}
/******PWM子程序*******/
void PWM(void)
{
CCPR2L=ucduty[uclevel];//设置占空比;
CCPR1L=ucduty[uclevel];//设置占空比;
TMR2IF=0;//清空timer2中断标志位;
T2CON=0x06;//设1:16预分频;timer2使能;
//TRISC=0x00;//b0000 0000TRISC1TRISC2设置为输出,打开PWM输出驱动器。
}
/********中断函数******/
void interrupt motorcon()
{
if(RBIF)
{
RBIF=0;
}
}
/*****键盘扫描程序**********/
void scan()
{
if(key1)
{
_delay(200);//延时200ms去抖。
if(key1)
{
if(status==0)
{
TRISC3=0;
RC3=1;//L293D使能;
status=1;
while(key1);
}
else
{
TRISC3=0;
RC3=0;//L293D使能;
status=0;
while(key1);
}
}
}
if(key2)
{
_delay(200);//延时200ms去抖。
if(key2)
{
/* if(status==0)//若处于停止状态
{
if(orient)//若处于反正转设置方向,
{
TRISC2=1;//关闭CCP1输出
RC2=0;
TRISC1=0;//开启CCP2输出
orient=0;//设为正反转方向
while(key2);
}
else
{
TRISC2=0;//开启CCP1输出
TRISC1=1;//关闭CCP2输出
RC1=0;
orient=1;//设为反转方向
while(key2);
}
}
else //若处于转动状态
{
uclevel++;
if(uclevel==6)
uclevel=5;
PWM();
while(key2);
}
*/
uclevel++;
if(uclevel>=5)
uclevel=5;
PWM();
while(key2);
}
}
if(key3)
{
_delay(200);//延时200ms去抖。
if(key3)
{
/* if(status==0)//若处于停止状态
{
uclevel++;
if(uclevel==5)
uclevel=0;
PWM();
while(key3);
}
else
{
uclevel--;
if(uclevel<=0)
uclevel=0;
PWM();
while(key3);
}
*/
uclevel--;
if(uclevel<=0)
uclevel=0;
PWM();
while(key3);
}
}
if(key4)
{
_delay(200);//延时200ms去抖。
if(key4)
{
if(orient==0)//若处于反正转设置方向,
{
while(RC2);//防止在CCP1高电平时关闭CCP1;
TRISC=0x04;//关闭CCP1输出开启CCP2输出;0000 0100;
orient=1;//设为正反转方向
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 97099 2011-11-30 01:12 motorcontroller_simulation\Backup Of motor controller.DBK
文件 96976 2011-11-29 20:43 motorcontroller_simulation\Last Loaded motor controller.DBK
文件 118443 2011-12-01 00:33 motorcontroller_simulation\motor controller.DSN
文件 1102 2012-01-03 23:43 motorcontroller_simulation\motor controller.PWI
文件 1859 2011-12-01 00:32 motorcontroller_simulation\Motorcontroller.hex
文件 3729 2012-01-04 00:01 motorcontroller_simulation\Motorcontroller.c
目录 0 2011-12-01 00:33 motorcontroller_simulation
----------- --------- ---------- ----- ----
319208 7
- 上一篇:dd.txt
- 下一篇:黄金矿工as3版本demo
评论
共有 条评论