直流无刷电机控制PIC程序全部整合_第1页
直流无刷电机控制PIC程序全部整合_第2页
直流无刷电机控制PIC程序全部整合_第3页
直流无刷电机控制PIC程序全部整合_第4页
直流无刷电机控制PIC程序全部整合_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、* */ pwm 占空比上限/ pwm 周期/ pwm 占空比下限 ,由 A/D 结果确定/ pwm 占空比实际/ A/D 转换结果/ 运行标志 -0 ,未运行,停止 开始为 自动/ 运行标志 -0 ,未运行,停止/ 开始为 自动/ pwm 周期/ pwm 占空比上限/ pwm 占空比上限#include <pic168xa.h>/2008.4.24-14 点00 分#include <math.h>#include <stdlib.h>int charge_delay,jm,lkk,trial,run_num,protect_num;char m,n,k,

2、s,L,tri; char hall_num;char /1+3+2+10+8+9=33(/ 循环次数 hall_number; 一个循环和 ), hallless_protect()int pwm_hi;int pwm_cycle;int pwm_lo;int pwm_real;int ad_result;bit ghy,run_flag;bit flag_autohand; / void delay(delay_num)int delay_num;int j;for (j=delay_num;j>1;j-)asm("nop");union adresint y1;

3、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;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; / 设 定 下 限 +void nointerupt_chushih

4、ua()INTCON=0X00;void Io_chushihua()/ 禁止中断/RA0/AN0-VOLTAGE电压采样 ,右对/ ADCON1=0x8e; 齐1ADCON1=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,电源接通 指示灯 ,输出 按键

5、,加,输入 指示灯 ,输出0->>10->>/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+

6、,PWMA1+,输出 0/RC6-A1, 输出0/RC5-/RC4-/RC3-/RC2-/RC1-/RC0-PORTC=0x06;void protect()GIE=0; pwm_real=pwm_hi;CCPR1L=pwm_real;CCPR1H=0x00;CCP1CON=0x0c;PR2=pwm_cycle;TRISC=TRISC&0xfb;B1+, 输出0B1, 输出0C1+, 输出0CCP1(PWM), 输出 ,死区 0- 减,输入,按钮1C1, 输出0/ 过流和过温保护/ 关全局中断/PWM_realPWM 实时值/ 设置 PWM 输出为最大/CCP1 选择为 PWM 工作方

7、式 / 设置 PWM 的周期/ 设置 RC2-PWM 输出/ 过流和过温保护/ 关全局中断/PWM_realPWM 实时值/ 设置 PWM 输出为最大/CCP1 选择为 PWM 工作方式/ 设置 PWM 的周期/ 设置 RC2-PWM 输出/ 分频系数 =0x00/ 启用 TMR2/RB0=0, 输出低电平,禁T2CON=0x00;TMR2ON=1;PORTC=0x00;PORTB=PORTB&0xfe;止 GAL 输出while(1)PORTA=0b00010100;delay(15000);void protect_run()GIE=0; pwm_real=pwm_hi;CCPR1

8、L=pwm_real;CCPR1H=0x00;CCP1CON=0x0c;PR2=pwm_cycle;TRISC=TRISC&0xfb;T2CON=0x00;TMR2ON=1;PORTC=0x00; PORTB=PORTB&0xfe;止 GAL 输出while(1)/PORTAA=0b00010000;PORTAA=0b00000100;delay(15000);void PWM_chushihua()/CCPR1L=0xa0;/CCPR1H=0x00;run_num=0; pwm_real=pwm_hi;CCPR1L=pwm_real;CCPR1H=0x00;CCP1CON=0

9、x0c;PR2=pwm_cycle; TRISC=TRISC&0xfb;T2CON=0x00;TMR2ON=1;void open_loopf()k=0b00011000;s=PORTC&0b00000110;/ 分频系数 =0x00/ 启用 TMR2/RB0=0, 输出低电平,禁/ 延时/RA4 闪动/RA2 闪动/ 延时/PWM_realPWM 实时值/ 设置 PWM 输出为最大/CCP1 选择为 PWM 工作方式/ 设置 PWM 的周期/ 设置 RC2-PWM 输出/ 分频系数 =0x00/ 启用 TMR2/ 开环运行 50 次,启动/5/HA,HB,HC,/1 0 1,

10、 B-C+PORTC=k|s; delay(8000);/ 延时/HA,HB,HC,/10 0, A+B-/ 延时/HA,HB,HC,/11 0, C-A+/ 延时/HA,HB,HC,/01 0, B+C-/ 延时/HA,HB,HC,/01 1, A-B+/ 延时/HA,HB,HC,/00 1, C+A-/ 延时/1 0 1 1/1 1 /001,C+A-/011,A-B+/010,B+C-/110,C-A+/100,A+B-/101,B-C+/HA,HB,HC,/ 其它 (000,111),0x00,Bk=0b10010000; /4 s=PORTC&0b00000110;PORTC

