資源簡介
在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
評論
共有 條評論