⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 离合器控制
💻 C
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GZ16.h> /* include peripheral declarations */
#include "type.h"
#include "sci.h"

#pragma MESSAGE DISABLE C2705          /*Disable warning C2705 "possible loss of data"*/    

////////////////DEFINE///////////////////////////
#define VALVE_IN PTD_PTD6
#define VALVE_OUT PTD_PTD7

#define VALVE_IN PTD_PTD6
#define VALVE_OUT PTD_PTD7

#define VALVE_OPEN   1  
#define VALVE_CLOSE  0


///////////////Golbal variable/////////////////////
uint16 counter_now,counter_bef,counter;
uint8 kp=3,ki=1,kd=0;
sint16 AP_goal,AP_now,AP_last,AP_error,AP_error_last,AP_error_last2;
sint16 duty_chg,duty,duty_chg_max=20,duty_max=1249;  
uint8 valve_in_flag,valve_out_flag;
uint8 ADchannel=2;
uint16 Panel_now;
//uint16 xx,yy;
uint8 TxDataNum;
uint8 abs_state;
uint8 SciRxdata;
uint16 timer_10ms;
//uint8 SciCmd;



///////////////Fuction declare//////////////////////
void delay(uint16 delay_time);
///////////////Fuction//////////////////////
void systemboot(void){
DisableInterrupts;
CONFIG2=0X00;//SCI source =8M
}


void TIM1Init(void){
T1SC_TSTOP=1;//T1SC STOPPED
T1SC_TRST=1;//T1SC RESET
T1SC=0X46;//TOIE ENABLE,64PRESCALE,f=2M/64
T1SC0=0X1a;//00011010;unbuffered PWM
T1SC1=0x48; //输入,上升沿捕捉
T1MODH=0X01;//PWM period
T1MODL=0X38;//0X4e2=1250,1250*64/8M=0.01=10MS
T1SC_TSTOP=0;//T1SC STOPPED
}



void TIM2Init(void){
T2SC_TSTOP=1;//T1SC STOPPED
T2SC_TRST=1;//T1SC RESET
T2SC=0X46;//TOIE ABLE,64PRESCALE,f=2M/64
T2SC0=0x1A;//00011010;unbuffered PWM ZHONGDUA N
T2SC1=0x1A; //00011010;unbuffered PWM
T2MODH=0X01;//PWM period
T2MODL=0X38;//0X138=312,312*64/2M=0.01=10MS
T2SC_TOIE=1;
T2SC_TSTOP=0;//T1SC STOPPED
}


void ADInit(void){
ADCLK=0X34;//总线时钟2m,ad时钟=2m/2,右对齐
ADSCR=0X22;//连续转换,输入通道ad5
}

void SCIInit(void){
SCC1=0X40;//允许sci模块
//SCC2=0X2C;//使能发送和接收,使能接收中断
SCC2=0X0C;//使能发送和接收,

//SCC2_SCTIE=1
SCC3=0x00;
//SCBR=0X30;//BPD=13,BD=1,BAUD=8000000/64/13/1=9615
SCBR=0X01;//BPD=1,BD=1,BAUD=8000000/64/1/2/(3+0.25)=19230
SCPSC=0X48;//PD=3,PDFA=0.25
//SCC2_SCTIE=1;
}

void IOInit(void){
DDRA_DDRA1=1;
DDRA_DDRA2=1;
DDRA_DDRA3=1;
DDRA_DDRA4=1;

}
void PTDInit(void){

DDRD_DDRD6=1;
DDRD_DDRD7=1;
}




void main(void) {

	systemboot();
	TIM1Init();
	TIM2Init();
	ADInit();
	SCIInit();
	IOInit();
	//PTDInit();
 	EnableInterrupts; /* enable interrupts */
  /* include your code here */
  	VALVE_IN=VALVE_CLOSE;
    //VALVE_OUT=VALVE_OUT_OPEN;//踩离合器的时候,需要把out阀关闭!!
  	VALVE_OUT=VALVE_CLOSE;

  for(;;) {
   
  
  switch (ADchannel){
  			case 2:while(ADSCR_COCO==0){;} AP_now=(ADRH<<8)+ADRL;ADchannel=3;ADSCR=0X23;break;
  			case 3:while(ADSCR_COCO==0){;} Panel_now=(ADRH<<8)+ADRL;ADchannel=2;ADSCR=0X22;break;
  			default:break;
  			
  			}
  			
  if(SCS1_SCRF){//receive sci data

  		SciRxdata=SCDR;
  		switch(SciRxdata){
		
		case 1 :VALVE_OUT=VALVE_OPEN;break;
		case 2 :VALVE_OUT=VALVE_CLOSE;break;
		case 3 :VALVE_IN=VALVE_OPEN;break;
		case 4 :VALVE_IN=VALVE_CLOSE;break;
		case 5 :VALVE_OUT=VALVE_OPEN;VALVE_IN=VALVE_CLOSE;delay(100);VALVE_OUT=VALVE_CLOSE;break;//jiehe
		case 6 :VALVE_OUT=VALVE_CLOSE;VALVE_IN=VALVE_OPEN;break;
		case 7 :T2CH0=T2CH0+10;break;
		case 8 :T2CH0=T2CH0-10;break;
		case 9 :T2CH1=T2CH1+10;break;
		case 10 :T2CH1=T2CH1-10;break;
		default :break;
		}
  	}
/* if (valve_out_flag>4){
  VALVE_IN=VALVE_IN_CLOSE;
  VALVE_OUT=VALVE_OUT_OPEN;
  valve_out_flag=0;}
 if (valve_in_flag>4){
  	VALVE_IN=VALVE_IN_OPEN;
  	VALVE_OUT=VALVE_OUT_CLOSE;
  	valve_in_flag=0;}*/
 abs_state=VALVE_IN*2+VALVE_OUT;//press data
 //abs_state=VALVE_OUT;//press data
      __RESET_WATCHDOG(); /* kicks the dog */
  } /* loop forever */
}

 
void delay(uint16 delay_time)
	{
	 
	 timer_10ms=0;					   
	 while(timer_10ms<delay_time){;}
	}	
