📄 wlm_n.c
字号:
//////////相关内容可查阅计算机硬件技术基础、课件、自动控制理论与单片机等书籍/////////////////
///////////////////////////////////程序基础//////////////////////////////////////////////////
#pragma small
#include<reg51f.h> ////包括51系列单片机的基本定义
#include<intrins.h>////
#include<math.h>
#include<absacc.h> ////扩展板必备
typedef unsigned char uchar;
typedef unsigned int uint;
///////////////////电路设定////////////////////////
#define BASE1 0x8100////扩展片选信号CS1(触动开关扩展)
#define BASE2 0x8200////扩展片选信号CS2(双头检测板1)
#define BASE3 0x8300////扩展片选信号CS3 (双头检测板2)
#define BASE5 0x8500////发光二极管阵列
#define BASE6 0x8600////CS_P0IN0
#define BASE7 0x8700////CS_P0OUT0
#define BASE8 0x8800////CS_P0IN1
#define BASE9 0x8900////CS_P0OUT1
sbit dir1=P1^3; ////鉴向信号,实质为反馈标志
sbit dir2=P1^4;
sbit en=P1^0; ////电桥使能信号
sbit ddir1=P1^1;////左轮方向标志。
sbit ddir2=P1^2;////右轮方向标志。
//////////////////////基本参数//////////////////////////////
#define PI 3.1415926
#define D 0.122 ////轮子直径
#define DISTANCE 0.43 ////L轮子间距
#define PANE 1000 ////码盘线数
#define PRESPEED 9000 ////原始最高速度(单位:转/分)
#define RESPEED 300 ////减速最高速度(单位:转/分)
#define RATE 30 ////减速比(原始最高速度/减速最高速度)
#define CONST 0.3 ////( 减速最高速度与码盘线数之比(300(转/分)/1000=0.3),可任意)
#define RIGHT 1
#define LEFT 0
#define LINE 156546 ////走1米两个轮子的码盘线数(计算公式:2*(1/(PI*D))*RATE*PANE)
#define TURN 590 ////转1度两个轮子的码盘线数(计算公式:((DISTANCE/D)*RATE*PANE)/180)
/////////////////////////控制用变量//////////////////////////////
struct discount
{
int uk1; ////上次输出值
int videal;////理想速度(单位:转/分)
int ek; ////本次误差
int ek1; ////上次误差
int ek2; ////前次误差
};
/////////////////////////////////////////////////////////////////////////////////////////
data int ukx,uky; ////实际输出计数值
data struct discount sm2,sm1; ////左右轮结构体变量
data uchar countl,counth; ////计数值高低位
data long temp; ////每次中断时码盘线数(最大值为1500:((PRESPEED/60)*中断周期)/1000)*PANE)
data long temp1=0,temp2=0; ////左右轮总的码盘线数
data long due; ////经PID调节后的偏差
data int uk; ////本次输出值
data int kp1,ki1,kd1; ////PID参数
data int kp2,ki2,kd2;
data uchar prestate=0x14,state;////巡线状态
data int dv; ////速度调节量
data int flag=0; ////巡线开关
data uchar keystate=0x3f; ////碰撞开关状态
//////////////////////结构体初始化//////////////////////////
void initstruct(struct discount *p)
{
p->ek2=0;
p->ek1=0;
p->ek=0;
p->uk1=0;
}
///////////////////////延时////////////////////////
void delay(uchar i) ////以0.1秒为基本单位
{
uchar j,m;
int l;
for(j=0;j<i;j++)
{
for(l=0;l<100;l++)
{
for(m=0;m<250;m++)
{}
}
}
}
///////////////////////电机1速度输出////////////////////
void motor1(int speed1)////PCA模块2
{
if(speed1>=0) ////正转
ddir1=0;
else
{
ddir1=1; ////反转
speed1=-speed1;
}
CCAP2L=speed1; ////转速,范围(-128,127)
CCAP2H=speed1;
CCAPM2=0x42; ////8位PWM
}
///////////////////////电机2速度输出////////////////////
void motor2(int speed2)////PCA模块3
{
if(speed2>=0)
ddir2=1; ////正转
else
{
ddir2=0; ////反转
speed2=-speed2;
}
CCAP3L=speed2; ////转速,范围(-128,127
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -