当前位置:首页 > 直流电机调速测速系统开发 - 图文
2011届本科生毕业设计(论文)
INTCONbits.GIE=1;//CPU全局中断使能允许
INTCONbits.PEIE=1;//CPU第二梯队中断使能允许 }
void PIC_CCPForPWM_Initize(void) {
TRISCbits.TRISC1=0;//RC1置输出方向 TRISCbits.TRISC2=0;//RC2置输出方向 TRISCbits.TRISC3=0;//RC2置输出方向 TRISCbits.TRISC4=0;//RC2置输出方向 LATCbits.LATC1=0;//RC1引脚输出为0 LATCbits.LATC2=0;//RC2引脚输出为0 LATCbits.LATC3=0;//RC3引脚输出为0 LATCbits.LATC4=0;//RC3引脚输出为0 CCP1CON=0x0F;//CCP1设置为PWM模式 CCP2CON=0x0F;//CCP2设置为PWM模式 T2CON=0x03;//TMR2的预分频为1:16 T2CONbits.TMR2ON=1;//TMR2开始工作
PR2=249;//PWM周期为2000Hz,FOSC=32MHz CCPR1L=0;//PWM1的占空比为0
CCPR2L=0;//PWM2的占空比为0 }
unsigned char CycleFlag; unsigned char FreqFlag;
#define RUNSTOPKEY PORTBbits.RB3 #define PWMKEY PORTBbits.RB4 #define DIRKEY PORTBbits.RB5
unsigned char MotorRunStatus; unsigned char MotorDirection; unsigned char MotorPWMData; unsigned char RunStopKeyFlag; unsigned int RunStopKeyCounter; unsigned char DirKeyFlag; unsigned int DirKeyCounter; unsigned char PWMKeyFlag; unsigned int PWMKeyCounter;
void SystemVariant_Initize(void) {
MotorPWMData=10;
38
2011届本科生毕业设计(论文)
}
void Motor_Control(unsigned char Direction, unsigned char Speed) {
switch(Direction) {
case 0:
CCPR1L=0; CCPR2L=0; CCPR1L=Speed; break; case 1:
CCPR2L=0; CCPR1L=0; CCPR2L=Speed; break; } }
//------------------------------------------------------------------- void PIC18F_High_isr(void);//高优先级中断函数声明 #pragma code high_vector_section=0x8 void high_vector (void) {
_asm goto PIC18F_High_isr _endasm }
void SystemInterruptISR(void);//低优先级中断函数声明 #pragma code low_vector=0x18//低中断优先级 void low_interrupt(void) {
_asm goto SystemInterruptISR _endasm }
#pragma code
//-------------------------------------------------------------------
void main(void) {
unsigned long temp; unsigned char i;
OSCillator_Initize();//CPU系统时钟初始化内部时钟源8MHz,经过4xPLL PIC_PortDir_Initize();//PIC单片机的使用到的I/O口方向初始化
39
2011届本科生毕业设计(论文)
PIC_TMR0_Initize();//PIC单片机的TMR0定时器初始化为内部定时方式 PIC_TMR1_Initize();//PIC单片机的TMR1定时器初始化为外部计数方式 PIC_TMR3_Initize();
PIC_CCPForPWM_Initize(); PIC_Interrupt_Initize(); initize_lcd();
while(1) {
if(0==RUNSTOPKEY)//判断启动按键是否按下 { if(0==RunStopKeyFlag)//检测启动按键是否成功按下标志 { RunStopKeyCounter++;//软件计数器,用于按键去抖动 if(2000==RunStopKeyCounter)//按键去抖动延时到 { RunStopKeyCounter=0;//清软计数器为0 if(0==RUNSTOPKEY)//再判断启动按键是否真得按下 { RunStopKeyFlag=1;//置启动按键成功按下标志为1 if(0==MotorRunStatus)//如果电机是处理停止状态 {//则启动电机运转 MotorRunStatus=1;//同时置电机状态为1 LATCbits.LATC3=0;// LATCbits.LATC4=0;// LCDBuffer_0[0]='R';//LCD显示屏上显示\ LCDBuffer_0[1]='U'; LCDBuffer_0[2]='N'; LCDBuffer_0[3]=' '; LCDBuffer_0[4]=' '; temp=MotorPWMData;//读取设置电机速度的变量 temp<<=1;//转换成占空比送到LCD上显示 temp/=5; LCDBuffer_0[5]=(temp/10)+0x30; LCDBuffer_0[6]=(temp)+0x30; LCDBuffer_0[7]='%'; LCDBuffer_0[8]=' '; LCDBuffer_0[9]='D'; LCDBuffer_0[10]='I'; LCDBuffer_0[11]='R'; LCDBuffer_0[12]=' '; if(0==MotorDirection)//根据电机运转的方向 {//来设置电机是正转还是反转,并在LCD上显示 LATCbits.LATC3=1;//
40
2011届本科生毕业设计(论文)
LATCbits.LATC4=0;// CCPR1L=MotorPWMData;//使RC1引脚输出PWM信号 LCDBuffer_0[13]='+';//表示电机正转 } else { LATCbits.LATC3=0;// LATCbits.LATC4=1;// CCPR1L=MotorPWMData;//使RC2引脚输出PWM信号 LCDBuffer_0[13]='-';//表示电机反转 } } else//如果电机是在运转中,则这时按下该键可以停止电机运转 { MotorRunStatus=0;//置电机运动状态为0 LATCbits.LATC3=0;// LATCbits.LATC4=0;// LCDBuffer_0[0]='S';//LCD屏上显示\ LCDBuffer_0[1]='T'; LCDBuffer_0[2]='O'; LCDBuffer_0[3]='P'; LCDBuffer_0[4]=' '; LCDBuffer_0[5]='0'; LCDBuffer_0[6]='0'; CCPR1L=0;//RC1和RC2引脚不输出PWM信号 } // write_lcd_command(0x01); lcd_displaystr(0,0,LCDBuffer_0);//将字符串送到LCD上显示 lcd_displaystr(1,0,LCDBuffer_1); } } } } else { if(1==RUNSTOPKEY)//等待按键释放处理过程 { if(1==RunStopKeyFlag) { RunStopKeyFlag=0;//清启动按键上次成功按下标志
41
共分享92篇相关文档