直流无刷电机控制PIC程序(最新).doc_第1页
直流无刷电机控制PIC程序(最新).doc_第2页
直流无刷电机控制PIC程序(最新).doc_第3页
直流无刷电机控制PIC程序(最新).doc_第4页
直流无刷电机控制PIC程序(最新).doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include /2008.4.24-14点00分#include#includeint charge_delay,jm,lkk,trial,run_num,protect_num;char m,n,k,s,L,tri;char hall_num; /循环次数char hall_number; /1+3+2+10+8+9=33(一个循环和),hallless_protect() int pwm_hi; / pwm占空比上限int pwm_cycle; / pwm周期int pwm_lo; / pwm占空比下限,由A/D结果确定int pwm_real; / pwm占空比实际int ad_result; / A/D转换结果bit ghy,run_flag; /运行标志-0,未运行,停止bit flag_autohand; /开始为-自动void delay(delay_num) int delay_num; int j; for (j=delay_num;j1;j-) asm(nop); union adres int y1; unsigned char adre2; adresult;void para_chushihua() protect_num=0; trial=0b10110000; tri=0x00; lkk=10; hall_num=0x00; hall_number=0x00; run_flag=0; /运行标志-0,未运行,停止 flag_autohand=1; /开始为-自动 pwm_cycle= 240; / pwm周期/ pwm_hi=pwm_cycle-5; / pwm占空比上限 pwm_hi=pwm_cycle-1; / pwm占空比上限 pwm_real=pwm_cycle; / 实际pwm占空比为pwm周期上限 pwm_lo=0x0A; /设定下限+void nointerupt_chushihua() INTCON=0X00; /禁止中断 void Io_chushihua()/ ADCON1=0x8e; /RA0/AN0-VOLTAGE 电压采样,右对齐 1 ADCON1=0x86; /设定RA0-RA6设定为I/O口; TRISA =0x09; /RA0-PROTECT保护(电流保护和过温保护)-输出,0-不保护,1-保护; /RA1-PSW1,继电器,输出,0,电源接通 /RA2-指示灯,输出 0- /RA3-按键,加,输入 1 /RA4-指示灯,输出 0- /RA5-RSW1,继电器,输出0,软启充电 PORTA=PORTA&0x09; /RA1=0,-输出低电平,PSW1,继电器断 /RA2=0,-输出低电平,指示灯灭 /RA4=0,-输出低电平,指示灯灭 /RA5=0,-输出低电平,RSW1,继电器断 RBPU=0; /RB端口内部弱上拉电路禁止 TRISB =0xfe; /RB7=1, 空-输入 /RB6=1-HA,输入 /RB5=1-HB,输入 /RB4=1-HC,输入 /RB3=1-停,输入,按钮 /RB2=1-启,输入,按钮 /RB1=1-自/手选择,输入,开关 /RB0=0-ST/STOP,输出,控制GAL PORTB=PORTB&0xfe; /RB0=0,-输出低电平,禁止GAL输出 TRISC =0x02; /RC7-A1+,PWMA1+,输出 0 /RC6-A1, 输出 0 /RC5-B1+,输出 0 /RC4-B1,输出 0 /RC3-C1+,输出 0 /RC2-CCP1(PWM),输出,死区 0 /RC1-减,输入,按钮 1 /RC0-C1,输出 0 PORTC=0x06; void protect() /过流和过温保护 GIE=0; /关全局中断 pwm_real=pwm_hi; /PWM_real-PWM实时值 CCPR1L=pwm_real; /设置PWM输出为最大 CCPR1H=0x00; / CCP1CON=0x0c; /CCP1选择为PWM工作方式 PR2=pwm_cycle; /设置PWM的周期 TRISC=TRISC&0xfb; /设置RC2-PWM输出 T2CON=0x00; /分频系数=0x00 TMR2ON=1; /启用 TMR2 PORTC=0x00; / PORTB=PORTB&0xfe; /RB0=0,-输出低电平,禁止GAL输出 while(1) PORTA=0b00010100; delay(15000); /延时 void protect_run() /过流和过温保护 GIE=0; /关全局中断 pwm_real=pwm_hi; /PWM_real-PWM实时值 CCPR1L=pwm_real; /设置PWM输出为最大 CCPR1H=0x00; / CCP1CON=0x0c; /CCP1选择为PWM工作方式 PR2=pwm_cycle; /设置PWM的周期 TRISC=TRISC&0xfb; /设置RC2-PWM输出 T2CON=0x00; /分频系数=0x00 TMR2ON=1; /启用 TMR2 PORTC=0x00; / PORTB=PORTB&0xfe; /RB0=0,-输出低电平,禁止GAL输出 while(1) / PORTA=0b00010000; /RA4闪动 PORTA=0b00000100; /RA2闪动 delay(15000); /延时 void PWM_chushihua()/ CCPR1L=0xa0;/ CCPR1H=0x00; run_num=0; pwm_real=pwm_hi; /PWM_real-PWM实时值 CCPR1L=pwm_real; /设置PWM输出为最大 CCPR1H=0x00; / CCP1CON=0x0c; /CCP1选择为PWM工作方式 PR2=pwm_cycle; /设置PWM的周期 TRISC=TRISC&0xfb; /设置RC2-PWM输出 T2CON=0x00; /分频系数=0x00 TMR2ON=1; /启用 TMR2void open_loopf() /开环运行50次,启动 k=0b00011000; /5 /HA,HB,HC, s=PORTC&0b00000110; /1 0 1, B-C+ PORTC=k|s; / delay(8000); /延时 k=0b10010000; /4 /HA,HB,HC, s=PORTC&0b00000110; /1 0 0, A+B- PORTC=k|s; / delay(8000); /延时 k=0b10000001; /6 /HA,HB,HC, s=PORTC&0b00000110; /1 1 0, C-A+ PORTC=k|s; / delay(8000); /延时 k=0b00100001; /2 /HA,HB,HC, s=PORTC&0b00000110; /0 1 0, B+C- PORTC=k|s; / delay(8000); /延时 k=0b01100000; /3 /HA,HB,HC, s=PORTC&0b00000110; /0 1 1, A-B+ PORTC=k|s; / delay(8000); /延时 k=0b01001000; /1 /HA,HB,HC, s=PORTC&0b00000110; /0 0 1, C+A- PORTC=k|s; / delay(8000); /延时 void interrupt RB4_int() char th; run_num+; if(run_num10) run_num=10; m=PORTB; /RB7-HA,RB5-HB,RB4-HC m&=0xB0; /1 0 1 1 m=0x90;/A=/A,B=B,C=/C /1 1 n=m4; / switch(n) /HA,HB,HC, / case 1: k=0b01001000;break; /0 0 1, C+A-/ case 3: k=0b01100000;break; /0 1 1, A-B+/ case 2: k=0b00100001;break; /0 1 0, B+C-/ case 10:k=0b10000001;break; /1 1 0, C-A+/ case 8: k=0b10010000;break; /1 0 0, A+B-/ case 9: k=0b00011000;break; /1 0 1, B-C+/ default:k=0b00000000; /其它(000,111),0x00,输出为无效 case 1: k=0b00011000;break; /1 0 1, B-C+ case 3: k=0b01001000;break; /0 0 1, C+A- case 2: k=0b01100000;break; /0 1 1, A-B+ case 10:k=0b00100001;break; /0 1 0, B+C- case 8: k=0b10000001;break; /1 1 0, C-A+ case 9: k=0b10010000;break; /1 0 0, A+B- default:k=0b00000000; /其它(000,111),0x00,输出为无效 s=PORTC&0b00000110; /取RC1,RC2状态 PORTC=k|s; /输出PORTC if (RB7=0) trial&=0b00110000; /RB7=0 if (RB5=0) trial&=0b10010000; /RB5=0 if (RB4=0) trial&=0b10100000; /RB4=0 if (lkk1) lkk-; /每20次测试一次/ tri=n;/ if (tri&=0b00001000)=0) trial&=0b00110000; /RB7=0/ tri=n;/ if (tri&=0b00000010)=0) trial&=0b10010000; /RB5=0/ tri=n;/ if (tri&=0b00000001)=0) trial&=0b10100000; /RB4=0/ if (lkk2) lkk-; /每20次测试一次 else while(trial!=0b00000000) GIE=0; /关全局中断 pwm_real=pwm_hi; /PWM_real-PWM实时值 CCPR1L=pwm_real; /设置PWM输出为最大 CCPR1H=0x00; / CCP1CON=0x0c; /CCP1选择为PWM工作方式 PR2=pwm_cycle; /设置PWM的周期 TRISC=TRISC&0xfb; /设置RC2-PWM输出 T2CON=0x00; /分频系数=0x00 TMR2ON=1; /启用 TMR2 PORTC=0x00; / PORTB=PORTB&0xfe; /RB0=0,-输出低电平,禁止GAL输出 while(1) PORTA=0b00010000; /RA4闪动 for (jm=15000;jm1;jm-) asm(nop); trial=0b10110000; lkk=10; RBIF=0;void max_min_compare() if (pwm_realpwm_hi) pwm_real=pwm_hi; if (pwm_realpwm_lo) pwm_real=pwm_lo;main(void) para_chushihua(); /参数初始化 nointerupt_chushihua(); /禁止中断初始化 Io_chushihua(); /I/O初始化 PWM_chushihua(); /PWM初始化 RA1=0; /RA1-PSW1发送低电平,接通电源 RA5=0; /RA5-RSW1发送低电平,主电路充电延时 RA2=0; /RA2,指示灯灭 RA4=0; /RA4,指示灯灭 delay(100); /主电路充电延时 RB0=0; /ST/(-STOP)发送低电平,禁止GAL输出 delay(100); RA1=1; /RA1-PSW1发送高电平,接通电源 for(charge_delay=0;charge_delay50;charge_delay+) delay(15000); RA5=1; /RA5-RSW1发送高电平,主电路充电延时 delay(100); /主电路充电延时PP: asm( nop); / RBIF=0; /禁止RB4-7中断,清RBIF标志设定 RBIE=0; /禁止RB4-7中断,RBIE设定 GIE=0; /关全局中断 RA2=0; /RA2,指示灯灭 RA4=0; /RA4,指示灯灭 run_flag=0; /运行标志-由RB2按钮设置 while(run_flag=0) /-主程序-/ /RB2启动键,低电平有效 if (RB2=0) run_flag=1; /运行标志-由RB2按钮设置 delay(100); /延时 / while(run_flag=1) /运行,则执行. int ope; /设定开环运行次数为12次 int openloopn; / RB0=1; /ST/(-STOP)发送高电平,开放GAL输出 delay(100); /延时 RA4=1; / pwm_real=180; pwm_real=230; delay(500); /延时/ ope=10; /设定开环运行次数为20次 ope=3; /设定开环运行次数为20次 for (openloopn=0;openloopn=ope;openloopn+) /000000000000000000 CCPR1L=pwm_real; /设置开环下PWM输出值-130 open_loopf(); /开环运行20次,启动 /- /000000000000000000 delay(6000); /延时 RBIF=0; /RB4-7中断,RBIF标志设定 RBIE=1; /RB4-7中断,RBIE设定 GIE=1; /开全局中断 RA2=1; /- pwm_real=pwm_hi; /-ghl: asm( nop); / if (pwm_real110)&(run_num10) /如果pwm_real140,但是run_num30)/如果30次保护,则认为是真正保护(过温和过流保护软件滤波) protect(); /过流和过温保护 / protect_num=0; / if(RB1=1) flag_autohand=1; /自/手标志设定,标志设定 else flag_autohand=0; /RB1=1-AUTO;自动 /R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论