📄 main.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 + -