舵機速度控制的51單片機程序
/************************************************************************************************/
void qhuan(unsigned int ms50,char zushu) //控速算法
{
char i;
if(thesea>=ms50&a>100) //檢驗定時和舵機是否到達指定時間和位置,到達更新
{
n++;
if(n
else
PWMM=shuju[0];
for(i=0;i<8;i++)
{
if(n<(zushu))
*(K+i)=(shuju[n][i]-shuju[n-1][i])/100;
else
*(K+i)=(shuju[0][i]-shuju[zushu-1][i])/100;
}
if(n>=zushu)
n=0;
thesea=0;
a=0;
}
}
void T0zd(void) interrupt 1
{
static uint8 i=0,irm=0;
++i;
++irm;
qhuan(640,4);
if((a<=100)&(irm>=64))
{
a+=10; //自加在40就已經(jīng)是舵機不控速的最快速度了
irm=0;
}
thesea++;
switch(i)
{
case 1:
{
pwm1=1;
Timer0(*(PWMM)-*(K)*(100-a)); //定時
} return;
case 2:
{
pwm1=0; //pwm1變低
Timer0(2500-*(PWMM)+*(K)*(100-a));// 定時
} return;
case 3:
{
pwm2=1; //pwm2變高
Timer0(*(PWMM+1)-*(K+1)*(100-a));// 定時時常為pwm[2]
} return;
case 4:
{
pwm2=0; //pwm2變低
Timer0(2500-*(PWMM+1)+*(K+1)*(100-a));// 定時時常為pwm[2]
} return;
case 5:
{
pwm3=1; //pwm3變高
Timer0(*(PWMM+2)-*(K+2)*(100-a));// 定時時常為pwm[3]
} return;
case 6:
{
pwm3=0; //pwm3變低
Timer0(2500-*(PWMM+2)+*(K+2)*(100-a));// 定時
} return;
case 7:
{
pwm4=1; //pwm4變高
Timer0(*(PWMM+3)-*(K+3)*(100-a));// 定時
} return;
case 8:
{
pwm4=0; //pwm4變低
Timer0(2500-*(PWMM+3)+*(K+3)*(100-a));// 定時
} return;
case 9:
{
pwm5=1; //pwm5變高
Timer0(*(PWMM+4)-*(K+4)*(100-a));// 定時
} return;
case 10:
{
pwm5=0; //pwm5變低
Timer0(2500-*(PWMM+4)+*(K+4)*(100-a));// 定時
} return;
case 11:
{
pwm6=1; //pwm6變高
Timer0(*(PWMM+5)-*(K+5)*(100-a));// 定時
} return;
case 12:
{
pwm6=0; //pwm6變低
Timer0(2500-*(PWMM+5)+*(K+5)*(100-a));// 定時
} return;本文引用地址:http://m.butianyuan.cn/article/201612/324212.htm
case 13:
{
pwm7=1; //pwm7變高
Timer0(*(PWMM+6)-*(K+6)*(100-a));// 定時
} return;
case 14:
{
pwm7=0; //pwm7變低
Timer0(2500-*(PWMM+6)+*(K+6)*(100-a));// 定時
} return;
case 15:
{
pwm8=1; //pwm8變高
Timer0(*(PWMM+7)-*(K+7)*(100-a));// 定時
} return;
case 16:
{
pwm8=0; //pwm8變低
Timer0(2500-*(PWMM+7)+*(K+7)*(100-a));// 定時
i=0;
} return;
default:return;
}
}
評論