📄 program.c
字号:
}
}
}
for(i = 8; i >4; i--)
{
if(ucAD_Port&(1<<(i-1)))
{
sum++;
temp+=(-((i-3)<<1));
}
}
for(i = 4; i >0; i--)
{
if(ucAD_Port&(1<<(i-1)))
{
sum++;
temp+=(12-(i<<1));
}
}
/****************************************************************************
根据传感器状态算出uiTurnAngel
***************************************************************************/
if(sum != 0)
{
scDeparture = (temp / sum);
scLastDeparture = scDeparture;
/*uiTurnAngle = PWM_Middle + (temp*PWM_ TOTAL)/(sum*10); */
if((scDeparture>=(-10))&&(scDeparture<(-3)) )
{
uiTurnAngle =( 23*scDeparture/7 + 154);// 153+6/7);
}
if((scDeparture>=(-3))&&(scDeparture<=3))
{
uiTurnAngle = scDeparture + 147;
}
if((scDeparture>3)&&(scDeparture<=10))
{
uiTurnAngle = ( 23*scDeparture/7 + 139);//+1/7;
}
}
else
{
if(scLastDeparture > 0) uiTurnAngle = 173;
if(scLastDeparture < 0) uiTurnAngle = 121;
}
/****************************************************************************/
if((scLastDeparture<=2)&&(scLastDeparture>=(-2))) //中间
{
OutFlag = 0x02;
}
if(scLastDeparture > 2) //左边
{
OutFlag = 0x01;
}
if(scLastDeparture < (-2)) //右边
{
OutFlag = 0x04;
}
/**************************************************/
temp = 0; //清除temp
sum = 0; //清除计数值;
StateB =0; //清除StateB口的记录值,否则
ucAD_Port = 0;
ucSensorState=0;//清除AD转换二值化结果
return uiTurnAngle;
}
void Car_Electric_Brake(void)
{
if(ucDepartureDegree!=0) //车不正
{
if(uiPulse>=uiMaxSpeed-100)
{
Dir_Back; //继电器反向刹车
}
if(uiPulse<=uiMinSpeed) //当速度小于最小时
{
Dir_Go; //继电器使电流正向,车加速
}
}
if(ucDepartureDegree==0) //如果车是正的
{
Dir_Go; //继电器使电流正向
}
}
void Car_Machine_Brake()
{
/* PWMDTY67 : 173-170----165-----147-----130-----124-121 中间147*/
/*1
if(PWMDTY67 >= 170)
{
if(uiPulse>500)
{
PWME_PWME5 = 0;
PTP_PTP5 = 1;
LeftBrake;
}
else
{
PWME_PWME5 = 1;
Start;
}
}*/
/*2
else if((PWMDTY67 <170)&&(PWMDTY67 >= 165))
{
PWME_PWME5 = 1;
LeftBrake;
} */
/*3
else if((PWMDTY67 <165)&&(PWMDTY67 >= 129))
{
PWME_PWME5 = 1;
Start;
}*/
/*4
else if((PWMDTY67 <129)&&(PWMDTY67 >= 124))
{
PWME_PWME5 = 1;
RightBrake;
}*/
/*5
else if(PWMDTY67<124)
{
if(uiPulse>550)
{
PWME_PWME5 = 0;
PTP_PTP5 = 1;
RightBrake;
}
else
{
PWME_PWME5 = 1;
Start;
}
}
}*/
void Car_Machine_Brake()
{
/* PWMDTY67 : 173-170----165-----147-----130-----124-121 中间147*/
/*1*/
if(scLastDeparture >= 9)
{
if(uiPulse>(uiMaxSpeed - 100))
{
PWME_PWME5 = 0;
PTP_PTP5 = 1;
LeftBrake;
delay10ms(5);
}
else
{
PWME_PWME5 = 1;
Start;
}
}
/*2 */
else if((scLastDeparture <= 8)&&(scLastDeparture >= 6))
{
if(uiPulse>(uiMaxSpeed - 100))
{
PWME_PWME5 = 0;
PTP_PTP5 = 1;
LeftBrake;
// delay10ms(3);
}
else
{
PWME_PWME5 = 1;
Start;
}
}
/*3*/
else if((scLastDeparture <= 5)&&(scLastDeparture >= (-5)))
{
PWME_PWME5 = 1;
Start;
}
/*4*/
else if((scLastDeparture <= (-6))&&(scLastDeparture >= (-8)))
{
if(uiPulse>(uiMaxSpeed - 100))
{
PWME_PWME5 = 0;
PTP_PTP5 = 1;
RightBrake;
//delay10ms(3);
}
else
{
PWME_PWME5 = 1;
Start;
}
}
/*5*/
else if(scLastDeparture <= (-9))
{
if(uiPulse>(uiMaxSpeed - 100))
{
PWME_PWME5 = 0;
PTP_PTP5 = 1;
RightBrake;
delay10ms(5);
}
else
{
PWME_PWME5 = 1;
Start;
}
}
}
/***********************************************************
速度控制函数,通过SIN函数实现
**********************************************************
uint Car_Speed_Control(uint max , uint min ,uint angle)
{
uint uiSpeed; //通过计算返回的给PID的需要的速度值
uiSpeed = (max-min)*sin((_M_PI/26)*angle - (136*_M_PI/26))/2 + (max+min)/2 ;
return uiSpeed;
} */
/*****************************************************************
速度控制函数,通过检测传感器偏离程度实现,当 -5~5时较快,ELSE较慢
*****************************************************************/
uint Car_Speed_Control(uint max , uint min)
{
uint uiSpeed; //通过计算返回的给PID的需要的速度值
if((scLastDeparture >=(-4))&&(scLastDeparture<=4))
{
uiSpeed = max;
}
else if(((scLastDeparture >=(-7))&&(scLastDeparture<(-4)))||((scLastDeparture >4)&&(scLastDeparture<=7)))
{
uiSpeed = (max + min) / 2;
}
else
{
uiSpeed = min;
}
return uiSpeed;
}
/*===============================================================
主函数
================================================================*/
void main()
{
Port_Init();
PWM23_Init();
PWM45_Init();
PWM67_Init();
init_7279();
PIDInit();
AD_Init();
Pulse_Count_Init();
/*输入速度*/
//输入速度最大值
write7279(DECODE0+7,1);
uiMaxSpeed=get_data(0,2);
delay10ms(50);
//输入速度最小值
write7279(DECODE0+7,2);
uiMinSpeed=get_data(0,2);
delay10ms(50);
//////////输入结束//////////
while(key); //按任意健开始
EnableInterrupts;//开总中断
for(;;)
{
PWMDTY67 = GetValue(); //控制舵机角度
// Car_Electric_Brake();
Car_Machine_Brake();
sPID.vi_Ref = Car_Speed_Control(uiMaxSpeed,uiMinSpeed);
dis_data(0,2,sPID.vi_Ref);
dis_data(5,7,uiTurnAngle);
}
}
/*===============================================================
定时器中断函数,20ms执行一次此函数
===============================================================*/
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void Pulse_Count(void)
{
MCFLG_MCZF = 1;
uiPulse=PACN10; //读出脉冲计数值
PACN10=0;
// dis_data(0,2,uiSpeed);
// dis_data(0,2,uiTurnAngle);
// dis_data(5,7,uiPulse);
sPID.vi_FeedBack=uiPulse;
PWMDTY45=v_PIDCalc(&sPID);
}
#pragma CODE_SEG DEFAULT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -