|
最近在做机器人,用的是mega16芯片,但是舵机总是不停的抖动,按理说,每个舵机信号给定以后,应该停在该位置不动的啊,
下面是源程序:
# include<avr/io.h>
# include<avr/interrupt.h>
# include<avr/signal.h>
//时钟频率为10MHz
#define m1_1 PORTA=PORTA | 0X01 //舵机1置高电平
#define m1_0 PORTA=PORTA & 0XFE //舵机1置低电平
#define m2_1 PORTA=PORTA | 0X02 //舵机2置高电平
#define m2_0 PORTA=PORTA & 0XFD //舵机2置低电平
#define m3_1 PORTA=PORTA | 0X04 //舵机3置高电平
#define m3_0 PORTA=PORTA & 0XFB //舵机3置低电平
#define m4_1 PORTA=PORTA | 0X08 //舵机4置高电平
#define m4_0 PORTA=PORTA & 0XF7 //舵机4置低电平
#define m5_1 PORTA=PORTA | 0X10 //舵机5置高电平
#define m5_0 PORTA=PORTA & 0XEF //舵机5置低电平
#define m6_1 PORTA=PORTA | 0X20 //舵机6置高电平
#define m6_0 PORTA=PORTA & 0XDF //舵机6置低电平
#define m7_1 PORTA=PORTA | 0X40 //舵机7置高电平
#define m7_0 PORTA=PORTA & 0XBF //舵机7置低电平
#define m8_1 PORTA=PORTA | 0X80 //舵机8置高电平
#define m8_0 PORTA=PORTA & 0X7F //舵机8置低电平
#define m9_1 PORTB=PORTB | 0X01 //舵机9置高电平
#define m9_0 PORTB=PORTB & 0XFE //舵机9置低电平
#define m10_1 PORTB=PORTB | 0X02//舵机10置高电平
#define m10_0 PORTB=PORTB & 0XFD//舵机10置低电平
float N=50.0;//过程完成分步数
unsigned int N1=500; //状态间延时长度
unsigned char N2=20; //每一微分间隔延时长度
static int orderA=0;
static int orderB=0;
int t[20];//t[0],t[1]控制一号舵机;t[2],t[3]控制二号舵机;如此类推··
float angle[2][10]={{94,101,84,50,89,91,108,91,96,84}, //站立状态OK
{94,136,24,27,89,91,77,155,122,84}}; //蹲的状态OK
unsigned int i,j;
SIGNAL(SIG_OVERFLOW0)//中断函数只有计数和重置计数初值
{
switch(orderA){
case 1: TCNT0=t[0];m1_1;break;
case 2: TCNT0=t[1];m1_0;break;
case 3: TCNT0=t[2];m2_1;break;
case 4: TCNT0=t[3];m2_0;break;
case 5: TCNT0=t[4];m3_1;break;
case 6: TCNT0=t[5];m3_0;break;
case 7: TCNT0=t[6];m4_1;break;
case 8: TCNT0=t[7];m4_0;break;
case 9: TCNT0=t[8];m5_1;break;
case 10: TCNT0=t[9];m5_0;break;
case 11: TCNT0=t[10];m6_1;break;
case 12: TCNT0=t[11];m6_0;break;
case 13: TCNT0=t[12];m7_1;break;
case 14: TCNT0=t[13];m7_0;break;
case 15: TCNT0=t[14];m8_1;break;
case 16: TCNT0=t[15];m8_0;orderA=0;break;
default: orderA=0;break;
}
orderA++;
}
SIGNAL(SIG_OVERFLOW2)//中断函数只有计数和重置计数初值
{
switch(orderB){
case 1: TCNT2=t[16];m9_1;break;
case 2: TCNT2=t[17];m9_0;break;
case 3: TCNT2=t[18];m10_1;break;
case 4: TCNT2=t[19];m10_0;break;
case 16: TCNT2=-49;orderB=0;break;
default: TCNT2=-49;break;
}
orderB++;
}
void delay_ms(int s)
{
for(i=0;i<s;i++)
for(j=0;j<1000;j++)
{}
}
void SetDegree(unsigned int number,float angle)
{
unsigned int j;
for(j=0;j<20;j++)
{
if(j==number) t[j]=-(int)(19+angle*2.0/(185*0.0256)+0.5);//四舍五入
}
t[number+1]=-98-t[number];
}
void status(unsigned int x)
{
unsigned int i;
for(i=0;i<5;i++)
{
SetDegree(2*i,angle[x]);
SetDegree((10+2*i),angle[x][i+5]);
}
}
int main(void)
{
PORTB=0XFF;
DDRA=0XFF;
DDRB=0XFF;
TCCR0=0X04;
TCCR2=0X06;//256分频,0.0256ms
TCNT0=-19;
TCNT2=-19;
TIMSK=0X41;
sei();
status(0);
}
有同学用一样的舵机,但是不抖,是不是产生的信号不稳啊,求高手指教,先行谢过了。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|