New class and code for part 4
This commit is contained in:
@@ -11,6 +11,8 @@ public:
|
|||||||
void forward();
|
void forward();
|
||||||
void reverse();
|
void reverse();
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
|
void set(double pwm);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef P_CONTROLLER_H
|
||||||
|
#define P_CONTROLLER_H
|
||||||
|
|
||||||
|
class P_controller
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
double Kp;
|
||||||
|
|
||||||
|
public:
|
||||||
|
P_controller(double Kp);
|
||||||
|
|
||||||
|
double update(double ref, double actual);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -12,3 +12,5 @@
|
|||||||
platform = atmelavr
|
platform = atmelavr
|
||||||
board = nanoatmega328new
|
board = nanoatmega328new
|
||||||
framework = arduino
|
framework = arduino
|
||||||
|
|
||||||
|
monitor_speed = 115200
|
||||||
+2
-1
@@ -1,4 +1,4 @@
|
|||||||
#include <avr/io.h>
|
/* #include <avr/io.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
@@ -76,3 +76,4 @@ int main() {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
+68
-7
@@ -16,7 +16,27 @@ void MotorDriver::begin()
|
|||||||
DDRD |= (1 << DDD3);
|
DDRD |= (1 << DDD3);
|
||||||
DDRB |= (1 << DDB3);
|
DDRB |= (1 << DDB3);
|
||||||
|
|
||||||
stop();
|
// 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -25,8 +45,11 @@ void MotorDriver::forward()
|
|||||||
// AIN1 / D3 = HIGH
|
// AIN1 / D3 = HIGH
|
||||||
// AIN2 / D11 = LOW
|
// AIN2 / D11 = LOW
|
||||||
|
|
||||||
PORTD |= (1 << PORTD3);
|
//PORTD |= (1 << PORTD3);
|
||||||
PORTB &= ~(1 << PORTB3);
|
//PORTB &= ~(1 << PORTB3);
|
||||||
|
|
||||||
|
OCR2A = 0;
|
||||||
|
OCR2B = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -35,8 +58,11 @@ void MotorDriver::reverse()
|
|||||||
// AIN1 / D3 = LOW
|
// AIN1 / D3 = LOW
|
||||||
// AIN2 / D11 = HIGH
|
// AIN2 / D11 = HIGH
|
||||||
|
|
||||||
PORTD &= ~(1 << PORTD3);
|
//PORTD &= ~(1 << PORTD3);
|
||||||
PORTB |= (1 << PORTB3);
|
//PORTB |= (1 << PORTB3);
|
||||||
|
|
||||||
|
OCR2B = 0;
|
||||||
|
OCR2A = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -44,6 +70,41 @@ void MotorDriver::stop()
|
|||||||
{
|
{
|
||||||
// Both LOW
|
// Both LOW
|
||||||
|
|
||||||
PORTD &= ~(1 << PORTD3);
|
//PORTD &= ~(1 << PORTD3);
|
||||||
PORTB &= ~(1 << PORTB3);
|
//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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#include "p_controller.h"
|
||||||
|
|
||||||
|
P_controller::P_controller(double Kp)
|
||||||
|
: Kp(Kp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
double P_controller::update(double ref, double actual)
|
||||||
|
{
|
||||||
|
double error = ref - actual;
|
||||||
|
|
||||||
|
return Kp * error;
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/* #include <Arduino.h>
|
||||||
|
|
||||||
|
#include "p_controller.h"
|
||||||
|
|
||||||
|
P_controller controller(2.0);
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
double result = controller.update(100.0, 70.0);
|
||||||
|
|
||||||
|
Serial.print("PWM = ");
|
||||||
|
Serial.println(result);
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} */
|
||||||
|
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
|
#include "motor_driver.h"
|
||||||
|
|
||||||
|
MotorDriver motor;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
|
||||||
|
motor.begin();
|
||||||
|
|
||||||
|
//_delay_ms(3000);
|
||||||
|
//motor.set(200);
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
motor.set(60);
|
||||||
|
_delay_ms(3000);
|
||||||
|
|
||||||
|
motor.set(120);
|
||||||
|
_delay_ms(3000);
|
||||||
|
|
||||||
|
motor.set(240);
|
||||||
|
_delay_ms(3000);
|
||||||
|
|
||||||
|
//motor.stop();
|
||||||
|
//_delay_ms(2000);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user