#include <hidef.h> /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ //程序中用到的函数申明_WNL void delay_1MS(int ms);//延时1ms程序 void SET_PLL(void);//锁相环程序_WNL void SCI_Init(); void Uart_putchar( unsigned char c); void Uart_putstr(char ch[]); unsigned char Uart_getchar(void); void PWM_Init(void);//PWM初始化 void OverCounter(void);//自由运行计数器溢出中断 void Speed_catch(void);//TC7输入捕捉中断 void Speed_Init(void);//速度采集初始化 void Initialize_RTI(void);//实时中断初始化 void RTI_Init(void);//RTI中断 //程序中用到的变量申明_WNL byte res=0; unsigned char Time=0;//自由运行计数器溢出次数 unsigned char Timefirst=0; unsigned int Speed=0,Speed1=0,Speed2=0;//前后三次的速度 unsigned int trianglespeed=0; unsigned int Speedc=0,Speedd;//Speedc记录上升沿来临的次数,Speedd记录总的时间 unsigned int TimeCnt1=0,TimeCnt0=0;//记录前后两次自由计数器中的值 unsigned char timecounter=0;//记录系统的时间_WNL unsigned char time=0; int Speedbase=0;//速度给定值的整体调控 /**************延时程序***********************/ void delay_1MS(int ms) { intii,jj; for(ii=0;ii<ms;ii++) for(jj=0;jj<1325;jj++); } /*****************锁相环程序*****************/ void SET_PLL(void) { //设置锁相环时钟频率为48M SYNR=2; REFDV=1; //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1) asmNOP; asmNOP; asmNOP; while((CRGFLG&0X08)==0);//等待锁相环频率锁定 CLKSEL=0X80; //选定锁相环时钟 } /*初始化SCI0*/ void SCI_Init() { SCI0BD=313;//48MHz总线频率,9600的分频SCI系数,波特率=总线时钟/(16×SCIxBD); SCI0CR1 =0x00;//正常8位模式,偶校验 SCI0CR2 =0x2c;//接收中断允许 } void Uart_putchar ( unsigned char c) { while(!(SCI0SR1&0x80)) ; //keep waitingwhen not empty SCI0DRL=c; } void Uart_putstr(char ch[]) { unsigned char ptr=0; while(ch[ptr]){ Uart_putchar((unsigned char)ch[ptr++]);} } unsigned char Uart_getchar(void) { byte res=0; while(!(SCI0SR1&0x80)) ; //keep waitingwhen not empty return (SCI0DRL); } /****************实时中断初始化程序*************/ void Initialize_RTI(void) { CRGINT_RTIE=1;//实时中断使能 RTICTL=0X54;//实时中断周期为5.12ms EnableInterrupts;//清除I屏蔽位 } /****************中断服务程序*******************/ #pragma CODE_SEG NON_BANKED//指示该程序在不分页区 #pragma TRAP_PROC void RTI_Init(void) { CRGFLG_RTIF = 1; AD_detect(); //调用AD转换处理程序 asmNOP; asmNOP; asmNOP; //记录系统时间_WNL timecounter++; if(timecounter>=200) { timecounter=0; time++; } if(time>200)time=0; } #pragma CODE_SEG DEFAULT /****************************速度检测初始化*************************/ void Speed_Init(void) { asm sei; TIOS=0x00; //通道2设置为输入捕捉 TIE=0xFF; //通道1输入捕捉中断使能 TCTL3_EDG7B=0; TCTL3_EDG7A=1; //通道2捕捉上升沿 TSCR2_TCRE=0; //自由运行计数器禁止复位 TSCR1_TFFCA=0; //定时器标志普通清除方式 TSCR2_TOI=1; //定时器溢出中断 TSCR2_PR=0x02; // TSCR1_TEN=1; //定时器使能 EnableInterrupts; } /********************检测自由运行计数器溢出次数*******************/ #pragma CODE_SEG NON_BANKED #pragma TRAP_PROC void OverCounter(void) { TFLG2_TOF=1;//清除溢出标志位 Time++; //自由运行计数器溢出,计数值加1 } #pragma CODE_SEG DEFAULT /*********************进行速度采集********************************/ #pragma CODE_SEG NON_BANKED #pragma TRAP_PROC void Speed_catch(void) { TFLG1_C7F=1; //清除中断标志位 if(Speedc==0) {//第一次进入 Timefirst=Time;//记录自由运行计数器溢出次数 TimeCnt0=TC7;//记录当前自由运行计数器中的值 Speedc=1; //已经有第一次进入做基础,准备第二次进入 } else if(Speedc==1) { TimeCnt1=TC7;//记录当前自由运行计数器的值 Speedd=(Time-Timefirst)*65535-TimeCnt0+TimeCnt1;//记录总的时间 Speed=(uint)(197476/Speedd);//求当前瞬时速度 Speed=(Speed+Speed1+Speed2)/3;//取三次速度的平均值 Speed2=Speed1; Speed1=Speed;//速度跟新 Speedc=0; Time=0;//标志位清0 } } #pragma CODE_SEG DEFAULT /*****************PWM初始化程序***************/ void PWM_Init(void) { PWME=0X00;//关闭所有PWM输出 PWMPRCLK=0X22;//24M/4=6M PWMSCLA=0X06; //6M/(2*6)=0.5M PWMSCLB=0X03; //6M/(2*3)=1M PWMCTL=0X20; //通道2和通道2合并 PWMCLK=0X3C; //通道23,4,5选择clocksA PWMPOL=0X3C; //PWM先输出高电平 PWMCAE=0X00; //左对齐 PWMPER23=10000;//周期为10ms PWMDTY23=1500;//输出角度为0度 PWMPER4 = 100; //5KHz PWMPER5 = 100; //5KHz PWMDTY4 =30;//初始速度设置为0 PWMDTY5 =0; PWME=0X3C;//开启PWM23,PWM4,PWM5 } void main(void) { delay_1MS(2000); DDRA=0X00; SET_PLL(); PWM_Init(); Initialize_RTI(); Speed_Init(); EnableInterrupts; while(1) { PWMDTY4=20; time=0; timecounter=0;//计数器清零 if(Uart_getchar() == 'c') Uart_putstr("Usart Is Working!"); } /*please make sure that you never leave main */ }
|