#include"canshu.h" uint t; uchar time2_2h=4,time2_2l=4; void TIM2_Init() { TIM2_CCMR2 = TIM2_CCMR2 | 0x70;// Output modePWM2. //通道2被設(shè)置成比較輸出方式 // OC2M = 111,為PWM模式2, // 向上計(jì)數(shù)時(shí),若計(jì)數(shù)器小于比較值,為無(wú)效電平 // 即當(dāng)計(jì)數(shù)器在0到比較值時(shí),輸出為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,開(kāi)啟輸出引腳 TIM2_CCER2 = TIM2_CCER2 | 0x03; //初始化自動(dòng)裝載寄存器,決定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; //初始化時(shí)鐘分頻器為1,即計(jì)數(shù)器的時(shí)鐘頻率為Fmaster=4MHZ TIM2_PSCR =0x00;//因?yàn)橛昧死^電器,所以喲分頻,可到0x08,256分頻 //啟動(dòng)計(jì)數(shù) TIM2_CR1 = TIM2_CR1 | 0x01; } //外部中斷觸發(fā) void exit_init() { PC_DDR&=~0x04; PC_CR1|=0x04; PC_CR2|=0x04; EXTI_CR1|= 0x10; } #pragma vector=0x07 // 這里很關(guān)鍵!看下面說(shuō)明。 __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; } //定時(shí)器2產(chǎn)生60s的中斷 void TIM2_time() { TIM2_EGR=0x01; //手動(dòng)產(chǎn)生更新事件,重新初始化計(jì)數(shù)器,并允許產(chǎn)生一個(gè)更新事件 //設(shè)置定時(shí)器初值 TIM2_CNTRH=0; //不能使用TIM3_CNTR直接設(shè)值, TIM2_CNTRL=0; //設(shè)定自動(dòng)重裝寄存器值 //這里得注意不能使用TIM2_ARR的方式進(jìn)行設(shè)值,TIM2是十六位的。 //如TIM2_ARR=0xFA,實(shí)際上是賦給高字節(jié)了,TIM2_ARRH=0xFA,而不是想象中的賦給低字節(jié)。 TIM2_ARRH=0x72; //488hz 488 /29280 = 60s (1S) TIM2_ARRL=0x60; //0x007d 意味著每產(chǎn)生一次中斷時(shí)間為60S TIM2_PSCR=0x0f; //預(yù)分頻32275 TIM2_IER=0x01; //中斷允許位使能 TIM2_CR1=0x01; //使能計(jì)時(shí)器 }
|