///////////////////////////////ISR///////////////////////////////

interrupt 5 void TIM1_Capture(void){//300us
	static uint16 temp=0;
	T1SC1_CH1IE=0;//输入捕捉中断禁止
  	T1SC1_CH1F=0;//清除标志位
  	counter_bef=counter_now;
  	temp=T1CH1H;
  	counter_now=(temp<<8)+T1CH1L;
  	 if(counter_now>counter_bef){              
      counter=counter_now-counter_bef;
    }
  	PTA_PTA4=!PTA_PTA4; 
    T1SC1_CH1IE=1;//输入捕捉中断禁止 
}    

interrupt 6 void TIM1_Overflow(void){  
  
  T1SC_TOIE=0;//TOIE DISABLE
  T1SC_TOF=0;//CLEAR TOF

 // 
   // 
      PTA_PTA3=!PTA_PTA3;
      //  PTA_PTA4=!PTA_PTA4;
  
  SCC2_TCIE=1;//使能发送中断
  PutChar_SCI0(255);
  timer_10ms++;
  if (timer_10ms>=65530) timer_10ms=0;

 
  T1SC_TOIE=1;//TOIE ENABLE
  

  
}

interrupt 9 void TIM2_Overflow(void){  
  
  T2SC_TOIE=0;//TOIE DISABLE
  T2SC_TOF=0;//CLEAR TOF

 // PTA_PTA1=!PTA_PTA1;
   // PTA_PTA2=!PTA_PTA2;
      PTA_PTA3=!PTA_PTA3;
      //  PTA_PTA4=!PTA_PTA4;
  
 /* SCC2_TCIE=1;
  PutChar_SCI0(255);
  if (Panel_now<150) Panel_now=150;
  AP_goal= 0.9*(Panel_now-150); 
  AP_error=AP_goal-AP_now;
  
  
  duty_chg=kp*(AP_error-AP_error_last)+ki*AP_error+kd*(AP_error-2*AP_error_last+AP_error_last2);
  //duty=kp*(AP_error)+ki*AP_now+kd*(AP_error-AP_error_last);

  if(duty_chg>duty_chg_max)  {duty_chg=duty_chg_max;   valve_in_flag++; valve_out_flag=0;}   
  if(duty_chg<-duty_chg_max)  {duty_chg=-duty_chg_max; valve_out_flag++;valve_in_flag=0; }
   //if(duty>duty_max)  {duty=duty_max;   valve_in_flag++; valve_out_flag=0;}   
  //if(duty<0)  {duty=0; valve_out_flag++;valve_in_flag=0; }
  duty=duty+duty_chg;
  if(duty>duty_max)  duty=duty_max;      
  if(duty<0) duty=0; 
  
  //PTA_PTA2=!PTA_PTA2;  
  T2CH0=duty;
  
  

  AP_last=AP_now;
   AP_error_last2=AP_error_last;
  AP_error_last=AP_error;*/
  
  T2SC_TOIE=1;//TOIE ENABLE
  
}
interrupt 14 void SciTx(void){
 	//temp=SCS1;
 	
 	switch (++TxDataNum){
 	  case 1:PutChar_SCI0(AP_now/256); break;
 	  case 2:PutChar_SCI0(AP_now); break;
 	  case 3:PutChar_SCI0(Panel_now/256); break;
 	  case 4:PutChar_SCI0(Panel_now); break;
 	  case 5:PutChar_SCI0(counter/256); break;
 	  case 6:PutChar_SCI0(counter); break;
 	  case 7:PutChar_SCI0(duty/256); break;
 	  case 8:PutChar_SCI0(duty); break;
 	  case 9:PutChar_SCI0(abs_state);  break;
	  case 10:PutChar_SCI0(SciRxdata); break;
 	  case 11:PutChar_SCI0(T2CH0/256); break;
 	  case 12:PutChar_SCI0(T2CH0); break;
 	  case 13:PutChar_SCI0(T2CH1/256); break;
 	  case 14:PutChar_SCI0(T2CH1); break;
 	  default: TxDataNum=0;SCC2_TCIE=0;break;// SCC2_SCTIE=0;
 	
 	
 	}
 		PTA_PTA2=!PTA_PTA2;
  	//SCDR=rxdata;
  	//SCC2_SCTIE=0;
  	
 }
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -