直流无刷电机控制PIC程序Word文档下载推荐.docx
《直流无刷电机控制PIC程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《直流无刷电机控制PIC程序Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
protect_num=0;
trial=0b10110000;
tri=0x00;
lkk=10;
hall_num=0x00;
//运行标志---0,未运行,停止
//开始为自动
hall_number=0x00;
run_flag=0;
flag_autohand=1;
pwm_cycle=240;
//pwm_hi=pwm_cycle-5;
pwm_hi=pwm_cycle-1;
pwm_real=pwm_cycle;
//实际pwm占空比为pwm周期上限
pwm_lo=0x0A;
//设定下限+++++++++++++++++++++++++++++++++++++++
++++++++
voidnointerupt_chushihua()
INTCON=0X00;
voidIo_chushihua()
//禁止中断
//RA0/AN0--VOLTAGE电压采样,右对
//ADCON1=0x8e;
齐1
ADCON1=0x86;
TRISA=0x09;
保护)--输出,0--不保护,1--保护;
//RA1---
//RA2---
//RA3---
//RA4---
//RA5RSW1,继电器,输出0,软启充电
PORTA=PORTA&
0x09;
//RA1=0,输出低电平,PSW1,继
电器断
//设定RA0--RA6设定为I/O口;
//RA0---PROTECT保护(电流保护和过温
PSW1,继电器,输出,0,电源接通指示灯,输出按键,加,输入指示灯,输出
0--->
>
1
//RA2=0,
//RA4=0,
//RA5=0,
输出低电平,指示灯灭
输出低电平;
指示灯灭继电器
TRISB=0xfe;
//RB7=1,
空-
-输入
//RB6=1--
--HA,
输入
//RB5=1--
--HB,
//RB4=1--
--HC,
//RB3=1--
停
输入,
按钮
//RB2=1--
"
丿
//RB1=1--
自/手选择
,输入,
//RB0=0--
--ST/STOP
,输出,
PORTB=PORTB&
0xfe;
//RB0=0,--
输出低电平,
RBPU=0;
//RB端口内部弱上拉电路禁止
开关
控制GAL
禁止GAL输
TRISC=0x02;
//RC7---A1+,PWMA1+,输出0
//RC6---A1,输出0
//RC5--
//RC4--
//RC3--
//RC2--
//RC1--
//RC0--
PORTC=0x06;
voidprotect()
GIE=0;
pwm_real=pwm_hi;
CCPR1L=pwm_real;
CCPR1H=0x00;
CCP1CON=0x0c;
PR2=pwm_cycle;
TRISC=TRISC&
0xfb;
B1+,输出0
B1,输出0
C1+,输出0
CCP1(PWM),输出,死区0
-减,输入,按钮1
C1,输出0
//过流和过温保护
//关全局中断
//PWM_realPWM实时值
//设置PWM输出为最大
//
//CCP1选择为PWM工作方式//设置PWM的周期
//设置RC2---PWM输出
//CCP1选择为PWM工作方式
//设置PWM的周期
//分频系数=0x00
//启用TMR2
//RB0=0,输出低电平,禁
T2CON=0x00;
TMR2ON=1;
PORTC=0x00;
止GAL输出
while
(1)
PORTA^=0b00010100;
delay(15000);
voidprotect_run()
PORTB=PORTB&
//PORTAA=0b00010000;
PORTAA=0b00000100;
voidPWM_chushihua()
//CCPR1L=0xa0;
//CCPR1H=0x00;
run_num=0;
TRISC=TRISC&
voidopen_loopf()
k=0b00011000;
s=PORTC&
0b00000110;
//延时
//RA4闪动
//RA2闪动
//开环运行50次,启动
//5//HA,HB,HC,
//101,B-C+
//1011
//11//
k=0b10010000;
//4s=PORTC&
PORTC=k|s;
delay(8000);
k=0b10000001;
//6s=PORTC&
k=0b00100001;
//2s=PORTC&
k=0b01100000;
//3s=PORTC&
k=0b01001000;
//1s=PORTC&
}voidinterruptRB4_int()
{charth;
run_num++;
if(run_num>
10){run_num=10;
}m=PORTB;
//RB7-HA,RB5-HB,RB4-HCm&
=0xB0;
mA=0x90;
//A=/A,B=B,C=/C
n=m>
4;
switch(n)
//case1:
k=0b01001000;
break;
//case3:
k=0b01100000;
//case2:
k=0b00100001;
//case10:
//case8:
k=0b10010000;
//case9:
k=0b00011000;
//default:
k=0b00000000;
输出为无效
case1:
case3:
case2:
case10:
case8:
k=0b10000001;
case9:
default:
出为无效
}s=PORTC&
PORTC=k|s;
//取RC1,RC2状态//输出PORTC//RB7=0//RB5=0//RB4=0
//每20次测试一次
if(RB7==0){trial&
=0b00110000;
}if(RB5==0){trial&
=0b10010000;
}if(RB4==0){trial&
=0b10100000;
}if(lkk>
1){lkk--;
//tri=n;
//if//RB7=0
//if//RB5=0
//if//RB4=0
((tri&
=0b00001000)==0)
=0b00000010)==0)
=0b00000001)==0)
{trial&
//PWM_realPWM
//CCP1选择为PWM工
//RB0=0,输出低电
//if(lkk>
2){lkk--;
else
while(trial!
=0b00000000)
实时值
作方式
平,禁止GAL输出
PORTAWbOOOIOOOO;
for(jm=15000;
jm>
jm--){asm("
RBIF=0;
voidmax_min_compare()
if(pwm_real>
pwm_hi)pwm_real=pwm_hi;
if(pwm_real<
pwm_lo)pwm_real=pwm_lo;
}
main(void)
主电路充电延时
for(charge_delay=0;
charge_delay<
50;
charge_delay++)
//RA5-RSW1发送低电平,
para_chushihua();
nointerupt_chushihua();
Io_chushihua();
PWM_chushihua();
RA1=0;
接通电源
RA5=0;
RA2=0;
RA4=0;
delay(100);
RB0=0;
禁止GAL输出
RA1=1;
RA5=1;
PP:
asm("
nop"
标志设定
RBIE=0;
定
设置
while(run_flag==0)//
if(RB2==0)run_flag=1;
置
}while(run_flag==1)
//参数初始化
//禁止中断初始化
//I/O初始化
//PWM初始化
//RA1-PSW1发送低电平,
//RA2,指示灯灭
//RA4,指示灯灭
//主电路充电延时
//ST/(-STOP)发送低电平,
//RA1-PSW1发送高电平,
//RA5-RSW1发送高电平,//主电路充电延时
//禁止RB4-7中断,清RBIF
II禁止RB4-7中断,RBIE设
IIRA2,指示灯灭
IIRA4,指示灯灭
II运行标志---由RB2按钮
II主程序
IIRB2启动键,低电平有效
II运行标志---由RB2按钮设
II延时
II
II运行,则执行
intope;
intopenloopn;
RB0=1;
开放GAL输出delay(100);
RA4=1;
//pwm_real=180;
pwm_real=230;
delay(500);
//ope=10;
次
ope=3;
次
//设定开环运行次数为12次
//ST/(-STOP)发送高电平,
//设定开环运行次数为20
for(openloopn=0;
openloopn<
=ope;
openloopn++)
00000000000000000
值130
open_loopf();
//000000000000000000delay(6000);
定
RBIE=1;
GIE=1;
RA2=1;
ghl:
//0
//设置开环下PWM输出
//开环运行20次,启动
//
//RB4-7中断,RBIF标志设
//RB4-7中断,RBIE设定
//开全局中断
if((pwm_real<
110)&
&
(run_num<
10))//如果pwm_real<
140,但是run_num<
10,表明未动,则
{//protect_run();
protect_run();
//RA0=1,过流和过温保护
//调用延时程序
如果30次保护,则认为是真正保护
if(RB1==1)flag_autohand=1;
elseflag_autohand=0;
//自/手标志设定,标志设
//RB1=1---AUTO;
自动
//RB1=0---HAND;
手动//
if(flag_autohand==1)
111111*********111
pwm_lo)pwm_real-=1;
//
elsepwm_real=pwm_lo;
//111111*********11111
自动
if(RA3==0)
//加(低有效),则
pwm_hi)pwm_real+=1;
elsepwm_real=pwm_hi;
if(RC1==0)
//减(低有效),则
elsepwm_real=pwm_lo;
}max_min_compare();
CCPR1L=pwm_real;
delay(4500);
while(RA0==1)护输入,高电平保护
//设置PWM输出
//调用延时子程序
//RA0过流和过温保
protect();
while(RB3==0)
{//RB3停机键,低电平有效
//运行标志---由RB3按钮
if(run_flag==0)//停机,则跳转至
for(;
pwm_real<
pwm_hi;
pwm_real++)
delay(2000);
禁止GAL输出para_chushihua();
run_num=0;
gotoPP;
//至上限否?
//ST/(-STOP)发送低电平,//参数初始化
//run_num=0;
gotoghl;
//gotoPP;