#include"canshu.h" uint t; uchar time2_2h=4,time2_2l=4; void TIM2_Init() { TIM2_CCMR2 = TIM2_CCMR2 | 0x70;// Output modePWM2. //通道2被設置成比較輸出方式 // OC2M = 111,為PWM模式2, // 向上計數時,若計數器小于比較值,為無效電平 // 即當計數器在0到比較值時,輸出為1,否則為0 TIM2_CCMR1 = TIM2_CCMR1 | 0x70; TIM2_CCMR3 = TIM2_CCMR3 | 0x70; TIM2_CCER1 = TIM2_CCER1 | 0x33;// CC polarity low,enable PWMoutput */ // CC2P = 1,低電平為有效電平 // CC2E = 1,開啟輸出引腳 TIM2_CCER2 = TIM2_CCER2 | 0x03; //初始化自動裝載寄存器,決定PWM方波的頻率,Fpwm=16000000/1000=16kHZ TIM2_ARRH = 16000/255; TIM2_ARRL = 16000%255; TIM2_CCR1H =time2_2h; TIM2_CCR1L = time2_2l=4; //初始化比較寄存器,決定PWM方波的占空比 TIM2_CCR2H =1000/255; TIM2_CCR2L =1000%255; TIM2_CCR3H = 1000/255; TIM2_CCR3L = 1000%255; //初始化時鐘分頻器為1,即計數器的時鐘頻率為Fmaster=4MHZ TIM2_PSCR =0x00;//因為用了繼電器,所以喲分頻,可到0x08,256分頻 //啟動計數 TIM2_CR1 = TIM2_CR1 | 0x01; } //外部中斷觸發 void exit_init() { PC_DDR&=~0x04; PC_CR1|=0x04; PC_CR2|=0x04; EXTI_CR1|= 0x10; } #pragma vector=0x07 // 這里很關鍵!看下面說明。 __interrupt void EXTI_PC1(void) { asm("sim"); switch(EXTI_CR1) { case 0x10:EXTI_CR1=0x20;exit_flag=1;break; case 0x20:EXTI_CR1=0x10;exit_flag=2;break; default :exit_flag=0;break; } if(exit_flag==2) { t++; exit_flag=0; if(t%10==0) { ulong chaju; now_nus=TIM4_CNTR; now_ms=cishu; chaju_ms=now_ms-last_ms; if(cishu_flag==1) { cishu_flag=0; chaju_ms=30000+now_ms-last_ms; } chaju_nus=now_nus-last_nus; chaju=chaju_ms*250+chaju_nus; now_rads=(1250000/chaju); last_nus=now_nus; last_ms=now_ms; last_rads[rads_flag++]=now_rads; if(rads_flag==10) rads_flag=0; pid_error=now_rads-last_radss; pid_error1=last_radss-last_radsss; last_radsss=last_radss; last_radss =now_rads; } } asm("rim"); } #pragma vector=TIM2_OVR_UIF_vector __interrupt void TIM3_OVF_IRQHandler(void) { TIM2_SR1 = 0x00; ds1820_flag=1; } //定時器2產生60s的中斷 void TIM2_time() { TIM2_EGR=0x01; //手動產生更新事件,重新初始化計數器,并允許產生一個更新事件 //設置定時器初值 TIM2_CNTRH=0; //不能使用TIM3_CNTR直接設值, TIM2_CNTRL=0; //設定自動重裝寄存器值 //這里得注意不能使用TIM2_ARR的方式進行設值,TIM2是十六位的。 //如TIM2_ARR=0xFA,實際上是賦給高字節了,TIM2_ARRH=0xFA,而不是想象中的賦給低字節。 TIM2_ARRH=0x72; //488hz 488 /29280 = 60s (1S) TIM2_ARRL=0x60; //0x007d 意味著每產生一次中斷時間為60S TIM2_PSCR=0x0f; //預分頻32275 TIM2_IER=0x01; //中斷允許位使能 TIM2_CR1=0x01; //使能計時器 }
|