#include "motor_driver.h" #include MotorDriver::MotorDriver() { } void MotorDriver::begin() { // Arduino D3 = PD3 = AIN1 // Arduino D11 = PB3 = AIN2 DDRD |= (1 << DDD3); DDRB |= (1 << DDB3); // Timer2 Fast PWM TCCR2A = 0; TCCR2B = 0; // Fast PWM mode TCCR2A |= (1 << WGM20); TCCR2A |= (1 << WGM21); // Non-inverting PWM on OC2A and OC2B TCCR2A |= (1 << COM2A1); TCCR2A |= (1 << COM2B1); // Timer2 prescaler = 32 TCCR2B |= (1 << CS21); TCCR2B |= (1 << CS20); OCR2A = 0; OCR2B = 0; //stop(); } void MotorDriver::forward() { // AIN1 / D3 = HIGH // AIN2 / D11 = LOW //PORTD |= (1 << PORTD3); //PORTB &= ~(1 << PORTB3); OCR2A = 0; OCR2B = 255; } void MotorDriver::reverse() { // AIN1 / D3 = LOW // AIN2 / D11 = HIGH //PORTD &= ~(1 << PORTD3); //PORTB |= (1 << PORTB3); OCR2B = 0; OCR2A = 255; } void MotorDriver::stop() { // Both LOW //PORTD &= ~(1 << PORTD3); //PORTB &= ~(1 << PORTB3); OCR2A = 0; OCR2B = 0; } void MotorDriver::set(double pwm) { // Limit PWM command if (pwm > 255.0) { pwm = 255.0; } if (pwm < -255.0) { pwm = -255.0; } if (pwm > 0) { // Forward OCR2A = 0; OCR2B = (uint8_t)pwm; } else if (pwm < 0) { // Reverse OCR2B = 0; OCR2A = (uint8_t)(-pwm); } else { stop(); } }