亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
mcu-stc12c5404ad單片機直流無刷電機驅動程序
[打印本頁]
作者:
millerpowell
時間:
2020-10-15 21:18
標題:
mcu-stc12c5404ad單片機直流無刷電機驅動程序
//*****************************************************//* ***無刷電機控制器程序*** *//*===================================================* //* MCU-STC12C5404...
//*****************************************************
//* ***無刷電機控制器程序*** *
//*===================================================*
//* mcu-stc12c5404ad 8路ad轉換,4路pwm輸出,速度1t *
//*===================================================*
//*****************************************************
#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;
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&amt;0x10;} //循環語句體,即判斷ad轉換是否完成,完成后高第4位為1
adc_contr&amt;=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<10)
{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=100;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;cs1=0x01;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;cs2=0x03;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;cs3=0x02;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;cs1=0x06;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;cs2=0x04;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;cs3=0x05;break;} //第6拍ccap0h刷新參數開b下橋a上橋
}
}
//********************上電初始化函數**********************************************
void sd_csh(void)
{p1=0xff;zb=0;p2=0xff;p3=0xff;
pwmal=0; //上電復位后首先關閉3組下橋
pwmbl=0; //
pwmcl=0; //
adc_power(); //調ad轉換用初始化函數
pwm_sz(); //調pwm輸出用初始化函數
time_csh(); //調兩個定時器初始化函數
}
//********************上電防飛車函數歸0后led正常閃爍******************************
void sd_ffc(void)
{
set_p13_adc(); //調轉把電壓轉換通道
get_ad_dy(); //上電后測量轉把電壓是否歸零
while(adc_data>=61) //61為1.2v轉換值轉把如果大于1.2v執行循環體語句等待歸0
{ledcs=2;led_k(); //循環體語句,2次間隔性快閃燈
get_ad_dy(); //循環體語句,重新檢測電壓等待歸0
}
tr0=0; //關pwm頻率否則干擾閃燈
timebj=12; //歸0后定時器中斷10次閃爍一次led
tr1=1; //歸0后開定時器1-led閃爍
}
//*************剎車函數自動選擇是斷電還是abs剎車功***************************
void sc_stop(void) //abs剎車有外接口對地選擇,對地時為abs功能
{
if(shache==0) //判斷語句剎車口等于0執行大語句1
{ abs=1;
//大語句體1
if(abs==1) //判斷abs選擇不為0就執行普通剎車斷電,否則執行abs剎車
//==========普通剎車斷電==================================================
{
tr0=0;led=0; //關測速定時器,亮剎車燈
pca_pwm0=0x03; //關3路pwm信號ah
pca_pwm1=0x03; //關3路pwm信號bh
pca_pwm2=0x03; //關3路pwm信號ch
pwmal=0;pwmbl=0;pwmcl=0; //關3路下橋
//----------------------------------------------------------------------
while(shache==0) //循環語句,剎車口沒松開就一直等待
{delay(500);} //語句體,延時抗干擾防止抖動
hehc_bl=0;led=1; //剎車口松開后清霍爾變量內存再關剎車燈
//----------------------------------------------------------------------
for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--) //以下兩句為剎車口松開后減緩沖擊
{he_gzjc();pwm_out();} //從最低速度加高到實時的轉把設定速度
}
//===========eabs剎車斷電=====================================================
else //abs功能已選擇進入abs剎車
{ //
tr0=0;led=0; //關測速定時器,亮剎車燈
pca_pwm0=0x03; //關3路pwm信號ah
pca_pwm1=0x03; //關3路pwm信號bh
pca_pwm2=0x03; //關3路pwm信號ch
pwmal=0;pwmbl=0;pwmcl=0; //關閉3個下橋:al-bl-cl
//-------------------------------------------------------------------------
do //do-while語句先執行do再執行while判斷表達式
{
for(h=100;h>0;h--) //每檢測一次沒松開就先執行1萬次abs點剎,防止剎車抖動干擾
{ pwmal=0;pwmbl=0;pwmcl=0;
delay1(1);
pwmal=1;pwmbl=1;pwmcl=1; //abs點剎
delay1(80);
}
}
while(shache==0); //內鑲循環語句,只要剎車沒松開就一直開abs點剎制動
hehc_bl=0;led=1; //剎車口為1后清霍爾變量內存再關剎車燈
pwmal=0;pwmbl=0;pwmcl=0; //點剎后要關閉所有下橋防止剎車松開后車推不動
for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)//以下幾句剎車后軟啟動,減少剎車后高速沖擊
{he_gzjc();pwm_out();}
}
//---------------
}
}
//*******************欠壓檢測函數**************************************************
void qy_jc(void)
{ //連續3次測量電池電壓抗干擾
set_p15_adc();
get_ad_dy(); //第1次測量電池電壓
qy_1=adc_data; //保存第1次測量數據
get_ad_dy(); //第2次測量電池電壓
qy_2=adc_data; //保存第2次測量數據
get_ad_dy(); //第3次測量電池電壓
qy_3=adc_data; //保存第3次測量數據
//比較取舍法,只有其中兩次相同才有效
if(qy_1==qy_2) //比較第1次和第2次結果是否相同,否轉下一輪判斷
{qy_bf=qy_1;adc_data=qy_1;} //相同的話本次測量有效有效,保存本次數據備份后直接退出if語句
else //第1次和第2次的結果不同,
{if(qy_2==qy_3) //再判斷第2次和第3次的結果相同嗎,否轉下一輪判斷
{qy_bf=qy_2;adc_data=qy_2;} //相同的話本次測量有效有效,保存本次數據備份后直接退出if語句
else //第1次和第2次的結果不同,
{if(qy_1==qy_3) //再判斷第1次和第3次的結果相同嗎,3次都不同的話取舊備份數據
{qy_bf=qy_3;adc_data=qy_3;}////相同的話本次測量有效有效,保存本次數據備份后直接退出if語句
else //3次都不同取舊備份數據
{adc_data=qy_bf;}
}
}
if(adc_data<=158) //電壓小于等于3.1v嗎,不等于直接退出
{tr0=0;tr1=0;led=1; //小于等于,電池電壓過低,關pwm頻率保護電池
pca_pwm0=0x03; //關3路pwm信號
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //關3路下橋
do{ledcs=3;led_k();get_ad_dy();} //閃燈提示重新測量電壓
while(adc_data<=175); //檢測是否恢復到正常電壓44v
ledcs=3;led_k(); //電壓恢復44v以上再閃燈做為延時用
hehc_bl=0; //清霍爾舊數據為了起動
}
}
//*******************霍爾故障檢測函數**********************************************
void he_gzjc(void)
{
hehc=p1&amt;0x07; //讀入霍爾數據,并分離有效數據
//--查霍爾是否全1--------
while(hehc==0x07) //判斷是否為3個全1,成立循環執行語句體
{pca_pwm0=0x03; //霍爾出現故障關閉所有輸出
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //
tr0=0;zs_ds_js=0;zs_js=0; //關測速定時器,定時計數器清0,轉速度計數器清0
ledcs=6;led_k(); //循環執行語句體6次閃爍,直到不成立退出
hehc=p1&amt;0x07; //重新檢測霍爾
}
//--查霍爾是否全0--------
while(hehc==0x00) //不為3個1再判斷是否為3個0,成立執行循環語句體
{pca_pwm0=0x03; //霍爾出現故障關閉所有輸出
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //
tr0=0;zs_ds_js=0;zs_js=0; //關測速定時器,定時計數器清0,轉速度計數器清0
ledcs=6;led_k(); //循環執行語句體6次閃爍,直到不成立退出
hehc=p1&amt;0x07; //重新檢測霍爾
}
//--查霍爾是否更新--------
if(hehc_bl!=hehc) //判斷霍爾是否變化,成立執行語句1后退出
{hehc_bl=hehc; } //語句2,霍爾變化存入新的數據到變量中
}
//**********電流自動調整函數******************************************************
void dl_tz(void)
{set_p17_adc();
get_ad_dy();
while(adc_data>=20)
{pwm_bls++;if(pwm_bls>=241){pwm_bls=241;}
he_gzjc();pwm_out();dgdz();
}
// if(adc_data>=45)
// {pwm_bls=240;//adc_data*10+pwm_bl;
// }
// else
//{pwm_bls=pwm_bl;}
}
//********************轉把工作狀態分析函數****************************************
//函數出口--pwm_bl里有查表后數據,pwm輸出程序直接讀出放入pwm占空比寄存器
//ccap0h,ccap1h,ccap2h中即可
//********************************************************************************
void zb_fx(void)
{ //---連續3次測量轉把電壓--------
set_p13_adc(); //調轉把電壓轉換通道
get_ad_dy(); //第一次測量轉把電壓
pwm_bl=pwmout[adc_data]; //在數組中查出對應的ad轉換pwm值
if(pwm_bl==1) //為1成立執行大的語句1后退出,不成立執行語句2后退出
//語句1,轉把電壓等于1說明轉把在1.3v以下或4.5v以上停止輸出閃led
{
hehc_bl=0; //霍爾存儲舊數據的變量及時清0否則很難起動
pca_pwm0=0x03; //停止所有輸出
pca_pwm1=0x03;
pca_pwm2=0x03;
tr0=0;zs_ds_js=0;zs_js=0; //關測速定時器,定時計數器清0,轉速度計數器清0
pwmal=0;pwmbl=0;pwmcl=0; //關3個下橋
timebj=15; //定時器1中斷12次閃爍一次led
tr1=1;zbyx_bz=0; //開定時器1-led閃爍,轉把歸0標志位為0,pwm輸出就無效
}
else
//語句2,轉把電壓不等于1說明在1.3v-4.5v之間正常行駛數據
{led=1;zbyx_bz=1;tr0=1;} //關定時器1指示燈,轉把有效標志位為1,pwm輸出有效
}
//**********************軟啟動************************************
//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();}
// }
//}
//********************防盜鎖電機函數**********************************************
fd_dg()
{while(fd==0)
{
{int fd_he;
fd_he=p1&amt;0x07;
if(fd_he!=fd_hej)
{fd_hej=fd_he;
//switch(fd_he) //多分支語句根據霍爾位置輸出對應節拍
// {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刷新參數開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刷新參數開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刷新參數開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刷新參數開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刷新參數開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刷新參數開b下橋a上橋
// }
}
}
}
}
//********************主函數******************************************************
main()
{
sd_csh(); //調上電初始化函數
qy_jc(); //調欠壓檢測函數
sd_ffc(); //調上電防飛車函數,等待歸0后才往下執行
he_gzjc(); //調霍爾故障檢測函數,無故障才往下執行
while(1)
{
qy_jc();
if(fd==0){fd_hej=p1&amt;0x07;fd_dg();}//如果防盜口為低電平執行防盜程序
//--------------
else //否則執行正常程序
{
if(dz_bz1!=1){zb_fx();} //1>調轉把分析函數
if(zbyx_bz==1) //如果轉把標志位為1轉把有效,就執行語句體否則不執行
{dl_tz();dgdz();
he_gzjc();pwm_out();
cs_fx=cs1&amt;cs2&amt;cs3;
if(cs_fx!=0x00)
{zs_js++;}
} //語句體,調霍爾分析函數,調pwm輸出函數
sc_stop(); //調剎車斷電檢測函數
}
//-----------------------
}
}
//********************************************************************************
復制代碼
以上代碼打包(方便保存):
帶霍爾傳感器的無刷電機控制程序(PWM調速) 基于單片機編寫的C程序.rar
(5.82 KB, 下載次數: 116)
2020-10-15 21:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
51hei團團
時間:
2020-10-15 22:51
樓主能分享下線路圖嗎?
作者:
m182892
時間:
2020-10-16 09:56
有程序沒有原理圖不完整
作者:
ttmax3
時間:
2021-3-20 11:01
樓主,你的上橋程序里面沒有寫接那個腳呀。
作者:
huhuajie
時間:
2021-9-13 18:34
ttmax3 發表于 2021-3-20 11:01
樓主,你的上橋程序里面沒有寫接那個腳呀。
研究出來了嗎。
作者:
huhuajie
時間:
2021-9-15 03:33
有原理圖嗎
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1