unsigned invar; unsigned DigFil(unsigned invar) { long sumnum=0, sumden=0, newin=0; static long states[2][2] = { {0,0}, {0,0} }; newin = invar*200000/101833; sumnum = sumden = 0; sumden += states[0][0]-states[0][0]/227; sumnum -= states[0][0]; states[0][0] = states[0][1]; sumden -= states[0][1]*2-states[0][1]/18; states[0][1] = (newin-sumden); sumnum += states[0][1]; newin = sumnum; sumnum = sumden = 0; sumden += states[1][0]-states[1][0]/222; sumnum -= states[1][0]; states[1][0] = states[1][0+1]; sumden -= states[1][1]*2-states[1][1]/18; states[1][1] = (newin-sumden); sumnum += states[1][1]; newin = sumnum/200000; if(newin>2045) newin=2045 ; if(newin<-2045) newin=-2045 ; return newin; } void Timer2_interrupt() iv IVT_INT_TIM2 { TIM2_SR.UIF = 0; invar = ADC1_Get_Sample(6); GPIOB_ODR = 2045 + DigFil( invar); } void main() { GPIO_Digital_Output(&GPIOB_BASE, _GPIO_PINMASK_ALL ); AFIOEN_bit=1; SWJ_CFG0_bit=0; SWJ_CFG1_bit=1; SWJ_CFG2_bit=0; ADC_Set_Input_Channel(6); ADC1_Init(); RCC_APB1ENR.TIM2EN = 1; TIM2_CR1.CEN = 0; TIM2_PSC = 0; TIM2_ARR = 479; NVIC_IntEnable(IVT_INT_TIM2); TIM2_DIER.UIE = 1; TIM2_CR1.CEN = 1; }