金牌会员
- 积分
- 2686
- 威望
- 1771
- 贡献
- 53
- 兑换币
- 1177
- 注册时间
- 2013-5-28
- 在线时间
- 431 小时
|
刚刚开始搞程序,写了个最简单,但下进去后,舵机始终打到中值,不打角,各位大神帮忙看看啊!用的是k60写的
#include "include.h"
#define midle 111 //舵机中值
u16 AD_data0[10];
u16 AD_data1[10];
u16 AD_average[2];
u16 AD_temp;
u8 biaodingflag=0;
u16 zuida0;
u16 zuida1;
float sensor_to_one[2]; //传感器转换结果归一化
s16 sensor_to_another[2];
s16 max_AD[2]={0,0}; //最大采样值数组
s16 min_AD[2]={0,0}; //存放最小值
void Systeminit()
{
gpio_init (PORTA,4, GPI,HIGH);
adc_init(ADC1,SE4a);//E0
adc_init(ADC1,SE5a);//E1
max_AD[0]=ad_ave(ADC1, SE4a, ADC_16bit,10);
max_AD[1]=ad_ave(ADC1, SE5a, ADC_16bit,10);
while(!biaodingflag) 标定最大值用于归化处理
{
while(!PTA4_IN)
{
zuida0=ad_ave(ADC1, SE4a, ADC_16bit,10);
if(zuida0>max_AD[0])
max_AD[0]=zuida0;
zuida1=ad_ave(ADC1, SE5a, ADC_16bit,10);
if(zuida1>max_AD[1])
max_AD[1]=zuida1;
biaodingflag=1;
}
}
FTM_PWM_init(FTM0, CH0, 10000, 500);//电机pwm C1 50%不转
FTM_PWM_init(FTM1, CH0, 50, 111);//舵机pwm A8 111为中值
}
void Motor_forward(u32 duty)
{
FTM_PWM_Duty(FTM0, CH0,duty);
}
void Get_AD_data()
{
u8 i=0;
for(i=0;i<10;i++)
{
AD_data0[i]=ad_ave(ADC1, SE4a, ADC_16bit,6);//E0
AD_data1[i]=ad_ave(ADC1, SE5a, ADC_16bit,6);//E1
}
AD_average[0]=(AD_data0[1]+AD_data0[2]+AD_data0[3]+AD_data0[4]+AD_data0[5]+AD_data0[6]+AD_data0[7]+AD_data0[8])/8;
AD_average[1]=(AD_data1[1]+AD_data1[2]+AD_data1[3]+AD_data1[4]+AD_data1[5]+AD_data1[6]+AD_data1[7]+AD_data1[8])/8;
for(i=0;i<2;i++)
{
sensor_to_one[i]=100*(AD_average[i]-min_AD[i])/(max_AD[i]-min_AD[i]);
sensor_to_another[i]=(int)(sensor_to_one[i]) ;
}
}
void duojikongzhi()
{
u8 angle;
s8 chazhi;
chazhi=sensor_to_another[0]-sensor_to_another[1];
angle=midle+(int)(chazhi/10);
FTM_PWM_Duty(FTM1,CH0,angle);
delayms(1);
}
void main()
{
Systeminit();
Motor_forward(650);
while(1)
{
Get_AD_data();
delayms(1);
duojikongzhi();
}
}
|
|