📄 che_free.c
字号:
/** ###################################################################
** Filename : che_free.C
** Project : che_free
** Processor : MC9S12DG128BCPV
** Version : Driver 01.11
** Compiler : Metrowerks HC12 C Compiler
** Date/Time : 2008-3-2, 下午 04:53
** Abstract :
** Main module.
** Here is to be placed user's code.
** Settings :
** Contents :
** No public methods
**
** (c) Copyright UNIS, spol. s r.o. 1997-2005
** UNIS, spol. s r.o.
** Jundrovska 33
** 624 00 Brno
** Czech Republic
** http : www.processorexpert.com
** mail : info@processorexpert.com
** ###################################################################*/
/* MODULE che_free */
/* Including used modules for compiling procedure */
#include "Cpu.h"
#include "Events.h"
#include "PWM8Di.h"
#include "TI1.h"
#include "AD2.h"
#include "AD3.h"
#include "PWM8h.h"
#include "PWMd.h"
#include "IEE1.h"
#include "TI2.h"
/* Include shared modules, which are used for whole project */
#include "PE_Types.h"
#include "PE_Error.h"
#include "PE_Const.h"
#include "IO_Map.h"
void IO_init(void);
void dsend(char cha);
void isend(char cha);
void delay(unsigned int timer);
void xianshi(unsigned int shu);
byte timer2=0;
byte timerover=0;
unsigned int pwm;
int distance[9],distance_ave,distance_ave1; //分别用于 存黑线离每一个红外管距离,前一时间的
int distance_d1,distance_d2,distance_dji;
float kd,kp;
unsigned int distance_k;
//***********************************用于积分的程序
void TI1_OnInterrupt(void)
{ //PORTB++;
distance_d2=distance_d1;
distance_d1=distance_ave;
distance_dji=(distance_d1-distance_d2);
}
//*************************************************
void main(void)
{ byte a=0,pansha=0;
static byte b=0;
//,speed;
int i; //测得出的实际电压值
byte vmax[9],vmin[9],vave[9],v[9]; //最大电压,最小电压,平均电压
byte heishu=0;
char k1,k2,jizun; //k1为曲率系数,k2为偏移中线
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
PE_low_level_init();
/*** End of Processor Expert internal initialization. ***/
/* Write your code here */
//****************************初始化各种参数*************
IO_init();
jizun=4;
isend(1);
isend(56);
isend(14);
isend(128);
distance_k=400;
isend(1);
kd=1;
kp=1.2;
k1=4;
k2=4;
/*for(i=0;i<6;i++){
lujing[i]=4;
} */
for(i=0;i<9;i++){
vmax[i]=0x00;
vmin[i]=0xFF;
vave[i]=0x00;
}
PWMDTY01=55350; //舵机
//******************读取存储的数据**********************
for(i=0;i<9;i++){
a=IEE1_GetByte(0x1800+i,&vmax[i]); //把平均电压从EEPROM中读出
a=IEE1_GetByte(0x180a+i,&vmin[i]);
}
a=IEE1_GetByte(0x1809,&PWMDTY2);
//a=IEE1_GetWord(0x1813,&distance_k);
//a=IEE1_GetByte(0x1815,&k1);
//a=IEE1_GetByte(0x1816,&k2);
//a=IEE1_GetWord(0x1817,&distance_ave);
//a=IEE1_GetWord(0x1819,&distance_ave1);
a=IEE1_GetWord(0x181b,&PWMDTY01);
/*if(distance_k<0)
distance_k=200;*/
a=AD2_Start();
a=AD3_Start();
//********************************************************
//********************************************************
//******************防掉电程序**************************
//***************把电压化为0-distace_k之间的数据***************************
distance_k=100;
for(i=0;i<9;i++){
if(i<8)
a=AD2_GetChanValue8(i,&v[i]);
else if(i==8)
a=AD3_GetChanValue8(i-8,&v[i]);
}
for(i=0;i<9;i++){
if(v[i]<vmin[i])
v[i]=vmin[i];
if(v[i]>vmax[i])
v[i]=vmax[i];
distance[i]=distance_k-(v[i]-vmin[i])*distance_k/(vmax[i]-vmin[i]);//(i-4)*115;
}
//*********************确定黑线在第几个红外管下面****************************
heishu=0;
for(i=0;i<9;i++){
if(distance[i]<20)
heishu++;
if(distance[i]<distance[k1]){
k1=i;
}
}
//********************由多个红外算出黑线的精确位置***********************************
if(heishu<4 ){
k2=k1;
if((k1+1)>8)
distance_ave=(k1-1)*100+distance[k1-1];
else if((k1-1)<0)
distance_ave=(k1+1)*100-distance[k1+1];
else
distance_ave=((k1+1)*100-distance[k1+1]+(k1-1)*100+distance[k1-1])/2;
if(k1==0)
distance_ave=(distance_ave+(k1)*100+distance[k1])/2;
else if(k1==8)
distance_ave=(distance_ave+(k1)*100-distance[k1])/2;
else if(distance[k1-1]<distance[k1+1] )
distance_ave=(distance_ave+(k1)*100-distance[k1])/2;
else
distance_ave=(distance_ave+(k1)*100+distance[k1])/2;
//*************************位置给出舵机控制量***********************************************************************
// PWMDTY01=55950-distance_ave*10/7;//-distance_dji;
PWMDTY01=55250-kp*(distance_ave-400);
if(PWMDTY01<54740)
PWMDTY01=54740;
if(PWMDTY01>55850)
PWMDTY01=55850;
distance_ave1=distance_ave;
}
//**********************************
//********************************************************
//*******************************************************
//******************正式程序**************************
for(;;){
distance_k=100;
//***************把电压化为0-distace_k之间的数据***************************
for(i=0;i<9;i++){
if(i<8)
a=AD2_GetChanValue8(i,&v[i]);
else if(i==8)
a=AD3_GetChanValue8(i-8,&v[i]);
}
for(i=0;i<9;i++){
if(v[i]<vmin[i])
v[i]=vmin[i];
if(v[i]>vmax[i])
v[i]=vmax[i];
distance[i]=distance_k-(v[i]-vmin[i])*distance_k/(vmax[i]-vmin[i]);//(i-4)*115;
}
//*********************确定黑线在第几个红外管下面****************************
heishu=0;
for(i=0;i<9;i++){
if(distance[i]<40)
heishu++;
if(distance[i]<distance[k1]){
k1=i;
}
}
//********************由多个红外算出黑线的精确位置***********************************
if(heishu<4 & heishu>0 & k1-k2>-3 & k1-k2<3){
k2=k1;
if((k1+1)>8)
distance_ave=(k1-1)*100+distance[k1-1];
else if((k1-1)<0)
distance_ave=(k1+1)*100-distance[k1+1];
else
distance_ave=((k1+1)*100-distance[k1+1]+(k1-1)*100+distance[k1-1])/2;
if(k1==0)
distance_ave=(distance_ave+(k1)*100+distance[k1])/2;
else if(k1==8)
distance_ave=(distance_ave+(k1)*100-distance[k1])/2;
else if(distance[k1-1]<distance[k1+1] )
distance_ave=(distance_ave+(k1)*100-distance[k1])/2;
else
distance_ave=(distance_ave+(k1)*100+distance[k1])/2;
//*************************位置给出舵机控制量***********************************************************************
if(distance_ave1 - distance_ave>5 |distance_ave - distance_ave1>5) {
//if(distance_ave1 - distance_ave<100 | distance_ave - distance_ave1<100 ){
PWMDTY01=55250-kp*(distance_ave-400);//-kd*distance_dji;
if(PWMDTY01>55600 |PWMDTY01<54900){
if((PWMDTY01>55250 & pansha==1)|(PWMDTY01<55250 & pansha==0)){
a=TI2_Enable();
PTJ_PTJ0=1;
PORTB++;
}
if(PWMDTY01>55250)
pansha=0;
else if(PWMDTY01<55250)
pansha=1;
}
if(PWMDTY01<54740)
PWMDTY01=54740;
if(PWMDTY01>55850)
PWMDTY01=55850;
distance_ave1=distance_ave;
//}
}
}
//***********************按键*********************
if(PORTE_BIT0==0) {
while(PORTE_BIT0==0);
//a=AD2_Stop();
PORTB++;
isend(1);
for(i=0;i<9;i++){
vmax[i]=0x00;
vmin[i]=0xff;
}
while(PORTE_BIT1==1)
{
for(i=0;i<14000;i++);
for(i=0;i<9;i++){
if(i<8)
a=AD2_GetChanValue8(i,&v[i]);
else if(i==8)
a=AD3_GetChanValue8(i-8,&v[i]);
if(a==ERR_OK){
PORTB++;
if(v[i]>vmax[i])
vmax[i]=v[i];
if(v[i]<vmin[i])
vmin[i]=v[i];
}
}
}
for(i=0;i<9;i++) //把平均电压存在EEPROM中去
{
a=IEE1_SetByte(0x1800+i,vmax[i]);
a=IEE1_SetByte(0x180a+i,vmin[i]);
}
}
if(PORTE_BIT1==0) {
while(PORTE_BIT1==0);
isend(1);
//PWMDTY01=PWMDTY01+50;
xianshi(PWMDTY01);
if(distance_ave>0)
xianshi(distance_ave);
else {
dsend('-');
xianshi(-distance_ave);
}
if(k1>0)
xianshi(k1);
else {
dsend('-');
xianshi(-k1);
}
isend(192);
kd++;
xianshi(kd);
xianshi(distance_d1);
xianshi(distance_d2);
if(distance_dji>0)
xianshi(distance_dji);
else
xianshi(-distance_dji);
}
if(PORTE_BIT2==0) {
// isend(1);
// PWMDTY01=PWMDTY01-50;
// xianshi(PWMDTY01);
isend(1);
//xianshi(v[8]);
///xianshi(v[7]);
//xianshi(v[6]);
//xianshi(v[5]);
xianshi(distance[8]);
xianshi(distance[7]);
xianshi(distance[6]);
xianshi(distance[5]);
isend(192);
/* distance_k=distance_k-20;
a=IEE1_SetWord(0x1813,distance_k);
xianshi(distance_k); */
//PWMDTY01=PWMDTY01+50;
PWMDTY2++;
if(PWMDTY2>5)
PWMDTY2=0;
a=IEE1_SetByte(0x1809,PWMDTY2);
xianshi(PWMDTY2);
/* kd++;
xianshi(kd);
xianshi(distance_d1);
xianshi(distance_d2);
if(distance_dji>0)
xianshi(distance_dji);
else
xianshi(-distance_dji); */
//xianshi(PWMDTY01);
PORTB++;
while(PORTE_BIT2==0);
}
if(PORTE_BIT3==0) {
PORTB++;
isend(1);
/*xianshi(v[3]);
xianshi(v[2]);
xianshi(v[1]);
xianshi(v[0]);*/
xianshi(distance[3]);
xianshi(distance[2]);
xianshi(distance[1]);
xianshi(distance[0]);
isend(192);
PWMDTY2--;
if(PWMDTY2<1)
PWMDTY2=5;
a=IEE1_SetByte(0x1809,PWMDTY2);
xianshi(PWMDTY2);
kd--;
xianshi(kd);
while(PORTE_BIT3==0);
}
}
/*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
for(;;){}
/*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/
void IO_init(void){
DDRH=0XFF;
DDRJ=0XFF;
DDRB=0XFF;
DDRE=0X00; //输入
PUCR_PUPEE=0XFF;
PTJ_PTJ0=0; //控制电机的刹车,前进
PORTE_BIT0=1;
PORTE_BIT1=1;
PORTE_BIT2=1;
PORTE_BIT3=1;
}
void xianshi(unsigned int shu) {
if(shu/10000!=0) {
dsend(shu/10000+48);
}
if((shu%10000)/1000!=0 | shu/10000!=0) {
dsend((shu%10000)/1000+48);
}
dsend((shu%1000)/100+48);
dsend((shu%100)/10+48);
dsend(shu%10+48);
dsend(32);
}
void dsend(char cha)
{ PTH=255;
PTJ_PTJ6=1;
;
PTJ_PTJ7=1;
PTH=cha;
PTJ_PTJ7=0;
delay(700);
}
void isend(char cha)
{ PTH=255;
PTJ_PTJ6=0;
;
PTJ_PTJ7=1;
PTH=cha;
PTJ_PTJ7=0;
delay(5700);
}
void delay(unsigned int timer){
unsigned int i ;
for(i=0;i<timer;i++);
}
/* END che_free */
/*
** ###################################################################
**
** This file was created by UNIS Processor Expert 2.96 [03.76]
** for the Freescale HCS12 series of microcontrollers.
**
** ###################################################################
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -