<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 直流電機控制Keil c51源代碼

直流電機控制Keil c51源代碼

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò ) 收藏
直流電機開(kāi)環(huán)控制Keil c51源代碼

//-----------------------函數聲明,變量定義------------------------
#include
#include
#include
//-----------------------定義管腳----------------------------------
sbit PWM=P1^0; //PWM波形輸出
sbit DR=P1^1;//方向控制
#define timer_data (256-100) //定時(shí)器預置值,12M時(shí)鐘是,定時(shí)0.1ms
#define PWM_T 100 //定義PWM的周期T為10ms
unsigned char PWM_t; //PWM_t為脈沖寬度(0~100)時(shí)間為0~10ms
unsigned char PWM_count;//輸出PWM周期計數
unsigned char time_count; //定時(shí)計數
bit direction; //方向標志位
//-----------------------------------------------------------------
// 函數名稱(chēng):timer_init
// 函數功能:初始化設施定時(shí)器
//-----------------------------------------------------------------
void timer_init()
{
TMOD=0x22; /*定時(shí)器1為工作模式2(8位自動(dòng)重裝),0為模式2(8位自動(dòng)重裝) */
PCON=0x00;
TF0=0;
TH0=timer_data; //保證定時(shí)時(shí)長(cháng)為0.1ms
TL0=TH0;
ET0=1;
TR0=1; //開(kāi)始計數
EA=1;//中斷允許
}
//-----------------------------------------------------------------
// 函數名稱(chēng):setting_PWM
// 函數功能:設置PWM的脈沖寬度和設定方向
//-----------------------------------------------------------------
void setting_PWM()
{
if(PWM_count==0) //初始設置
{
PWM_t=20;
direction=1;
}
}
//-----------------------------------------------------------------
// 函數名稱(chēng):IntTimer0
// 函數功能:定時(shí)器中斷處理程序
//-----------------------------------------------------------------
void IntTimer0() interrupt 1
{
time_count++;
DR=direction;
if(time_count>=PWM_T)
{
time_count=0;
PWM_count++;
setting_PWM(); //每輸出一個(gè)PWM波調用一次
}
if(time_count PWM=1;
else
PWM=0;
}
//-----------------------------------------------------------------
// 函數名稱(chēng):main
// 用戶(hù)主函數
// 函數功能:主函數
//-----------------------------------------------------------------
void main()
{
timer_init();
setting_PWM();
}

本文引用地址:http://dyxdggzs.com/article/201611/316949.htm

//=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=

直流電機閉環(huán)控制Keil c51源代碼

//-----------------------函數聲明,變量定義------------------------
#include
sbit INT_0 =P3^2; // 將p3.2外部中斷0
sbit pulse_A=P1^2; // P1.2為脈沖A輸入
sbit PWM=P1^0; //PWM波形輸出
sbit DR=P1^1; //方向控制
//-----------------------預定義值----------------------------------
#define PWM_T 1800 //定義PWM的周期T為18ms
#define Ts 1000 //定義光電編碼器采樣時(shí)間為10ms
#define timer_data (256-10) //定時(shí)器預置值,12M時(shí)鐘是,定時(shí)0.01ms
//-----------------------預設定值----------------------------------
bit direction; //方向標志位 用戶(hù)設定
unsigned char R; //需要得到的直流電機轉速 用戶(hù)設定
//-----------------------實(shí)際運行狀態(tài)------------------------------
bit real_direction; //電機實(shí)際運行方向
unsigned char Rr; //直流電機實(shí)際轉速
//-----------------------計算所得補償狀態(tài)--------------------------
bit compensate_polarity; //補償極性
unsigned char dR; //轉速補償
//-----------------------經(jīng)補償后得到的脈寬------------------------
unsigned char PWM_t; //PWM_t為脈沖寬度(320~400)時(shí)間為3.2~4.0ms
unsigned char PWM_count; //輸出PWM周期計數
//-----------------------各中間計數值------------------------------
unsigned char pulseB_count; //脈沖計數
unsigned char time0_count; //定時(shí)計數
unsigned char time1_count; //定時(shí)計數
//-----------------------------------------------------------------
// 函數名稱(chēng):timer_init
// 函數功能:初始化設置定時(shí)器
//-----------------------------------------------------------------
void timer_init()
{
TMOD=0x22; /*定時(shí)器1為工作模式2(8位自動(dòng)重裝),0為模式2(8位自動(dòng)重裝) */
PCON=0x00;
TF0=0;
TH0=timer_data; //保證定時(shí)時(shí)長(cháng)為0.01ms
TL0=TH0;
TH1=timer_data; //保證定時(shí)時(shí)長(cháng)為0.01ms
TL1=TH0;
ET0=1; //定時(shí)器0中斷允許
TR0=1; //定時(shí)器0開(kāi)始計數
ET1=1; //定時(shí)器1中斷允許
TR1=1; //定時(shí)器1開(kāi)始計數
EA=1; //中斷允許
}
//-----------------------------------------------------------------
// 函數名稱(chēng): INT0_init()
// 函數功能: 初始化設置
// 設定INT0的工作方式
//-----------------------------------------------------------------
void INT0_init(void )
{
pulseB_count=0; //脈沖計數器清零
IT0=1; //選擇INT0為沿觸發(fā)方式
EX0=1; //外部中斷允許
EA=1; //系統中斷允許
}
//-----------------------------------------------------------------
// 函數名稱(chēng):setting_PWM
// 函數功能:設置PWM的脈沖寬度和設定方向
//-----------------------------------------------------------------
void setting_PWM()
{
// direction=1; //設定轉動(dòng)方向
// R=540; //設定轉速
// dR=0; //轉速補償為零
// calculate_PWM_t(); //重新計算脈寬
}
//-----------------------------------------------------------------
// 函數名稱(chēng): calculate_PWM_t
// 入口參數: R需要得到的直流電機轉速,dR轉速補償
// 出口參數: PWM_t為脈沖寬度(320~400)時(shí)間為3.2~4.0ms
// 函數功能: 計算脈沖寬度,PWM_t=R/150;
//-----------------------------------------------------------------
void calculate_PWM_t()
{
if(compensate_polarity==1) //正補償
PWM_t=(R+dR)/150;
else
PWM_t=(R-dR)/150; //負修正
}
//-----------------------------------------------------------------
// 函數名稱(chēng): calculate_Rr
// 入口參數: pulseB_count脈沖計數
// 出口參數: Rr直流電機實(shí)際轉速
// 函數功能: 計算實(shí)際轉速
//-----------------------------------------------------------------
void calculate_Rr()
{
Rr=pulseB_count/6;
}
//-----------------------------------------------------------------
// 函數名稱(chēng): compensate_dR
// 入口參數: Rr直流電機實(shí)際轉速
// R需要得到的直流電機轉速
// 出口參數: dR轉速補償
// 函數功能: 計算實(shí)際補償值和補償極性 ,根據不同的補償算法重新設計
//-----------------------------------------------------------------
void compensate_Rr()
{
Rr=1;
if(Rr>R)
compensate_polarity=0; //補償極性
else
compensate_polarity=1;
}
//-----------------------------------------------------------------
// 函數名稱(chēng): INT0_intrupt
// 函數功能: 外部中斷0處理程序
//-----------------------------------------------------------------
void INT0_intrupt() interrupt 0 using 1
{
pulseB_count++;
if(pulse_A==0)
{
real_direction=1; //若P1.2為低電平,則電機為正轉,計數器N的值加1
}
else //若為高電平,則電機為反轉,計數器N值減l。
{
real_direction=1;
}
}
//-----------------------------------------------------------------
// 函數名稱(chēng):IntTimer0
// 函數功能:定時(shí)器中斷處理程序
//-----------------------------------------------------------------
void IntTimer0() interrupt 1
{
time0_count++;
DR=direction;
if(time0_count>=PWM_T)
{
time0_count=0;
PWM_count++;
setting_PWM(); //每輸出一個(gè)PWM波調用一次
}
if(time0_count PWM=1;
else
PWM=0;
}
//-----------------------------------------------------------------
// 函數名稱(chēng):IntTimer1
// 函數功能:定時(shí)器中斷處理程序
//-----------------------------------------------------------------
void IntTimer1() interrupt 3
{
time1_count++;
if(time1_count==1)
{
INT0_init(); //初始化外部中斷設置
}
if(time1_count>=Ts)
{
time1_count=0; //一個(gè)補償周期結束,計數器清零
calculate_Rr(); //計算實(shí)際轉速
compensate_Rr(); //計算實(shí)際補償值和補償極性
calculate_PWM_t(); //重新計算脈寬
}
}
//-----------------------------------------------------------------
// 函數名稱(chēng):main
// 用戶(hù)主函數
// 函數功能:主函數
//-----------------------------------------------------------------
void main()
{
direction=1; //設定轉動(dòng)方向
R=540; //設定轉速
dR=0; //轉速補償為零
calculate_PWM_t(); //重新計算脈寬
timer_init();
}



關(guān)鍵詞: 直流電機控制Keilc5

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>