// date 21.th august 2016 10:19 #include #include #include #include #include #include #include "uart.h" // interrupt driven #define F_CPU 20000000 #include void delayMs(uint16_t time){ uint16_t i; for (i=1;i<=time;i++){ _delay_ms(1); } } // ADC channels #define hallX1 0 #define hallX2 1 #define hallY1 2 #define hallY2 3 #define ADCkDpoti 4 #define ADCkPpoti 5 //---------------------------------------------------------------------------------------- void setupTimer0(){ TCCR0A=0b00100011 ; // fast pwm mode 7, top=ocr0a oc0b=output pwm TCCR0B=0b00001001 ; // mode 7 prescaler 1 OCR0A=80 ; OCR0B=40 ; } #define PWMMAX (256 ) void setupTimer1(){ TCCR1A=0b10100010 ; // fast pwm TCCR1B=0b00011010 ; // ck=XTAL/8 OCR1A=1000 ; // OC1A pin15 OCR1B=100 ; // OC1B pin 16 ICR1=PWMMAX-1 ; } // OC1A pin 15 PB1 with PD7 pin 13 magnet X // OC1B pin 16 PB2 with PD6 pin 12 magnet Y void setupTimer2(){ TCCR2A=0b00000011 ; // fast pwm mode 7, top=ocr2a TCCR2B=0b00001111 ; // mode 7 prescaler 1024 OCR2A=20-1 ; // 20MHz/1024/20=976.56.. Hz TIMSK2=0b00000001 ; // overflow interrupt enable } //------------------------------------------------------------------------- void setCoilX(int v){ if(v>0){ if(v>PWMMAX ) { v=PWMMAX ; } PORTD &= ~_BV(7) ; OCR1A=v ; } else { if(v<-PWMMAX ) { v=-PWMMAX ; } PORTD |= _BV(7) ; OCR1A=PWMMAX+v ; } } void setCoilY(int v){ if(v>0){ if(v>PWMMAX ) { v=PWMMAX ; } PORTD &= ~_BV(6) ; OCR1B=v ; } else { if(v<-PWMMAX ) { v=-PWMMAX ; } PORTD |= _BV(6) ; OCR1B=PWMMAX+v ; } } //---------------------------------------------------------------------------------------- void ADCsetup(){ ADCSRA=0b0111 ; // predivider 128 ADCclk=16000/128=125kHz Conversion time 13/125kHz=104us, 9.6kHz sample rate ADCSRA |= ( 1 << ADEN) ; // enable ADMUX =0b01000001 ; // Vref=AVcc , input at ADC1 } int32_t getADCx(uint8_t Channel){ ADMUX &=0b11110000 ; ADMUX |=Channel ; ADCSRA |= ( 1 << ADSC) ; while ( (ADCSRA & (1 << ADIF ))==0 ){ } ; ADCSRA |= (1 << ADIF ) ; return ADC ; } int32_t getADCmean(uint8_t Channel, int16_t N){ int32_t mean=0 ; for (uint16_t k=0 ; k