11、=k|s;delay(8000);k=0b10000001; /6 s=PORTC&0b00000110;PORTC=k|s;delay(8000);k=0b00100001; /2 s=PORTC&0b00000110;PORTC=k|s;delay(8000);k=0b01100000; /3 s=PORTC&0b00000110;PORTC=k|s;delay(8000);k=0b01001000; /1 s=PORTC&0b00000110;PORTC=k|s;delay(8000); void interrupt RB4_int() char th;

12、run_num+; if(run_num>10) run_num=10; m=PORTB;/RB7-HA,RB5-HB,RB4-HC m&=0xB0;mA=0x90;/A=/A,B=B,C=/Cn=m>>4;switch(n)/case 1: k=0b01001000;break;/case 3: k=0b01100000;break;/case 2: k=0b00100001;break;/case 10:k=0b10000001;break;/case 8: k=0b10010000;break;/case 9: k=0b00011000;break;/defau

13、lt:k=0b00000000;输出为无效case 1: k=0b00011000;break; case 3: k=0b01001000;break;case 2: k=0b01100000;break; case 10:k=0b00100001;break; case 8: k=0b10000001;break; case 9: k=0b10010000;break; default:k=0b00000000;出为无效 s=PORTC&0b00000110; PORTC=k|s;/011,A-B+/010,B+C/110,C-A+/100,A+B-/ 其它 (000,111),0x

14、00, 输/ 取 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/ tri=n;/ if /RB5=0/ tri=n; / if /RB4=0(tri&=0b00001000)=0)(tri&=0b00000010)=0)(tri&=

15、0b00000001)=0)trial&=0b00110000;trial&=0b10010000;trial&=0b10100000;/ 每 20 次测试一次/ 关全局中断/PWM_realPWM/ 设置 PWM 输出为最大/CCP1 选择为 PWM 工/ 设置 PWM 的周期/ 设置 RC2-PWM 输出/ 分频系数 =0x00/ 启用 TMR2/RB0=0, 输出低电/RA4 闪动/if (lkk>2) lkk-;elsewhile(trial!=0b00000000)GIE=0; pwm_real=pwm_hi;实时值CCPR1L=pwm_real;CCP

16、R1H=0x00;CCP1CON=0x0c;作方式PR2=pwm_cycle;TRISC=TRISC&0xfb;T2CON=0x00;TMR2ON=1;PORTC=0x00;PORTB=PORTB&0xfe; 平,禁止 GAL 输出while(1)PORTAWbOOOIOOOO;for (jm=15000;jm>1;jm-) asm("nop");trial=0b10110000;lkk=10;RBIF=0;void max_min_compare()if (pwm_real>pwm_hi) pwm_real=pwm_hi;if (pwm_rea

17、l<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 输出delay(100);RA1=1;接通电源delay(15000);RA5=1;主电路充电延时delay(10

18、0);PP: asm(" nop");RBIF=0; 标志设定RBIE=0; 定GIE=0;RA2=0;RA4=0;run_flag=0;设置while(run_flag=0) /if (RB2=0) run_flag=1; 置delay(100); while(run_flag=1)/ 参数初始化/ 禁止中断初始化/I/O 初始化/PWM 初始化/RA1-PSW1 发送低电平 ,/RA2 ,指示灯灭/RA4 ,指示灯灭/ 主电路充电延时/ST/(-STOP) 发送低电平 ,/RA1-PSW1 发送高电平 ,/RA5-RSW1 发送高电平 , / 主电路充电延时/ 禁止 R

19、B4-7 中断 ,清 RBIFII禁止RB4-7中断,RBIE设/ 关全局中断IIRA2 ,指示灯灭IIRA4 ,指示灯灭II 运行标志 - 由 RB2 按钮II 主 程 序IIRB2 启动键,低电平有效II 运行标志 - 由 RB2 按钮设II 延时IIII 运行,则执行 int ope;int openloopn; RB0=1;开放 GAL 输出 delay(100); RA4=1;/ pwm_real=180; pwm_real=230;delay(500); / ope=10; 次ope=3;次/ 设定开环运行次数为 12 次/ST/(-STOP) 发送高电平 ,/ 延时/ 延时/ 设

20、定开环运行次数为 20/ 设定开环运行次数为 20for (openloopn=0;openloopn<=ope;openloopn+)00000000000000000CCPR1L=pwm_real; 值130open_loopf();/000000000000000000 delay(6000);RBIF=0;定RBIE=1;GIE=1;RA2=1; pwm_real=pwm_hi;ghl: asm(" nop");/0/ 设置开环下 PWM 输出/ 开环运行 20 次,启动/ 延时/RB4-7 中断 ,RBIF 标志设/RB4-7 中断 ,RBIE 设定/ 开全

21、局中断/while(RA0=1)delay(150); protect_num+;if (protect_num>30)/ 过温和过流保护软件滤波) protect();protect_num=0;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; else flag_autohand=0;/ 自/ 手标志设定,标志设/RB1=1-AUTO; 自动* */11/RB1=0-HAND; 手动 /if (flag_autohand=1)111111111111111

温馨提示

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

评论

0/150

提交评论