éè¿ä¸åçæºç¸è¿çæé®æ§å¶ç´æµçµæºåå¯ççµè·¯å¦ä¸å¾æ示ï¼éè¿P3.6å£æé®è§¦åå¯å¨ç´æµçµæºï¼P3.7å£çæé®è§¦ååæ¢ç´æµçµæºçè¿è¡ãç±å¾å¯ç¥ï¼å½P1.0è¾åºé«çµå¹³â1âæ¶ï¼NPNåä¸æ管导éï¼ç´æµçµæºå¾çµè½¬å¨;å½P1.0è¾åºä½çµå¹³â0âæ¶ï¼NPNåä¸æ管æªæ¢ï¼ç´æµçµæºåæ¢è½¬å¨ã
éè¿åçæºäº§çPWMæ³¢æ§å¶ç´æµçµæºç¨åº
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[10]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //å ±é´æ°ç 管æ¾ç¤ºç (0-9)
sbit xiaoshudian=P0^7;
sbit wei1=P2^4; //æ°ç 管ä½éå®ä¹
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
sbit beep=P2^3; //è鸣å¨æ§å¶ç«¯
sbit motor = P1^0; //çµæºæ§å¶
sbit s1_jiasu = P1^4; //å éæé®
sbit s2_jiansu= P1^5; //åéæé®
sbit s3_jiting=P1^6; //åæ¢/å¼å§æé®
uint pulse_count; //INT0æ¥æ¶å°çèå²æ°
uint num=0; //numç¸å½äºå 空æ¯è°èç精度
uchar speed[3]; //åä½é度å¼åå¨
float bianhuasudu; //å½åé度ï¼ç论计ç®å¼ï¼
float reallyspeed; //å®é æµå¾çé度
float vv_min=0.0;vv_max=250.0;
float vi_Ref=60.0; //ç»å®å¼
float vi_PreError,vi_PreDerror;
uint pwm=100; //ç¸å½äºå 空æ¯æ å¿åé
int sample_time=0; //éæ ·æ å¿
float v_kp=1.2,v_ki=0.6,v_kd=0.2; //æ¯ä¾ï¼ç§¯åï¼å¾®å常æ°
void delay (uint z)
{
uint x,y;
for(x=z;x>0;x--)
for (y=20;y>0;y--);
}
void time_init()
{
ET1=1; //å 许å®æ¶å¨T1ä¸æ
ET0=1; //å 许å®æ¶å¨T0ä¸æ
TMOD = 0x15; //å®æ¶å¨0计æ°ï¼æ¨¡å¼1ï¼å®æ¶å¨1å®æ¶ï¼æ¨¡å¼1
TH1 = (65536-100)/256; //å®æ¶å¨1å¼,è´è´£PIDä¸æ ,0.1mså®æ¶
TL1 = (65536-100)%6;
TR0 = 1; //å¼å®æ¶å¨
TR1 = 1;
IP=0X08; //å®æ¶å¨1为é«ä¼çº§
EA=1; //å¼æ»ä¸æ
}
void keyscan()
{
float j;
if(s1_jiasu==0) //å é
{
delay(20);
if(s1_jiasu==0)
vi_Ref+=10;
j=vi_Ref;
}
while(s1_jiasu==0);
if(s2_jiansu==0) //åé
{
delay(20);
if(s2_jiansu==0)
vi_Ref-=10;
j=vi_Ref;
}
while(s2_jiansu==0);
if(s3_jiting==0)
{
delay(20);
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
while(s3_jiting==0);
}
float v_PIDCalc(float vi_Ref,float vi_SpeedBack)
{
register float error1,d_error,dd_error;
error1=vi_Ref-vi_SpeedBack; //åå·®ç计ç®
d_error=error1-vi_PreError; //误差çåå·®
dd_error=d_error-vi_PreDerror; //误差ååç
vi_PreError=error1; //åå¨å½ååå·®
vi_PreDerror=d_error;
bianhuasudu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);
return (bianhuasudu);
}
void v_Display()
{
uint sudu;
sudu=(int)(reallyspeed*10); //ä¹ä»¥10ä¹å强å¶è½¬åææ´å
speed[3]=sudu/1000; //ç¾ä½
speed[2]=(sudu00)/100; //åä½
speed[1]=(sudu0)/10; //个ä½
speed[0]=sudu; //å°æ°ç¹åä¸ä½
wei1=0; //第ä¸ä½æå¼
P0=table[speed[3]];
delay(5);
wei1=1; //第ä¸ä½å ³é
wei2=0;
P0=table[speed[2]];
delay(5);
wei2=1;
wei3=0;
P0=table[speed[1]];
xiaoshudian=1;
delay(5);
wei3=1;
wei4=0;
P0=table[speed[0]];
delay(5);
wei4=1;
}
void BEEP()
{
if((reallyspeed)>=vi_Ref+5||(reallyspeed
{
beep=~beep;
delay(4);
}
}
void main()
{
time_init();
motor=0;
while(1)
{
v_Display();
BEEP();
}
if(s3_jiting==0) //对æé®3è¿è¡æ«æï¼å¢å¼ºæ¥åææ
{
delay(20);
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
while(s3_jiting==0);
}
void timer0() interrupt 1
{
}
void timer1() interrupt 3
{
TH1 = (65536-100)/256; //1mså®æ¶
TL1 = (65536-100)%6;
sample_time++;
if(sample_time==5000) //éæ ·æ¶é´0.1ms*5000=0.5s
{
TR0=0; //å ³éå®æ¶å¨0
sample_time=0;
pulse_count=TH0*255+TL0; //ä¿åå½åèå²æ°
keyscan(); //æ«ææé®
reallyspeed=pulse_count/(4*0.6); //计ç®é度
pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);
if(pwm
if(pwm>100)pwm=100;
TH0=TL0=0;
TR0=1; //å¼å¯å®æ¶å¨0
}
num++;
if(num==pwm) //æ¤å¤çnumå¼ï¼å°±æ¯å 空æ¯
{
motor=0;
}
if(num==100) //100ç¸å½äºå 空æ¯è°èç精度
{
num=0;
motor=1;
}
}