?? 無刷0621.c
字號:
//===================================================================================================
#include<reg51.h> //包含文件預處理命令
#define uchar unsigned char //8位單片機習慣性定義
#define uint unsigned int //8位單片機習慣性定義
//
//*********AD轉換要用到的特殊寄存器地址定義*************************************
sfr adc_contr=0xc5; //定義AD轉換控制寄存器地址
sfr adc_data=0xc6; //定義AD轉換結果寄存器地址
sfr p1m0=0x91; //帶有8路AD的P1口模式選擇寄存器0定義地址
sfr p1m1=0x92; //帶有8路AD的P1口模式選擇寄存器1定義地址
//
//*********PWM輸出要用到的特殊寄存器地址定義************************************
sfr ccap0h=0xfa; //PCA模塊0捕捉/比較寄存器高8位
sfr ccap1h=0xfb; //PCA模塊1捕捉/比較寄存器高8位
sfr ccap2h=0xfc; //PCA模塊2捕捉/比較寄存器高8位
sfr ccap3h=0xfd; //PCA模塊3捕捉/比較寄存器高8位
sfr pca_pwm0=0xf2; //PCA模塊0-PWM寄存器
sfr pca_pwm1=0xf3; //PCA模塊1-PWM寄存器
sfr pca_pwm2=0xf4; //PCA模塊2-PWM寄存器
sfr pca_pwm4=0xf5; //PCA模塊3-PWM寄存器
sfr ccapm0=0xda; //PCA模塊0工作模式寄存器
sfr ccapm1=0xdb; //PCA模塊1工作模式寄存器
sfr ccapm2=0xdc; //PCA模塊2工作模式寄存器
sfr ccapm3=0xdd; //PCA模塊3工作模式寄存器
sfr ch=0xf9; //PCA計數器高8位
sfr cl=0xe9; //PCA計數器低8位
sfr ccon=0xd8; //PCA控制寄存器
sfr cmod=0xd9; //PCA工作模式寄存器
sbit cr=ccon^6; //PCA計數器控制位,1開0關
sbit epca_lvd=IE^6; //PCA中斷允許控制位1開0關
sfr auxr=0x8E; //定時器工作于1T控制位
//==============================================================================
sbit zb=P1^3;
sbit pwmal=P2^3; //A相下橋驅動定義
sbit pwmbl=P2^2; //B相下橋驅動定義
sbit pwmcl=P2^1; //C相下橋驅動定義
sbit led=P2^7; //指示燈定義
sbit abs=P2^5; //ABS剎車功能選擇口,對地為ABS功能
sbit shache=P3^0; //剎車口定義,對地剎車
sbit fd=P3^3; //防盜檢測口定義
int ledcs; //定義一個指示燈閃燈次數變量
static fd_hej;
static timebj; //定義一個定時器計數比較變量
static timejs; //定義一個定時器中斷計數次數變量
static pwm_bl; //PWM輸出變量
static zs_bl=20; //pwm舊的變量數據,備份的
static pwm_bls; //PWM軟啟動加速用變量
static shache_bz; //剎車后該標志置1供軟啟動使用
static hehc; //霍爾數據暫存區
static hehc_bl; //上相霍爾數據暫存區,用于檢測霍爾變化
static dz_bz; //堵轉標志,為1堵轉
static dz_bz1;
static zbyx_bz; //轉把有效標志,歸0時為0,行駛時為1有效
static ds_bf=10; //轉把上次的數據備份
static zs_js; //轉速數據
static zs_ds_js;
static he_cs_bz1;
static he_cs_bz2;
static he_cs_bz3;
static he_cs_sj1;
static he_cs_sj2;
static he_cs_sj3;
int qy_1,qy_2,qy_3; //欠壓測量暫存區1,2,3
int cs1,cs2,cs3,cs_fx; //電機測速全局變量
static qy_bf; //欠壓上次的數據備份
int h; //ABS剎車用變量
int dz;
int dz2;
void zb_fx(void);
void he_gzjc(void);
void pwm_out(void);
//*********************AD轉換后PWM對照表*****************************************
uchar code pwmout[256]=
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,//60個1為1.3v以下
//------------------------------------------------------------------------------------------
241,239,237,235,233,231,229,227,225,223,221,219,217,215,213,211,209,207,205,203,
201,199,197,195,193,191,189,187,185,183,181,179,177,175,173,171,169,167,165,163,
161,159,157,155,153,151,149,147,145,143,141,139,137,135,133,131,129,127,125,123,//60
121,119,117,115,113,111,109,107,105,103,101,99,97,95,93,91,89,87,85,83,81,79,77,//23
75,73,71,69,67,65,63,61,59,57,55,53,51,49,47,46,45,44,43,42,41,40,39,38,37,36,//26
35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,//26
9,8,7,6,5,4,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,//34 //25個0為4.1--4.5v
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1}; //26個為4.5V以上
//*********************1MS延時函數***********************************************
void delay(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<250;j++)
;
}
//*********************ABS剎車延時函數***********************************************
void delay1(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=adc_data;j>0;j--)
{}
}
//*********************設置AD電源和開漏函數**************************************
adc_power()
{
adc_contr|=0x80; //開AD電源
delay(2); //首次開AD電源要延時1MS左右
p1m0|=0x88; //設置P1.3和P1.7為開漏即AD轉換模式
p1m1|=0x88; //同上
}
//-------------------設置P1.3為轉把測量通道函------------------------------------
set_p13_adc()
{ zb=1;
adc_contr=0xe3; //P13口為轉換通道
}
//-------------------設置P17為電機超載測量通道函數--------------------------------
set_p17_adc()
{
adc_contr=0xe7;
}
//------------------設置P15為欠壓檢測測量通道-------------------------------------
set_p15_adc()
{adc_contr=0xe5;}
//===================測量電壓函數=================================================
get_ad_dy()
{ int adon=0; //定義一個整型變量用于檢測AD轉換是否結束
adc_data=0; //AD轉換結果寄存器清0
adc_contr|=0x08; //轉換位置1啟動轉換
while(adon==0) //循環判斷表達式成立反復執行語句,不成立退出
{adon=adc_contr&0x10;} //循環語句體,即判斷AD轉換是否完成,完成后高第4位為1
adc_contr&=0xe7; //循環語句退出轉換完成,清adc_flag,adc_start,停止轉換
}
//********************PWM初始化函數***********************************************
pwm_sz()
{
cmod=0x82; //PCA在空閑模式下停止PCA計數器工作
//PCA時鐘源為1/2溢出
//禁止PCA計數器溢出中斷
ccon=0x00; //禁止PCA計數器工作,清除中斷標志和計數器溢出標志
cl=0x00; //清0計數器
ch=0x00;
//======================以下為4路PWM輸出設置程序=============================
//設置模塊0為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P3.7口輸出
ccapm0=0x42; //***程序核心語句,-----0100,0010
pca_pwm0=0x03; //先關閉PWM-輸出為0,寫入0x00就可開PWM輸出
//設置模塊1為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P3.5口輸出
ccapm1=0x42; //***程序核心語句,-----0100,0010
pca_pwm1=0x03; //先關閉PWM-輸出為0,寫入0x00就可開PWM輸出
//設置模塊2為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P2.0口輸出
ccapm2=0x42; //***程序核心語句,-----0100,0010
pca_pwm2=0x03; //先關閉PWM-輸出為0,寫入0x00就可開PWM輸出
//模塊3未用
epca_lvd=1; //開PCA中斷
EA=1; //開總中斷
cr=1; //開PCA計數器打開
}
//********************快閃燈函數***********************************************
led_k()
{ int k; //定義一個臨時變量
for(k=0;k<ledcs;k++) //表達式2條件不滿足即次數未到重復執行循環體語句
{led=0;delay(700);
led=1;delay(700);}
delay(2000);
}
//********************定時器0和1初始化函數*******************************************
time_csh()
{
TMOD=0x11; //定時器0工作于8位自動重裝,1工作于方式1
TH0=0x3c; //
TL0=0x0b;
TH1=0x3c; //12MHZ時50MS數據,20次為1S
TL1=0x0b;
IT0=1; //設置外中斷0為下降沿觸發358第一腳
EX0=1; //開外中斷0
EA=1; //開總中斷
ET0=1; //開定時期0中斷
ET1=1; //開定時期1中斷
}
//********************定時器0中斷函數PWM頻率用************************************
void time0(void)interrupt 1
{TR0=0;TH0=0x3c;TL0=0x0b;
zs_ds_js++;
if(zs_ds_js==10)
{if(zs_js<20)
{
dz_bz1=1;zs_ds_js=0;zs_js=0;
TH1=0X3C;TL1=0X0B;TR1=1;
TH0=0x3c;TL0=0x0b;TR0=1;
// pwm_bls=200;
}
else
{dz_bz1=0;zs_ds_js=0;zs_js=0;zs_bl=zs_js;
TH1=0X3C;TL1=0X0B;TR1=0;
TH0=0X3C;TL0=0X0B;TR0=1;
}
}
else
{TR0=1;}
}
//********************定時器1中斷函數*********************************************
void time1(void)interrupt 3
{ TR1=0;TH1=0x3c;TL1=0x0b;
timejs++;
if(timejs==12) //中斷次數等于給定的次數就取反LED
{if(zbyx_bz==0) //轉把歸0標志為0,可以閃燈
{led=~led;timejs=0;TR1=1;}
}
if(timejs==80)
{if(dz_bz1==1)
{TR0=0;dz_bz1=0;dz_bz=1;zs_ds_js=0;zs_js=0;timejs=0;}
else
{dz_bz=0;zs_ds_js=0;zs_js=0;timejs=0;}
}
TR1=1;
}
//*******************電機堵轉轉函數***********************************************
//根據2S定時內一直堵轉的話置DZ_BZ為1,本函數檢測到該標志為1立即關閉所有輸出
//并閃爍指示燈間隔快閃2次提示,最后監控轉把歸0后可以退出本函數重新啟動
void dgdz(void)
{
while(dz_bz1==1)
{pwm_bls=170;he_gzjc();pwm_out();
if(dz_bz==1)
{ TR0=0;TR1=0;
pca_pwm0=0x03; //關3路PWM信號
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //關3路下橋
set_p13_adc(); //電機進入保護后開始等待轉把歸零后可以重新啟動
do{ledcs=2;led_k();get_ad_dy();} //間隔開閃2次提示堵轉保護,測量轉把電壓是否歸0
while(adc_data>=61); //沒有歸0執行DO循環體語句
led=1;dz_bz=0;dz_bz1=0; //轉把歸0后關指示燈清堵轉標志
}
}
}
//********************外中斷0函數限流或康銅開路************************************
void intt0()interrupt 0
{
TR0=0;TR1=0; //關PWM頻率
pca_pwm0=0x03; //關3路PWM信號
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //關3路下橋
set_p13_adc();
get_ad_dy();
while(adc_data>=61)
{ledcs=4;led=0;get_ad_dy();}
led=1;
}
//********************PWM驅動橋驅動輸出函數****************************************
void pwm_out(void) //入口:pwm_bl里有轉把調速參數.出口:輸出全橋驅動信號
{
switch(hehc) //多分支語句根據霍爾位置輸出對應節拍
{case 0x01:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
ccap0h=pwm_bls;pwmcl=1;pca_pwm0=0x00;break;} //第1拍ccap0h刷新參數開C下橋A上橋
//-------------------------------------------------------------
case 0x03:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
ccap1h=pwm_bls;pwmcl=1;pca_pwm1=0x00;break;} //第2拍ccap1h刷新參數開C下橋b上橋
//-------------------------------------------------------------
case 0x02:{pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
ccap1h=pwm_bls;pwmal=1;pca_pwm1=0x00;break;} //第3拍ccap1h刷新參數開a下橋b上橋
//-------------------------------------------------------------
case 0x06:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
ccap2h=pwm_bls;pwmal=1;pca_pwm2=0x00;break;} //第4拍ccap2h刷新參數開a下橋c上橋
//-------------------------------------------------------------
case 0x04:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
ccap2h=pwm_bls;pwmbl=1;pca_pwm2=0x00;break;} //第5拍ccap2h刷新參數開b下橋c上橋
//-------------------------------------------------------------
case 0x05:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
ccap0h=pwm_bls;pwmbl=1;pca_pwm0=0x00;break;} //第6拍ccap0h刷新參數開b下橋a上橋
}
}
//********************上電初始化函數**********************************************
void sd_csh(void)
{P1=0xff;zb=0;P2=0xff;P3=0xff;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -