標(biāo)題:
51單片機(jī)主控?zé)o刷電機(jī)BLDC程序注釋 制作資料
[打印本頁(yè)]
作者:
51hei圓圓
時(shí)間:
2023-6-21 02:25
標(biāo)題:
51單片機(jī)主控?zé)o刷電機(jī)BLDC程序注釋 制作資料
單片機(jī)源程序如下:
#include<reg51.h> //包含文件預(yù)處理命令</span>
#define uchar unsigned char //8位單片機(jī)習(xí)慣性定義
#define uint unsigned int //8位單片機(jī)習(xí)慣性定義
//
//*********AD轉(zhuǎn)換要用到的特殊寄存器地址定義*************************************
sfr adc_contr=0xc5; //定義AD轉(zhuǎn)換控制寄存器地址
sfr adc_data=0xc6; //定義AD轉(zhuǎn)換結(jié)果寄存器地址
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計(jì)數(shù)器高8位
sfr cl=0xe9; //PCA計(jì)數(shù)器低8位
sfr ccon=0xd8; //PCA控制寄存器
sfr cmod=0xd9; //PCA工作模式寄存器
sbit cr=ccon^6; //PCA計(jì)數(shù)器控制位,1開(kāi)0關(guān)
sbit epca_lvd=IE^6; //PCA中斷允許控制位1開(kāi)0關(guān)
sfr auxr=0x8E; //定時(shí)器工作于1T控制位
//==============================================================================
sbit zb=P1^3;
sbit pwmal=P2^3; //A相下橋驅(qū)動(dòng)定義
sbit pwmbl=P2^2; //B相下橋驅(qū)動(dòng)定義
sbit pwmcl=P2^1; //C相下橋驅(qū)動(dòng)定義
sbit led=P2^7; //指示燈定義
sbit abs=P2^5; //ABS剎車功能選擇口,對(duì)地為ABS功能
sbit shache=P3^0; //剎車口定義,對(duì)地剎車
sbit fd=P3^3; //防盜檢測(cè)口定義
int ledcs; //定義一個(gè)指示燈閃燈次數(shù)變量
static fd_hej;
static timebj; //定義一個(gè)定時(shí)器計(jì)數(shù)比較變量
static timejs; //定義一個(gè)定時(shí)器中斷計(jì)數(shù)次數(shù)變量
static pwm_bl; //PWM輸出變量
static zs_bl=20; //pwm舊的變量數(shù)據(jù),備份的
static pwm_bls; //PWM軟啟動(dòng)加速用變量
static shache_bz; //剎車后該標(biāo)志置1供軟啟動(dòng)使用
static hehc; //霍爾數(shù)據(jù)暫存區(qū)
static hehc_bl; //上相霍爾數(shù)據(jù)暫存區(qū),用于檢測(cè)霍爾變化
static dz_bz; //堵轉(zhuǎn)標(biāo)志,為1堵轉(zhuǎn)
static dz_bz1;
static zbyx_bz; //轉(zhuǎn)把有效標(biāo)志,歸0時(shí)為0,行駛時(shí)為1有效
static ds_bf=10; //轉(zhuǎn)把上次的數(shù)據(jù)備份
static zs_js; //轉(zhuǎn)速數(shù)據(jù)
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; //欠壓測(cè)量暫存區(qū)1,2,3
int cs1,cs2,cs3,cs_fx; //電機(jī)測(cè)速全局變量
static qy_bf; //欠壓上次的數(shù)據(jù)備份
int h; //ABS剎車用變量
int dz;
int dz2;
void zb_fx(void);
void he_gzjc(void);
void pwm_out(void);
//*********************AD轉(zhuǎn)換后PWM對(duì)照表*****************************************
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個(gè)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個(gè)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個(gè)為4.5V以上
//*********************1MS延時(shí)函數(shù)***********************************************
void delay(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<250;j++)
;
}
//*********************ABS剎車延時(shí)函數(shù)***********************************************
void delay1(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=adc_data;j>0;j--)
{}
}
//*********************設(shè)置AD電源和開(kāi)漏函數(shù)**************************************
adc_power()
{
adc_contr|=0x80; //開(kāi)AD電源
delay(2); //首次開(kāi)AD電源要延時(shí)1MS左右
p1m0|=0x88; //設(shè)置P1.3和P1.7為開(kāi)漏即AD轉(zhuǎn)換模式
p1m1|=0x88; //同上
}
//-------------------設(shè)置P1.3為轉(zhuǎn)把測(cè)量通道函------------------------------------
set_p13_adc()
{ zb=1;
adc_contr=0xe3; //P13口為轉(zhuǎn)換通道
}
//-------------------設(shè)置P17為電機(jī)超載測(cè)量通道函數(shù)--------------------------------
set_p17_adc()
{
adc_contr=0xe7;
}
//------------------設(shè)置P15為欠壓檢測(cè)測(cè)量通道-------------------------------------
set_p15_adc()
{adc_contr=0xe5;}
//===================測(cè)量電壓函數(shù)=================================================
get_ad_dy()
{ int adon=0; //定義一個(gè)整型變量用于檢測(cè)AD轉(zhuǎn)換是否結(jié)束
adc_data=0; //AD轉(zhuǎn)換結(jié)果寄存器清0
adc_contr|=0x08; //轉(zhuǎn)換位置1啟動(dòng)轉(zhuǎn)換
while(adon==0) //循環(huán)判斷表達(dá)式成立反復(fù)執(zhí)行語(yǔ)句,不成立退出
{adon=adc_contr&0x10;} //循環(huán)語(yǔ)句體,即判斷AD轉(zhuǎn)換是否完成,完成后高第4位為1
adc_contr&=0xe7; //循環(huán)語(yǔ)句退出轉(zhuǎn)換完成,清adc_flag,adc_start,停止轉(zhuǎn)換
}
//********************PWM初始化函數(shù)***********************************************
pwm_sz()
{
cmod=0x82; //PCA在空閑模式下停止PCA計(jì)數(shù)器工作
//PCA時(shí)鐘源為1/2溢出
//禁止PCA計(jì)數(shù)器溢出中斷
ccon=0x00; //禁止PCA計(jì)數(shù)器工作,清除中斷標(biāo)志和計(jì)數(shù)器溢出標(biāo)志
cl=0x00; //清0計(jì)數(shù)器
ch=0x00;
//======================以下為4路PWM輸出設(shè)置程序=============================
//設(shè)置模塊0為8位PWM輸出模式,PWM無(wú)需中斷支持,,脈沖在P3.7口輸出
ccapm0=0x42; //***程序核心語(yǔ)句,-----0100,0010
pca_pwm0=0x03; //先關(guān)閉PWM-輸出為0,寫(xiě)入0x00就可開(kāi)PWM輸出
//設(shè)置模塊1為8位PWM輸出模式,PWM無(wú)需中斷支持,,脈沖在P3.5口輸出
ccapm1=0x42; //***程序核心語(yǔ)句,-----0100,0010
pca_pwm1=0x03; //先關(guān)閉PWM-輸出為0,寫(xiě)入0x00就可開(kāi)PWM輸出
//設(shè)置模塊2為8位PWM輸出模式,PWM無(wú)需中斷支持,,脈沖在P2.0口輸出
ccapm2=0x42; //***程序核心語(yǔ)句,-----0100,0010
pca_pwm2=0x03; //先關(guān)閉PWM-輸出為0,寫(xiě)入0x00就可開(kāi)PWM輸出
//模塊3未用
epca_lvd=1; //開(kāi)PCA中斷
EA=1; //開(kāi)總中斷
cr=1; //開(kāi)PCA計(jì)數(shù)器打開(kāi)
}
//********************快閃燈函數(shù)***********************************************
led_k()
{ int k; //定義一個(gè)臨時(shí)變量
for(k=0;k<ledcs;k++) //表達(dá)式2條件不滿足即次數(shù)未到重復(fù)執(zhí)行循環(huán)體語(yǔ)句
{led=0;delay(700);
led=1;delay(700);}
delay(2000);
}
//********************定時(shí)器0和1初始化函數(shù)*******************************************
time_csh()
{
TMOD=0x11; //定時(shí)器0工作于8位自動(dòng)重裝,1工作于方式1
TH0=0x3c; //
TL0=0x0b;
TH1=0x3c; //12MHZ時(shí)50MS數(shù)據(jù),20次為1S
TL1=0x0b;
IT0=1; //設(shè)置外中斷0為下降沿觸發(fā)358第一腳
EX0=1; //開(kāi)外中斷0
EA=1; //開(kāi)總中斷
ET0=1; //開(kāi)定時(shí)期0中斷
ET1=1; //開(kāi)定時(shí)期1中斷
}
//********************定時(shí)器0中斷函數(shù)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;}
}
//********************定時(shí)器1中斷函數(shù)*********************************************
void time1(void)interrupt 3
{ TR1=0;TH1=0x3c;TL1=0x0b;
timejs++;
if(timejs==12) //中斷次數(shù)等于給定的次數(shù)就取反LED
{if(zbyx_bz==0) //轉(zhuǎn)把歸0標(biāo)志為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;
}
//*******************電機(jī)堵轉(zhuǎn)轉(zhuǎn)函數(shù)***********************************************
//根據(jù)2S定時(shí)內(nèi)一直堵轉(zhuǎn)的話置DZ_BZ為1,本函數(shù)檢測(cè)到該標(biāo)志為1立即關(guān)閉所有輸出
//并閃爍指示燈間隔快閃2次提示,最后監(jiān)控轉(zhuǎn)把歸0后可以退出本函數(shù)重新啟動(dòng)
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; //關(guān)3路PWM信號(hào)
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //關(guān)3路下橋
set_p13_adc(); //電機(jī)進(jìn)入保護(hù)后開(kāi)始等待轉(zhuǎn)把歸零后可以重新啟動(dòng)
do{ledcs=2;led_k();get_ad_dy();} //間隔開(kāi)閃2次提示堵轉(zhuǎn)保護(hù),測(cè)量轉(zhuǎn)把電壓是否歸0
while(adc_data>=61); //沒(méi)有歸0執(zhí)行DO循環(huán)體語(yǔ)句
led=1;dz_bz=0;dz_bz1=0; //轉(zhuǎn)把歸0后關(guān)指示燈清堵轉(zhuǎn)標(biāo)志
}
}
}
//********************外中斷0函數(shù)限流或康銅開(kāi)路************************************
void intt0()interrupt 0
{
TR0=0;TR1=0; //關(guān)PWM頻率
pca_pwm0=0x03; //關(guān)3路PWM信號(hào)
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //關(guān)3路下橋
set_p13_adc();
get_ad_dy();
while(adc_data>=61)
{ledcs=4;led=0;get_ad_dy();}
led=1;
}
//********************PWM驅(qū)動(dòng)橋驅(qū)動(dòng)輸出函數(shù)****************************************
void pwm_out(void) //入口:pwm_bl里有轉(zhuǎn)把調(diào)速參數(shù).出口:輸出全橋驅(qū)動(dòng)信號(hào)
{
switch(hehc) //多分支語(yǔ)句根據(jù)霍爾位置輸出對(duì)應(yīng)節(jié)拍
{case 0x01:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
ccap0h=pwm_bls;pwmcl=1;pca_pwm0=0x00;break;} //第1拍ccap0h刷新參數(shù)開(kāi)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刷新參數(shù)開(kāi)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刷新參數(shù)開(kāi)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刷新參數(shù)開(kāi)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刷新參數(shù)開(kāi)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刷新參數(shù)開(kāi)b下橋a上橋
}
}
//********************上電初始化函數(shù)**********************************************
void sd_csh(void)
{P1=0xff;zb=0;P2=0xff;P3=0xff;
pwmal=0; //上電復(fù)位后首先關(guān)閉3組下橋
pwmbl=0; //
pwmcl=0; //
adc_power(); //調(diào)AD轉(zhuǎn)換用初始化函數(shù)
pwm_sz(); //調(diào)PWM輸出用初始化函數(shù)
time_csh(); //調(diào)兩個(gè)定時(shí)器初始化函數(shù)
}
//********************上電防飛車函數(shù)歸0后LED正常閃爍******************************
void sd_ffc(void)
{
set_p13_adc(); //調(diào)轉(zhuǎn)把電壓轉(zhuǎn)換通道
get_ad_dy(); //上電后測(cè)量轉(zhuǎn)把電壓是否歸零
while(adc_data>=61) //61為1.2V轉(zhuǎn)換值轉(zhuǎn)把如果大于1.2V執(zhí)行循環(huán)體語(yǔ)句等待歸0
{ledcs=2;led_k(); //循環(huán)體語(yǔ)句,2次間隔性快閃燈
get_ad_dy(); //循環(huán)體語(yǔ)句,重新檢測(cè)電壓等待歸0
}
TR0=0; //關(guān)PWM頻率否則干擾閃燈
timebj=12; //歸0后定時(shí)器中斷10次閃爍一次LED
TR1=1; //歸0后開(kāi)定時(shí)器1-LED閃爍
}
//*************剎車函數(shù)自動(dòng)選擇是斷電還是ABS剎車功***************************
void sc_stop(void) //ABS剎車有外接口對(duì)地選擇,對(duì)地時(shí)為ABS功能
{
if(shache==0) //判斷語(yǔ)句剎車口等于0執(zhí)行大語(yǔ)句1
{ abs=1;
//大語(yǔ)句體1
if(abs==1) //判斷ABS選擇不為0就執(zhí)行普通剎車斷電,否則執(zhí)行ABS剎車
//==========普通剎車斷電==================================================
{
TR0=0;led=0; //關(guān)測(cè)速定時(shí)器,亮剎車燈
pca_pwm0=0x03; //關(guān)3路PWM信號(hào)AH
pca_pwm1=0x03; //關(guān)3路PWM信號(hào)BH
pca_pwm2=0x03; //關(guān)3路PWM信號(hào)CH
pwmal=0;pwmbl=0;pwmcl=0; //關(guān)3路下橋
//----------------------------------------------------------------------
while(shache==0) //循環(huán)語(yǔ)句,剎車口沒(méi)松開(kāi)就一直等待
{delay(500);} //語(yǔ)句體,延時(shí)抗干擾防止抖動(dòng)
hehc_bl=0;led=1; //剎車口松開(kāi)后清霍爾變量?jī)?nèi)存再關(guān)剎車燈
//----------------------------------------------------------------------
for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--) //以下兩句為剎車口松開(kāi)后減緩沖擊
{he_gzjc();pwm_out();} //從最低速度加高到實(shí)時(shí)的轉(zhuǎn)把設(shè)定速度
}
//===========EABS剎車斷電=====================================================
else //ABS功能已選擇進(jìn)入ABS剎車
{ //
TR0=0;led=0; //關(guān)測(cè)速定時(shí)器,亮剎車燈
pca_pwm0=0x03; //關(guān)3路PWM信號(hào)AH
pca_pwm1=0x03; //關(guān)3路PWM信號(hào)BH
pca_pwm2=0x03; //關(guān)3路PWM信號(hào)CH
pwmal=0;pwmbl=0;pwmcl=0; //關(guān)閉3個(gè)下橋:AL-BL-CL
//-------------------------------------------------------------------------
do //do-while語(yǔ)句先執(zhí)行do再執(zhí)行while判斷表達(dá)式
{
for(h=100;h>0;h--) //每檢測(cè)一次沒(méi)松開(kāi)就先執(zhí)行1萬(wàn)次ABS點(diǎn)剎,防止剎車抖動(dòng)干擾
{ pwmal=0;pwmbl=0;pwmcl=0;
delay1(1);
pwmal=1;pwmbl=1;pwmcl=1; //ABS點(diǎn)剎
delay1(80);
}
}
while(shache==0); //內(nèi)鑲循環(huán)語(yǔ)句,只要?jiǎng)x車沒(méi)松開(kāi)就一直開(kāi)ABS點(diǎn)剎制動(dòng)
hehc_bl=0;led=1; //剎車口為1后清霍爾變量?jī)?nèi)存再關(guān)剎車燈
pwmal=0;pwmbl=0;pwmcl=0; //點(diǎn)剎后要關(guān)閉所有下橋防止剎車松開(kāi)后車推不動(dòng)
for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)//以下幾句剎車后軟啟動(dòng),減少剎車后高速?zèng)_擊
{he_gzjc();pwm_out();}
}
//---------------
}
}
//*******************欠壓檢測(cè)函數(shù)**************************************************
void qy_jc(void)
{ //連續(xù)3次測(cè)量電池電壓抗干擾
set_p15_adc();
get_ad_dy(); //第1次測(cè)量電池電壓
if(adc_data<=158) //電壓小于等于3.1v嗎,不等于直接退出
{TR0=0;TR1=0;led=1; //小于等于,電池電壓過(guò)低,關(guān)PWM頻率保護(hù)電池
pca_pwm0=0x03; //關(guān)3路PWM信號(hào)
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //關(guān)3路下橋
do{ledcs=3;led_k();get_ad_dy();} //閃燈提示重新測(cè)量電壓
while(adc_data<=175); //檢測(cè)是否恢復(fù)到正常電壓44V
ledcs=3;led_k(); //電壓恢復(fù)44V以上再閃燈做為延時(shí)用
hehc_bl=0; //清霍爾舊數(shù)據(jù)為了起動(dòng)
}
}
//*******************霍爾故障檢測(cè)函數(shù)**********************************************
void he_gzjc(void)
{
hehc=P1&0x07; //讀入霍爾數(shù)據(jù),并分離有效數(shù)據(jù)
//--查霍爾是否全1--------
while(hehc==0x07) //判斷是否為3個(gè)全1,成立循環(huán)執(zhí)行語(yǔ)句體
{pca_pwm0=0x03; //霍爾出現(xiàn)故障關(guān)閉所有輸出
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //
TR0=0;zs_ds_js=0;zs_js=0; //關(guān)測(cè)速定時(shí)器,定時(shí)計(jì)數(shù)器清0,轉(zhuǎn)速度計(jì)數(shù)器清0
ledcs=6;led_k(); //循環(huán)執(zhí)行語(yǔ)句體6次閃爍,直到不成立退出
hehc=P1&0x07; //重新檢測(cè)霍爾
}
//--查霍爾是否全0--------
while(hehc==0x00) //不為3個(gè)1再判斷是否為3個(gè)0,成立執(zhí)行循環(huán)語(yǔ)句體
{pca_pwm0=0x03; //霍爾出現(xiàn)故障關(guān)閉所有輸出
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //
TR0=0;zs_ds_js=0;zs_js=0; //關(guān)測(cè)速定時(shí)器,定時(shí)計(jì)數(shù)器清0,轉(zhuǎn)速度計(jì)數(shù)器清0
ledcs=6;led_k(); //循環(huán)執(zhí)行語(yǔ)句體6次閃爍,直到不成立退出
hehc=P1&0x07; //重新檢測(cè)霍爾
}
//--查霍爾是否更新--------
if(hehc_bl!=hehc) //判斷霍爾是否變化,成立執(zhí)行語(yǔ)句1后退出
{hehc_bl=hehc; //語(yǔ)句2,霍爾變化存入新的數(shù)據(jù)到變量中
he_cs_sj1=hehc;he_cs_bz1=1;
if(he_cs_bz1==1){he_cs_sj2=hehc;he_cs_bz2=1;}
if(he_cs_bz2==1){he_cs_sj3=hehc;he_cs_bz3=1;}
//----------------------------------------
if(he_cs_bz1==1)
{if(he_cs_bz2==1)
{if(he_cs_bz3==1)
{if(he_cs_sj1&he_cs_sj2&he_cs_sj3!=0x00)
{zs_js++;he_cs_bz1=0;he_cs_bz2=0;he_cs_bz3=0;}
}
}
}
//--------------------
}
}
//**********電流自動(dòng)調(diào)整函數(shù)******************************************************
void dl_tz(void)
{ set_p17_adc();
do
{get_ad_dy();}
while(adc_data>=20);
{pwm_bls=adc_data*10+pwm_bl;
if(pwm_bls>=241){pwm_bls=241;}
he_gzjc();pwm_out();zb_fx();dgdz();
}
pwm_bls=pwm_bl;
}
//********************轉(zhuǎn)把工作狀態(tài)分析函數(shù)****************************************
//函數(shù)出口--pwm_bl里有查表后數(shù)據(jù),PWM輸出程序直接讀出放入PWM占空比寄存器
//ccap0h,ccap1h,ccap2h中即可
//********************************************************************************
void zb_fx(void)
{ //---連續(xù)3次測(cè)量轉(zhuǎn)把電壓--------
set_p13_adc(); //調(diào)轉(zhuǎn)把電壓轉(zhuǎn)換通道
get_ad_dy(); //第一次測(cè)量轉(zhuǎn)把電壓
pwm_bl=pwmout[adc_data]; //在數(shù)組中查出對(duì)應(yīng)的AD轉(zhuǎn)換PWM值
if(pwm_bl==1) //為1成立執(zhí)行大的語(yǔ)句1后退出,不成立執(zhí)行語(yǔ)句2后退出
//語(yǔ)句1,轉(zhuǎn)把電壓等于1說(shuō)明轉(zhuǎn)把在1.3v以下或4.5v以上停止輸出閃LED
{
hehc_bl=0; //霍爾存儲(chǔ)舊數(shù)據(jù)的變量及時(shí)清0否則很難起動(dòng)
pca_pwm0=0x03; //停止所有輸出
pca_pwm1=0x03;
pca_pwm2=0x03;
TR0=0;zs_ds_js=0;zs_js=0; //關(guān)測(cè)速定時(shí)器,定時(shí)計(jì)數(shù)器清0,轉(zhuǎn)速度計(jì)數(shù)器清0
pwmal=0;pwmbl=0;pwmcl=0; //關(guān)3個(gè)下橋
timebj=15; //定時(shí)器1中斷12次閃爍一次LED
TR1=1;zbyx_bz=0; //開(kāi)定時(shí)器1-LED閃爍,轉(zhuǎn)把歸0標(biāo)志位為0,pwm輸出就無(wú)效
}
else
//語(yǔ)句2,轉(zhuǎn)把電壓不等于1說(shuō)明在1.3v-4.5v之間正常行駛數(shù)據(jù)
{led=1;zbyx_bz=1;TR0=1;} //關(guān)定時(shí)器1指示燈,轉(zhuǎn)把有效標(biāo)志位為1,pwm輸出有效
}
//**********************軟啟動(dòng)************************************
//dg_rqd()
//{dgdz();
//if(pwm_bl!=pwm_blj)
// {for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)
// {he_gzjc();pwm_out();}pwm_blj=pwm_bl;
// }
//else
// {if(shache_bz==1)
// {for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)
// {he_gzjc();pwm_out();}pwm_blj=pwm_bl;shache_bz=0;
// }
// else
// {he_gzjc();pwm_out();}
// }
//}
//********************防盜鎖電機(jī)函數(shù)**********************************************
fd_dg()
{while(fd==0)
{
{int fd_he;
fd_he=P1&0X07;
if(fd_he!=fd_hej)
{fd_hej=fd_he;
//switch(fd_he) //多分支語(yǔ)句根據(jù)霍爾位置輸出對(duì)應(yīng)節(jié)拍
// {case 0x01:{
pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
ccap1h=10;pwmal=1;pca_pwm1=0x00;delay(20);
pwmal=0;pca_pwm1=0x03;
pwmal=1;pwmbl=1;pwmcl=1;delay(300);
//-------
//pwmcl=1;pca_pwm0=0x00;delay(1);
// pwmcl=0;pca_pwm0=0x03;delay(2);
// break;} //第1拍ccap0h刷新參數(shù)開(kāi)C下橋A上橋
//-------------------------------------------------------------
// case 0x03:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
// ccap2h=10;pwmal=1;pca_pwm2=0x00;delay(20);
// pwmal=0;pca_pwm2=0x03;
// pwmal=1;pwmbl=1;pwmcl=1;delay(200);
//--------
// pwmcl=1;pca_pwm1=0x00;delay(1);
// pwmcl=0;pca_pwm1=0x03;delay(2);
// break;} //第2拍ccap1h刷新參數(shù)開(kāi)C下橋b上橋
//-------------------------------------------------------------
// case 0x02:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
// ccap2h=10;pwmbl=1;pca_pwm2=0x00;delay(20);
// pwmbl=0;pca_pwm2=0x03;
// pwmal=1;pwmbl=1;pwmcl=1;delay(200);
// //--------
//pwmal=1;pca_pwm1=0x00;delay(1);
// //pwmal=0;pca_pwm1=0x03;delay(2);
// break;} //第3拍ccap1h刷新參數(shù)開(kāi)a下橋b上橋
//-------------------------------------------------------------
// case 0x06:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
// ccap0h=10;pwmbl=1;pca_pwm0=0x00;delay(20);
// pwmbl=0;pca_pwm0=0x03;
// pwmal=1;pwmbl=1;pwmcl=1;delay(200);
//---------
//pwmal=1;pca_pwm2=0x00;delay(1);
//pwmal=0;pca_pwm2=0x03;delay(2);
// break;} //第4拍ccap2h刷新參數(shù)開(kāi)a下橋c上橋
//-------------------------------------------------------------
// case 0x04:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
// ccap0h=10;pwmcl=1;pca_pwm0=0x00;delay(20);
// pwmcl=0;pca_pwm0=0x03;
// pwmal=1;pwmbl=1;pwmcl=1;delay(200);
// //---------
//pwmbl=1;pca_pwm2=0x00;delay(1);
//pwmbl=0;pca_pwm2=0x03;delay(2);
// break;} //第5拍ccap2h刷新參數(shù)開(kāi)b下橋c上橋
//-------------------------------------------------------------
// case 0x05:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
// ccap1h=10;pwmcl=1;pca_pwm1=0x00;delay(20);
// pwmcl=0;pca_pwm1=0x03;
// pwmal=1;pwmbl=1;pwmcl=1;delay(200);
//----------
// pwmbl=1;pca_pwm0=0x00;delay(1);
// // pwmbl=0;pca_pwm0=0x03;delay(2);
// break;} //第6拍ccap0h刷新參數(shù)開(kāi)b下橋a上橋
// }
}
}
}
}
//********************主函數(shù)******************************************************
main()
{
sd_csh(); //調(diào)上電初始化函數(shù)
qy_jc(); //調(diào)欠壓檢測(cè)函數(shù)
sd_ffc(); //調(diào)上電防飛車函數(shù),等待歸0后才往下執(zhí)行
he_gzjc(); //調(diào)霍爾故障檢測(cè)函數(shù),無(wú)故障才往下執(zhí)行
while(1)
{
qy_jc();
if(fd==0){fd_hej=P1&0x07;fd_dg();}//如果防盜口為低電平執(zhí)行防盜程序
//--------------
else //否則執(zhí)行正常程序
{
if(dz_bz1!=1){zb_fx();} //1>調(diào)轉(zhuǎn)把分析函數(shù)
if(zbyx_bz==1) //如果轉(zhuǎn)把標(biāo)志位為1轉(zhuǎn)把有效,就執(zhí)行語(yǔ)句體否則不執(zhí)行
{dl_tz();dgdz();
he_gzjc();pwm_out();
} //語(yǔ)句體,調(diào)霍爾分析函數(shù),調(diào)PWM輸出函數(shù)
sc_stop(); //調(diào)剎車斷電檢測(cè)函數(shù)
}
//-----------------------
}
復(fù)制代碼
出自:
http://www.torrancerestoration.com/bbs/dpj-178970-1.html
作者:
Q__Q
時(shí)間:
2023-6-21 11:43
謝謝樓主 注解很詳細(xì) 樓主辛苦了 ,照例先收藏后學(xué)習(xí)
作者:
IdeaMing
時(shí)間:
2023-6-21 13:14
電動(dòng)車控制器邏輯嗎?
作者:
永亮電器
時(shí)間:
2023-9-8 11:27
電路圖沒(méi)有呢,電路圖比PCB重要
作者:
wkman
時(shí)間:
2023-9-8 14:39
硬件pcb 有點(diǎn)含糊,,,
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1