PWM直流电机调速单片机程序文件.docx

上传人:b****2 文档编号:1759591 上传时间:2023-05-01 格式:DOCX 页数:19 大小:18.38KB
下载 相关 举报
PWM直流电机调速单片机程序文件.docx_第1页
第1页 / 共19页
PWM直流电机调速单片机程序文件.docx_第2页
第2页 / 共19页
PWM直流电机调速单片机程序文件.docx_第3页
第3页 / 共19页
PWM直流电机调速单片机程序文件.docx_第4页
第4页 / 共19页
PWM直流电机调速单片机程序文件.docx_第5页
第5页 / 共19页
PWM直流电机调速单片机程序文件.docx_第6页
第6页 / 共19页
PWM直流电机调速单片机程序文件.docx_第7页
第7页 / 共19页
PWM直流电机调速单片机程序文件.docx_第8页
第8页 / 共19页
PWM直流电机调速单片机程序文件.docx_第9页
第9页 / 共19页
PWM直流电机调速单片机程序文件.docx_第10页
第10页 / 共19页
PWM直流电机调速单片机程序文件.docx_第11页
第11页 / 共19页
PWM直流电机调速单片机程序文件.docx_第12页
第12页 / 共19页
PWM直流电机调速单片机程序文件.docx_第13页
第13页 / 共19页
PWM直流电机调速单片机程序文件.docx_第14页
第14页 / 共19页
PWM直流电机调速单片机程序文件.docx_第15页
第15页 / 共19页
PWM直流电机调速单片机程序文件.docx_第16页
第16页 / 共19页
PWM直流电机调速单片机程序文件.docx_第17页
第17页 / 共19页
PWM直流电机调速单片机程序文件.docx_第18页
第18页 / 共19页
PWM直流电机调速单片机程序文件.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

PWM直流电机调速单片机程序文件.docx

《PWM直流电机调速单片机程序文件.docx》由会员分享,可在线阅读,更多相关《PWM直流电机调速单片机程序文件.docx(19页珍藏版)》请在冰点文库上搜索。

PWM直流电机调速单片机程序文件.docx

PWM直流电机调速单片机程序文件

*******************************************************************/

/*程序名:

PWM直流电机调速*/

/*晶振:

11.00592MHzCPU型号:

AT89C51*/

/*直流电机的PWM波控制,可以直接的调速从0到20级的调速*/

/*****************************************************************/

#include

#defineTH0_TL0(65536-1000)//设定中断的间隔时长

unsignedcharcount0=50;//低电平的占空比

unsignedcharcount1=0;//高电平的占空比

bitFlag=1;//电机正反转标志位,1正转,0反转

sbitKey_add=P2^0;//电机减速

sbitKey_dec=P2^1;//电机加速

sbitKey_turn=P2^2;//电机换向

sbitPWM1=P2^6;//PWM通道1,反转脉冲

sbitPWM2=P2^7;//PWM通道2,正转脉冲

unsignedcharTime_delay;

/************函数声明**************/

voidDelay(unsignedcharx);

voidMotor_speed_high(void);

voidMotor_speed_low(void);

voidMotor_turn(void);

voidTimer0_init(void);

/****************延时处理**********************/

voidDelay(unsignedcharx)

{

Time_delay=x;

while(Time_delay!

=0);//等待中断,可减少PWM输出时间间隔

}

/*******按键处理加pwm占空比,电机加速**********/

voidMotor_speed_high(void)//

{

if(Key_add==0)

{

  Delay(10);

  if(Key_add==0)

  {

   count0+=5;

   

   if(count0>=100)

   {

    count0=100;

   }

  }

  while(!

Key_add);//等待键松开

}

}

/******按键处理减pwm占空比,电机减速*****/

voidMotor_speed_low(void)

{

if(Key_dec==0)

{

  Delay(10);

  if(Key_dec==0)

  {

   count0-=5;

   

   if(count0<=0)

   {

    count0=0;

   }

  }

  while(!

Key_dec);

}

}

/************电机正反向控制**************/

voidMotor_turn(void)

{

if(Key_turn==0)

{

  Delay(10);

  if(Key_turn==0)

  {

   Flag=~Flag;

  }

  while(!

Key_turn);

}

}

/***********定时器0初始化***********/

voidTimer0_init(void)

{

TMOD=0x01;//定时器0工作于方式1

TH0=TH0_TL0/256;

TL0=TH0_TL0%256;

TR0=1;

ET0=1;

EA=1;

}

/*********主函数********************/

voidmain(void)

{

Timer0_init();

while

(1)

{

  Motor_turn();

  Motor_speed_high();

  Motor_speed_low();

}

}

/**************定时0中断处理******************/

voidTimer0_int(void)interrupt1using1

