1、电机速度控制PIC课设报告程序附录:#include_CONFIG(0x00F1);/_CONFIG(0x3F71);#define LCD_E RD6#define LCD_RW RD5#define LCD_RS RD4#define COM 0#define DAT 1#define LINE1 0b10000000#define LINE2 0b11000000#define LED RB5#define DN_POSITION LINE2+15 /第2行显示速度回差的个位位置#define DN_POSITION LINE2+15 /第2行显示速度回差的个位位置bank1 char
2、DD16;const char MENU0217= PIC 16F887 , PICC 9.5 ,;const char LINE2=LINE1,LINE2;const unsigned int ND11=200,500,800,1100,1400,1700,2000,2300,2600,2900,3200;/定义结构体类型STRU的变量KEYstruct STRU unsigned SET:3; unsigned INC:1; unsigned DEC:1; unsigned FLAG:1; unsigned CHANGE:1; unsigned SETINT:1;KEY;union /联合
3、体AD_RESULT存放AD转换结果 unsigned int AD_TEMP; char AD2;AD_RESULT;/EEPROM第一单元占空比D初值,第二单元转速误差运行值DN初值_EEPROM_DATA(200,10,255,255,255,255,255,255); unsigned char D; /占空比10倍unsigned HT; /高电平时间(us)unsigned int N0_MIN=150;unsigned int N0_MAX=2048;unsigned int N0; /期望转速值unsigned int N; /实际测速值unsigned char DN; /转
4、速误差unsigned long n;char WW,QW,BW,SW,GW;unsigned char T0N;unsigned int DN_OLD;unsigned int T=0;unsigned int N1;unsigned int N2;int AD_SUB(void);void CSH(void);void DISP_N0_DN(unsigned int,unsigned char);void DISP_N_D(unsigned int,unsigned char);void CAP_CSH(void);void PWM_CSH(unsigned int);void DUTY_
5、SET(unsigned int);void AD_CSH(void); void LCD_CSH(void);void LCD_WRITE_4(char,char);void LCD_WRITE(char,char);void LCD_BUSY(void);char LCD_READ(void);void DISP_C(char);void DISP_MENU(const char *A);void BCD(unsigned int);void DELAY(unsigned int);void DELAY_I(unsigned int);void DELAY_US(char);void in
6、terrupt INT_ISR(void);void change(void);/unsigned int DN_GET(void);/宏定义:清屏#define CLR_LCD() LCD_WRITE(0b00000001,COM); DELAY(2)/AD转换,期望转速N0取值N0_MINN0_MAX,并放大100倍 void main(void) unsigned int i; CSH(); DISP_MENU(*MENU0); DELAY(100); / DELAY(400); CLR_LCD(); while(1) N0=AD_SUB(); DISP_N0_DN(N0,DN); /显
7、示期望转速和转速误差允许值 DISP_N_D(N,D); change(); /显示实际转速和占空比 while (KEY.FLAG=0) DELAY(1); i+; if (i200) LED=0; if (i400) break; DN_OLD=DN;while(KEY.FLAG=1) if (KEY.SET=1) /进入修改,字符闪 LCD_WRITE(DN_POSITION,COM); /确定字符闪的位置 LCD_WRITE(0b00001111,COM); /字符闪 if (KEY.SETINT=1) if (KEY.SET=1) N1=NDT; DELAY_US(3); KEY.S
8、ETINT=0;T+; if(T10)T=0; KEY.CHANGE=1; if (KEY.INC=1) if (KEY.SET=1)DN+; KEY.INC=0; KEY.CHANGE=1; if (KEY.DEC=1) if (KEY.SET=1)DN-; KEY.DEC=0; KEY.CHANGE=1; if (KEY.CHANGE=1) /如果有修改,刷新显示 DISP_N0_DN(N0,DN); KEY.CHANGE=0; if (KEY.SET=1) /刷新后重新开字符标闪 LCD_WRITE(DN_POSITION,COM); /确定字符闪的位置 LCD_WRITE(0b0000
9、1101,COM); /字符闪 if (DN_OLD!=DN) EEPROM_WRITE(1,DN); /写入速度控制的回差值,在EEPROM的地址1 void change(void) unsigned int j; if(NN0+DN) HT-; if(HT1000)HT=1000; DUTY_SET(HT); DELAY(300); else if(N1000)HT=0; DUTY_SET(HT); DELAY(300); LED=1; j=0;void CSH(void) ANSELH=0;/关闭B口模拟引脚,设为I/O引脚 TRISB=0b00001111; OPTION=0b000
10、10111;/B口上拉,且下降沿中断 INTCON=0b11010000;/GIE=1;PEIE=1;INTE=1;RBIE=1; IOCB=0b00001110;/B口电平变化中断控制寄存器,RB1、RB2电平变化产生中断,在RBIE=1的前提下 KEY.FLAG=0; KEY.SET=0; TMR1H=TMR1L=0; T1CON =0b00110001;/1:8分频 TRISD=0b00000000; TRISC=0b00100000; HT=EEPROM_READ(0); DN=EEPROM_READ(1); LCD_CSH(); CAP_CSH(); PWM_CSH(HT); AD_
11、CSH(); int AD_SUB(void) GODONE=1; while(GODONE=1); ADIF=0; AD_RESULT.AD0=ADRESL; AD_RESULT.AD1=ADRESH; n=AD_RESULT.AD_TEMP; n*=350; N2=n/1023+N1; return N2;void DISP_N0_DN(unsigned int START_N0,unsigned char DELTA_N) LCD_WRITE(0b00001100,COM); /不闪 LCD_WRITE(LINE2,COM); /即第2行的第0个字符 BCD(START_N0); /将要
12、显示的起动占空比值做BCD转换 LCD_WRITE(N,DAT); /在当前位置显示字符N LCD_WRITE(0,DAT); /在当前位置显示字符0 LCD_WRITE(=,DAT); /在当前位置显示字符: LCD_WRITE(QW+0x30,DAT); /显示千位 LCD_WRITE(BW+0x30,DAT); /显示百位 LCD_WRITE(SW+0x30,DAT); /显示十位 LCD_WRITE(GW+0x30,DAT); /显示个位 LCD_WRITE(r,DAT); /在当前位置显示字符r LCD_WRITE(p,DAT); /在当前位置显示字符/ LCD_WRITE(m,DA
13、T); /在当前位置显示字符m LCD_WRITE( ,DAT); /在当前位置显示空格 BCD(DELTA_N); /将要显示的转速n控制回差量做BCD转换 LCD_WRITE(D,DAT); /在当前位置显示字符D LCD_WRITE(n,DAT); /在当前位置显示字符n LCD_WRITE(=,DAT); /在当前位置显示字符: LCD_WRITE(SW+0x30,DAT); /显示十位 LCD_WRITE(GW+0x30,DAT); /显示个位void DISP_N_D(unsigned int R1,unsigned char DUTY) /速度在R1,占空比DUTY LCD_WR
14、ITE(0b00001100,COM); /不闪 BCD(R1); LCD_WRITE(LINE1,COM); /DDRAM地址,第1行的第5个字符 LCD_WRITE( ,DAT); /在当前位置显示空格 LCD_WRITE(N,DAT); LCD_WRITE(=,DAT); LCD_WRITE(QW+0x30,DAT); /显示千位 LCD_WRITE(BW+0x30,DAT); /显示百位 LCD_WRITE(SW+0x30,DAT); /显示十位 LCD_WRITE(GW+0x30,DAT); /显示个位 LCD_WRITE(r,DAT); /在当前位置显示字符r LCD_WRITE(
15、p,DAT); /在当前位置显示字符/ LCD_WRITE(m,DAT); /在当前位置显示字符m LCD_WRITE( ,DAT); /在当前位置显示空格 BCD(DUTY); /将要显示的转速n控制回差量做BCD转换 LCD_WRITE(D,DAT); /在当前位置显示字符D LCD_WRITE(=,DAT); /在当前位置显示字符: LCD_WRITE(SW+0x30,DAT); /显示十位 LCD_WRITE(GW+0x30,DAT); /显示个位 LCD_WRITE(%,DAT); /显示字符%void CAP_CSH(void) TRISC2=1; CCP1CON=0b000001
16、10; TMR1H=TMR1L=0; T1CON=0b00110001; CCP1IF=0; CCP1IE=1; GIE=1; PEIE=1;void interrupt INT_ISR(void) long X; unsigned int TZ; if(CCP1IF=1) TMR1H=TMR1L=0; TZ=(CCPR1H1) KEY.SET=0; KEY.FLAG=0; RBIE=0; / TMR1ON=1; RBIE=1; / PEIE=1; / GIE=1; T0IE=1; TMR0=0; T0IF=0; T0N=0; if (RBIF=1) DELAY_I(30); if (RB3=
17、0 & KEY.FLAG=1 ) KEY.SETINT=1; T0N=0; if (RB2=0 & KEY.FLAG=1) KEY.DEC=1; T0N=0; if (RB1=0 & KEY.FLAG=1) KEY.INC=1; T0N=0; RBIF=0; if(T0IF=1) T0IF=0; TMR0=0; T0N+; if (T0N100) /约6S KEY.FLAG=0; KEY.SET=0; T0IE=0; /设置周期为1000US的PWM输出 void PWM_CSH(unsigned int ht) PR2=249; DUTY_SET(ht); /X=0b0011001000;
18、T2CON=0b00000101; /预分频比为1:4 /设置PWM波的高电平时间void DUTY_SET(unsigned int ht) CCPR2L=(ht2) & 0x0FF; CCP2CON=(ht4) & 0x0F; /先写入高4位 LCD_WRITE_4(R2,FLAG); R2=R1 & 0x0F; /后写入低4位 LCD_WRITE_4(R2,FLAG); DELAY_US(10); /延时100us void LCD_BUSY(void) unsigned char R1; while(1) R1=LCD_READ(); /读寄存器 if(R1&0x80)=0x00) /
19、最高位为忙标志位 break; char LCD_READ(void) unsigned char R1; TRISD |=0xF0; /D口低4位为输入 LCD_RS=0;NOP(); /选择命令 LCD_RW=1; /写命令模式 NOP();NOP(); LCD_E=1; /LCD使能 NOP();NOP(); R1=0; R1=PORTD & 0x0F; R1=(R14) & 0xF0; /读数据的高4位给R1高4位 LCD_E=0;NOP(); /使能端形成下降沿 LCD_E=1;NOP(); R1 |=PORTD & 0x0F; /读数据的低4位给R1低4位 LCD_E=0;NOP(
20、); LCD_RW=0; TRISD &=0x0F; /D口低4位恢复为向LCD输出 return R1;void DISP_C(char line) char i; LCD_BUSY(); LCD_WRITE(line,COM); for(i=0;i16;i+) LCD_WRITE(DDi,DAT);void DISP_MENU(const char *A) char i,j; for(i=0;i2;i+) for(j=0;j16;j+) DDj=*A+; A+; DISP_C(LINEi); /从R1双字节数转换为十进制数万位-个位:WW,QW,BW,SW,GWvoid BCD(unsigned int R1) /延时n msvoid DELAY(unsigned int n)void DELAY_I(unsigned int n)/延时(n*10)usvoid DELAY_US(char n)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1