#include <hidef.h> /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ #include <math.h> //-----------------PIT定时中断参量-------------------------------------------------- #define PITTIME1 250; #define PITTIME2 250; int loop_i=0; //int loop_j=0; //-------------------中断服务变量------------ //--------------pk int test_start=0; int test_over=1; int start_flage=0; unsigned int time_m_o=0; unsigned int time_start=0 ; unsigned int time_over=0; float time_rising=0; int distance=0; int k; int duty; //---------------- /****************************准确延时*****************************/ //---------------------------1us准确延时__64M----------------------------- void Delay1us(int c) { intcnt0; for(cnt0=0;cnt0<2*c;cnt0++) { _asm NOP; _asm NOP;_asm NOP; _asm NOP; _asm NOP;_asm NOP;_asm NOP; _asm NOP; _asm NOP;_asm NOP;_asm NOP; _asm NOP; _asm NOP;_asm NOP;_asm NOP; _asm NOP; _asm NOP;_asm NOP; } } //---------------------------1ms准确延时__64M------------------------- void Delay1ms(int c) { int cnt; int cnt1; for(cnt=0;cnt<2*c;cnt++) { for(cnt1=0;cnt1<1000;cnt1++) { _asm NOP; _asm NOP;_asm NOP;_asm NOP; _asm NOP; _asm NOP;_asm NOP;_asm NOP; _asm NOP; _asm NOP;_asm NOP;_asm NOP; _asm NOP; _asm NOP;_asm NOP;_asm NOP; _asm NOP; _asm NOP;_asm NOP;_asm NOP; } } } /**************总线时钟设置函数***************************/ void SetBusCLK_64M(void) { CLKSEL=0x00; PLLCTL_PLLON=1; //turn on PLL SYNR =0xc0 | 0x07; //80M REFDV=0x80 | 0x01; POSTDIV=0x00; //pllclock=2*16*(1+SYNR)/(1+REFDV)=xxMHz; while(CRGFLG_LOCK!=1);//Wait Till VCO Run Stable CLKSEL_PLLSEL=0x01;//PLLCLK Enabled,Bus Clock=PLLCLK/2=24M } /**************I/O初始化函数******************************/ void PORT_ini (void) { DDRP_DDRP2=1; //数据方向寄存器为1:p2口为输出; DDRP_DDRP4=1; //数据方向寄存器为1:p4口为输出; //---发射口--------A口------------------- DDRA_DDRA0=1; //数据方向寄存器1为输出,写数据 PORTA_PA0=0; //设置H口0位的中断 DDRH_DDRH0=0; //H口0位:开关量输入 读数据! PERH_PERH0=0; //H口0位:允许上拉或下拉器件 //H口初始化为低电平 PPSH_PPSH0=0; //H口0位:1上升沿触发中断 0下降沿 PIEH_PIEH0=1; //H口0位:中断允许 中断标志位 PIFH_PIFH0 } /******************************************************************* 定时中断模块 ********************************************************************/ static void PIT_ini(void) //1ms定时中断 { PITCFLMT_PITE=0; //PIT控制寄存器及强制载入微定时器寄存器 //禁止PIT PITMUX_PMUX0=0; //PIT定时器复合寄存器:选择8位的基时钟base0 PITMUX_PMUX3=1; // 选择8位的基时钟base1 //------溢出周期计算:time-out period = (PITMTLD +1) * (PITLD + 1) / fBUS. PITMTLD0=0xc7; //PIT微定时器装载寄存器:8位, 0xc7——199;0x85——6399 PITLD0=0x36f; //PIT定时器装载寄存器:16位0xffff; 0x36f——879 //T0通道定时周期T0 period=200*880/88M=2ms; PITMTLD1=0X85; //0X85——133;C8——200+1 PITLD3=0XFFFF; // FFFF——65535 //T0通道定时周期T3period=134*65536/88M=99.79ms; PITCE_PCE0=0; // PIT通道使能寄存器 : 通道0使能 PITCE_PCE3=1; //通道3使能 PITINTE_PINTE0=0; //PIT中断使能寄存器: PITINTE_PINTE3=1; //通道3中断使能 PITCFLMT_PITE=1; //PIT使能 } /**************ECT初始化函数***********************************/ static void ECT_ini(void) { TIOS_IOS7=0; //:通道选择寄存器0:相应通道为输入捕捉;1:相应通道为输出比较; TIOS_IOS0=0; //T0输入捕捉 TIOS_IOS1=0; //T1输入捕捉 TSCR1_TEN=1; //定时器系统控制寄存器1:定时器使能 TSCR1_PRNT=1;//定时器系统控制寄存器1:精确定时器,PTPSR寄存器有效,对主定时器计数器频率进行设置 5.5M PTPSR=0X07; //8分频 TCTL1_OM7=0; TCTL1_OL7=0; //OC7 没有输出动作! OC7M_OC7M7=0; //不把OC7D中的数据传送到定时器的数据端口; TCTL3=0X80; //1000 0000 :脉冲累加器T1仅在上升沿捕捉 TIE=0X80; //1000 0000禁止中断; 0允许中断 TSCR2_TOI=1; //定时器溢出中断允许 } //------------给触发电平 void SET_PULSE (void) { if (start_flage==0) //30us的触发电平 高于10us { PORTA_PA0=0; Delay1us(30); PORTA_PA0=1; Delay1us(300); PORTA_PA0=0; start_flage=1; test_start=1; test_over=0; } } //------------给触发电平结束 void check_up (void) { if ((start_flage==1)&&(PTH_PTH0==1)) // 检测到上升沿,记录当前时间 { time_start=0; time_m_o=0; TCNT=0X0000; start_flage=2; // cap riseingedge } } ////////////中断服务函数 #pragma CODE_SEG __NEAR_SEG NON_BANKED //---------------------------------------------- void interrupt 25 h_irupt (void) //H口下降沿发生中断 { if (start_flage == 2) { time_over=TCNT; time_rising=((time_over-time_start)+time_m_o*65535)/80; //计算出来为ms time_m_o=0; start_flage=0; distance=(time_rising*340)/20; //公式 计算出来为cm TCNT=0x0000; test_start=0; test_over=1; } PIFH_PIFH0=1; } //-------------------------------------------------------- void interrupt 16 Irupt_t1 (void) //计时器中断溢出 { if ((start_flage==2)&&(test_start==1)) { time_m_o++; } TFLG2_TOF=1; //定时器溢出标志位,写1清0 } //***************************************************************/ void interrupt 69 Irupt_pit3(void) //通道3 100ms中断,检测周期 { SET_PULSE(); //test_start=1; PITTF_PTF3=1; //清除中断标志位 } #pragma CODE_SEG DEFAULT //中断结束 //------------------------------------------------------ /////////////中断服务程序结束/////////////// /*PWM初始化程序*/ void PWM1_init() { PWME_PWME2=0x00; // Disable PWM 禁止 PWMPRCLK=0x33; // 0011 0011A=B=24M/8=3M 时钟预分频寄存器设置 PWMSCLA=150; //SA=A/2/150=10k 时钟设置 PWMSCLB=15; // SB=B/2/15=100k 时钟设置 PWMCLK_PCLK2=1; //PWM3-----SB 时钟源的选择 PWMPOL_PPOL2=1; // Duty=HighTime 极性设置 PWMCAE_CAE2=0; //Left-aligned 对齐方式设置 PWMCTL=0x00; // noconcatenation 控制寄存器设置 PWMPER2=100; // Frequency=SB/100=1K 周期寄存器设置 PWMDTY2=0; // Duty cycle =duty 占空比寄存器设置 PWME_PWME2=1; // Enable PWM 使能 } voidmotor_forward() //控制电机 { PWME_PWME4=0; PWME_PWME2=1; DDRP_DDRP2=1; PTP_PTP2=0; k=distance/5; duty=k-1; PWMDTY2=duty; } void main(void) { DisableInterrupts; SetBusCLK_64M(); PORT_ini(); ECT_ini(); PIT_ini(); EnableInterrupts; SET_PULSE(); for(;;) { if(test_start==1) { check_up(); } if(time_m_o>=300) { duty=100; } if ((test_start==1)&&(test_over==1) ) { SET_PULSE(); } PWM1_init(); motor_forward(); } }
|