#define F_CPU 20000000 #define BAUD 9600 #define BRC ((F_CPU/16/BAUD)-1) #define MPU6050 0x68 #define interval 10 #define sensormotor 100 #include #include // for serial #include #include #include #include #include // for printf uint16_t #include void uart_init(void){ UBRR0L = BRC; UBRR0H = (BRC >> 8); //Baud rate setting UCSR0B |= (1 << RXEN0) | (1 << TXEN0); //RxTx enable UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); //8bit char } void uart_setchar(char c) { loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */ UDR0 = c; } char uart_getchar(void) { loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */ return UDR0; } int usart_putchar_printf(char var, FILE *stream) { //if (var == '\n') usart_putchar('\r'); uart_setchar(var); return 0; } static FILE mystdout = FDEV_SETUP_STREAM(usart_putchar_printf, NULL, _FDEV_SETUP_WRITE);//define stream /////////////////////////////////////////////////////////////////////////////////////////////// void I2C_init(void){ //TWSR = 0x00; TWBR = 0x5C;// TWI clock 100kHz, SCL frequency = F_CPU/(16 + 2(TWBR)*(TWSR prescale)) TWCR = (1 << TWEN); //address 1101000 } void I2C_start(void){ TWCR = (1 << TWEN) | (1 << TWINT) |(1 << TWSTA);//twi enable/clear int flag/start (master) while ((TWCR & (1< 0){ stepforwardM1(); (*steps)--; } if (*steps < 0){ stepbackwardM1(); (*steps)++; } } int main(void) { // set clock divider to /1 CLKPR = (1 << CLKPCE); CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0); // DDRB = (1 << PB1) | (1 << PB2) | (1 << PB3); DDRC = (1 << PC1); GTCCR = (1<= sensormotor) { MPU_read(0x3F,&AcZ); MPU_read(0x43,&GyroX); //printf("%" PRId16 "\n",GyroZ); feedAcZ[5] = feedAcZ[4]; feedAcZ[4] = feedAcZ[3]; feedAcZ[3] = feedAcZ[2]; feedAcZ[2] = feedAcZ[1]; feedGyroX[5] = feedGyroX[4]; feedGyroX[4] = feedGyroX[3]; feedGyroX[3] = feedGyroX[2]; feedGyroX[2] = feedGyroX[1]; feedAcZ[1] = AcZ*4.0/65536.0*1048.0*7.0/3.14/2; feedGyroX[1] = (GyroX+500)*500.0/65536.0*interval*sensormotor/1000000.0*1048.0*7.0/360.0; /* if (feedGyroX[1] > 30.0) feedGyroX[1] = 30.0;//250*interval*sensormotor(s)*20.4~5000*sensor time else if (feedGyroX[1] < -30.0) feedGyroX[1] = -30.0; */ //seems sensitivity is 500deg*1.3 instead of 500deg if ((GyroX > 32760) | (GyroX < -32760)) setpoint = feedAcZ[1]*0.02+GyroX*500.0/65536.0*interval*sensormotor/1000000.0*1048.0*7.0/360.0*30; else setpoint = -feedAcZ[1]*0.1+(feedAcZ[1]-feedAcZ[2])*0.0+feedGyroX[1]*30+(feedGyroX[1]-feedGyroX[2])*70; steps = (int) setpoint; if (steps >= sensormotor) speed=1; else speed = sensormotor/abs(steps); printf("%" PRId16 "\n",GyroX); j=0; } else{ j++; } if (j % speed == 0) stepM1(&steps); _delay_us(interval); } } // ISR(TIMER0_COMPA_vect){ // if ((TIFR1 | ~(1 << TOV1)) == 0){ // PORTA |= (1 << PA2); // TIFR1 |= (1 << TOV1); // }else{ // PORTA &= ~(1 << PA2); // } // //PORTC ^= (1 << PC0); // } // ISR(TIMER0_COMPB_vect){ // //PORTC ^= (1 << PC1); // } // ISR(TIMER1_COMPA_vect){ // //PORTC ^= (1 << PC2); // }