{

TR0=0;//设置定时器初值期间,关闭定时器

TL0=TH0_TL0%256;

TH0=TH0_TL0/256;//定时器装初值

TR0=1;

if(Time_delay!

=0)//延时函数用

{

  Time_delay--;

}

if(Flag==1)//电机正转

{

  PWM1=0;

  

  if(++count1

  {

   PWM2=1;

  }

   else

    PWM2=0;

   if(count1>=100)

   {

    count1=0;

   }

}

  else//电机反转

  {

   PWM2=0;

   

   if(++count1

   {

    PWM1=1;

   }

    else

    PWM1=0;

    

    if(count1>=100)

    {

     count1=0;

    }

  }

}

//-----------------------------------------------------------------------------

#include//SFRdeclarations

#include

//FunctionPrototypes

//-----------------------------------------------------------------------------

#defineCMD_RESET0xA4//HD7279复位

#defineDECODE10xc8//方式0译码

sbitcs=P1^3;

sbitclk=P1^2;

sbitdat=P1^1;

sbitkey=P1^0;

sbitled_D1003=P0^7;

sbitsw1=P1^7;

sbitsw2=P1^6;

sbitsw3=P1^5;

sbitsw4=P1^4;

voidlong_delay(void);//延时函数

voidshort_delay(void);

voiddelay10ms(unsignedchar);

voidwrite7279(unsignedchar,unsignedchar);//HD7279写指令

voidsend_byte(unsignedchar);

voiddelay(unsignedchar);

voiddisp1(unsignedint);

voidOSCILLATOR_Init(void);

voidPORT_Init(void);

voidPCA0_Init(void);

voidTimer0_Init(void);

voidExt_Interrupt_Init(void);

//-----------------------------------------------------------------------------

//GlobalVariables

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

//main()Routine

//-----------------------------------------------------------------------------

unsignedintCEX0_Compare_Value;//HoldscurrentPCAcomparevalue

unsignedinttmr,Speed_evaluate;

unsignedcharnum,num1,num2,num3,a;

unsignedintSpeed,pi,Speed2;

unsignedintSpeed1[10];

typedefstruct{

doubleSetPoint;/*设定目标DesiredValue*/

doubleProportion;/*比例常数ProportionalConst*/

doubleIntegral;/*积分常数IntegralConst*/

doubleDerivative;/*微分常数DerivativeConst*/

doubleLastError;/*前一项误差*/

doublePrevError;/*前第二项误差*/

doubleSumError;/*误差和*/

}PID;

doublePIDCalc(PID*pp,doubleNextPoint)

{

doubledError,Error,Pout;

Error=pp->SetPoint-NextPoint;/*?

?

?

?

?

?

*/

pp->SumError+=Error;/*?

?

?

?

?

?

/

dError=pp->LastError-pp->PrevError;/*?

?

?

?

*/

pp->PrevError=pp->LastError;

pp->LastError=Error;/*?

?

?

?

?

?

?

*/

Pout=pp->Proportion*Error+pp->Integral*pp->SumError+pp->Derivative*dError;

if(Pout>1100)

Pout=1000;

if(Pout<100)

Pout=100;

return(Pout);

}

PIDsPID;//定义PID结构体变量

doublerOut;//PID响应输出

unsignedcharrIn;//设置PID反馈值

doublex;

doublesumout;

unsignedchardd;

//设置PID输出

voidmain(void)

{

sPID.Proportion=0.44;//设置P

sPID.Integral=0.70;//设置I

sPID.Derivative=0.0;//设置D

//sPID.SetPoint=CEX0_Compare_Value;

//sPID.SetPoint=CEX0_Compare_Value;//设置PID输出

PCA0MD=0x00;//Disablewatchdogtimer

led_D1003=0;

PORT_Init();//InitializecrossbarandGPIO

OSCILLATOR_Init();//Initializeoscillator

PCA0_Init();//InitializePCA0

IP=0x82;//定时器中断0高于外部中断0

Timer0_Init();

Ext_Interrupt_Init();

for(tmr=0;tmr<0x2000;tmr++);

send_byte(CMD_RESET);//HD7279复位//Globallyenableinterrupts

EA=1;

sPID.SetPoint=70;

while

(1)

{

delay10ms(100);

//键盘程序-------------------------------------------------------------

if(sw1==0)//按键1是否按下

{

if(sw1==0)//再次检查按键

{

num++;//若按键按下,num加1

if(num==1)//到9归0

{

num=0;

}

while(sw1==0);//按键释放

}

//delay10ms(100);

}

write7279(DECODE1+4,num);//将num写入HD7279第1位

delay10ms

(1);

 

if(sw2==0)

{

if(sw2==0)

{

num1++;

if(num1==2)

{

num1=0;

}

while(!

sw2);

}

//delay10ms(100);

}

write7279(DECODE1+5,num1);//将num1写入HD7279第2位

delay10ms

(1);

if(sw3==0)

{

if(sw3==0)

{

num2++;

if(num2==10)

{

num2=0;

}

while(!

sw3);

}

//delay10ms(100);

}

write7279(DECODE1+6,num2);//将num1写入HD7279第2位

delay10ms

(1);

if(sw4==0)

{

if(sw4==0)

{

num3++;

if(num3==10)

{

num3=0;

}

while(!

sw4);

}

//delay10ms(100);

}

write7279(DECODE1+7,num3);//将num1写入HD7279第2位

delay10ms

(1);

Speed_evaluate=num*1000+num1*100+num2*10+num3;

sPID.SetPoint=Speed_evaluate;

//控制程序-----------------------------------------------------------------

//---------------------------------------------------------------------------

}

}

 

voidOSCILLATOR_Init(void)

{

OSCICN=0x83;//Setinternaloscillatortorun

//atitsmaximumfrequency

CLKSEL=0x00;

}

voidPORT_Init(void)

{

XBR0=0x00;

XBR1=0x41;

//Enablecrossbarandweakpull-ups

P0MDOUT|=0x10;//SetCEX0(P0.4)topush-pull

P0SKIP|=0x0F;//

P1SKIP=0x00;

P1MDOUT=0x0f;

}

voidPCA0_Init(void)

{

PCA0CN=0x00;//Stopcounter;clearallflags

PCA0MD=0x01;//UseEtternimebase

PCA0CPM0=0xCB;//Module0=16-bitPWMmodeand

//enableModule0MatchandInterrupt

//Flags

//ConfigureinitialPWMdutycycle=50%

CEX0_Compare_Value=65536-(65536*0.15);

PCA0CPL0=(CEX0_Compare_Value&0x00FF);

PCA0CPH0=(CEX0_Compare_Value&0xFF00)>>8;

EIE1|=0x10;//EnablePCAinterrupts

//StartPCAcounter

CR=1;

}

voidExt_Interrupt_Init(void)

{

TCON|=0x05;///INT0and/INT1areedgetriggered

IT01CF=0x10;///INT0activelow;/INT0onP0.0;

///INT1activelow;/INT1onP0.1

EX0=1;//Enable/INT0interrupts

}

voidTimer0_Init(void)

{

TH0=0;//InitTimer0Highregister

TL0=0;//InitTimer0Lowregister

TMOD|=0x01;//Timer0in16-bitmode方式1

CKCON|=0x02;//Timer0usesa1:

48prescaler

ET0=1;//Timer0interruptenabled

TCON|=0x10;//Timer0ON

}

//PCA0_ISR

//-----------------------------------------------------------------------------

voidPCA0_ISR(void)interrupt11

{

CCF0=0;//Clearmodule0interruptflag.

PCA0CPL0=(CEX0_Compare_Value&0x00FF);

PCA0CPH0=(CEX0_Compare_Value&0xFF00)>>8;

}

voidTimer0_ISR(void)interrupt1

{

intj,sum;

TF0=0;

//Clearinterruptflag.

a++;

if(a==4)

{

Speed1[pi]=Speed;

if(pi>=3)

{EX0=0;

for(j=0;j<=3;j++)

{

sum=sum+Speed1[j];

}

Speed2=sum/4;

disp1(Speed2);

Speed=0;

pi=0;

EX0=1;

}

a=0;

sum=0;

if(pi>=3)

pi=0;

else

pi++;

TH0=0;//ReinitTimer0Highregister

TL0=0;//ReinitTimer0Lowregister

 

if(abs(sPID.SetPoint-Speed2)<=5)

{

CEX0_Compare_Value=CEX0_Compare_Value;

}

else

{

rIn=Speed2;

for(dd=0;dd<50;dd++)

x=rIn;

//x=5.0*(double)rIn/256.0;

rOut=PIDCalc(&sPID,x);

//sumout=rOut*256/5;

if(rOut==100)

sumout=0;

else

sumout=(0.85/1000.0)*rOut;

//CEX0_Compare_Value=CEX0_Compare_Value-sumout;

CEX0_Compare_Value=65536-(65536*(sumout+0.15));

}

}

else

{

TH0=0;//ReinitTimer0Highregister

TL0=0;//ReinitTimer0Lowregister

}

}

voidINT0_ISR(void)interrupt0

{

IE0=0;////Clearinterruptflag.

Speed++;

}

voidwrite7279(unsignedcharcmd,unsignedchardta)

{

send_byte(cmd);

send_byte(dta);

}

voidsend_byte(unsignedcharout_byte)

{

unsignedchari;

cs=0;

long_delay();

for(i=0;i<8;i++)

{

if(out_byte&0x80)

{

dat=1;

}

else

{

dat=0;

}

clk=1;

short_delay();

clk=0;

short_delay();

out_byte=out_byte*2;

}

dat=0;

}

voidlong_delay(void)

{

unsignedchari;

for(i=0;i<0x30;i++);

}

voidshort_delay(void)

{

unsignedchari;

for(i=0;i<8;i++);

}

voiddelay10ms(unsignedchartime)

{

unsignedchari;

unsignedintj;

for(i=0;i

{

for(j=0;j<0x390;j++);

}

}

voiddis

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2