removed old project 3 folder
This commit is contained in:
@@ -1,19 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include "State.h"
|
|
||||||
|
|
||||||
class Idle : public State
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
uint32_t timer;
|
|
||||||
|
|
||||||
public:
|
|
||||||
void on_do() override;
|
|
||||||
void on_entry() override;
|
|
||||||
void on_exit() override;
|
|
||||||
// transisions from Initialization
|
|
||||||
|
|
||||||
void o_pressed() override;
|
|
||||||
//void preoperational() override;
|
|
||||||
};
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include "State.h"
|
|
||||||
|
|
||||||
class Operational : public State
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
uint32_t timer;
|
|
||||||
|
|
||||||
public:
|
|
||||||
void on_do() override;
|
|
||||||
void on_entry() override;
|
|
||||||
void on_exit() override;
|
|
||||||
|
|
||||||
void Reset() override;
|
|
||||||
};
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "State.h"
|
|
||||||
/**
|
|
||||||
* The Context defines the interface of interest to clients. It also maintains a
|
|
||||||
* reference to an instance of a State subclass, which represents the current
|
|
||||||
* state of the Context.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Context
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
State *state_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
Context(State *state);
|
|
||||||
~Context();
|
|
||||||
|
|
||||||
void transition_to(State *state);
|
|
||||||
|
|
||||||
void do_work();
|
|
||||||
|
|
||||||
void o_pressed();
|
|
||||||
void reset();
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#ifndef DIGITAL_IN_H
|
|
||||||
#define DIGITAL_IN_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
class Digital_in
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Digital_in(int pin);
|
|
||||||
|
|
||||||
void init();
|
|
||||||
|
|
||||||
bool is_hi();
|
|
||||||
bool is_lo();
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint8_t pinMask;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#ifndef DIGITAL_OUT_H
|
|
||||||
#define DIGITAL_OUT_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
class Digital_out
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Digital_out(int pin);
|
|
||||||
|
|
||||||
void init();
|
|
||||||
void set_hi();
|
|
||||||
void set_lo();
|
|
||||||
void toggle();
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint8_t pinMask;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
#ifndef ENCODER_H
|
|
||||||
#define ENCODER_H
|
|
||||||
|
|
||||||
#include <digital_in.h>
|
|
||||||
#include <digital_out.h>
|
|
||||||
|
|
||||||
class Encoder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Encoder(int c1Pin, int c2Pin, int ledPin);
|
|
||||||
|
|
||||||
void init();
|
|
||||||
void update();
|
|
||||||
int position();
|
|
||||||
int speed();
|
|
||||||
|
|
||||||
private:
|
|
||||||
Digital_in c1;
|
|
||||||
Digital_in c2;
|
|
||||||
Digital_out led;
|
|
||||||
|
|
||||||
bool previousC1;
|
|
||||||
volatile int count;
|
|
||||||
int pastCount;
|
|
||||||
uint32_t pastTime;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#ifndef P_CONTROLLER_H
|
|
||||||
#define P_CONTROLLER_H
|
|
||||||
|
|
||||||
class P_controller
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
P_controller(double kp);
|
|
||||||
double update(double ref, double actual);
|
|
||||||
|
|
||||||
private:
|
|
||||||
double kp;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
class Context;
|
|
||||||
|
|
||||||
class State
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
Context *context_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual ~State()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_context(Context *context)
|
|
||||||
{
|
|
||||||
this->context_ = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void on_do() = 0;
|
|
||||||
virtual void on_entry() = 0;
|
|
||||||
virtual void on_exit() = 0;
|
|
||||||
|
|
||||||
|
|
||||||
//initialize transisions
|
|
||||||
virtual void reset()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void o_pressed()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
|
|
||||||
This directory is intended for project specific (private) libraries.
|
|
||||||
PlatformIO will compile them to static libraries and link into the executable file.
|
|
||||||
|
|
||||||
The source code of each library should be placed in a separate directory
|
|
||||||
("lib/your_library_name/[Code]").
|
|
||||||
|
|
||||||
For example, see the structure of the following example libraries `Foo` and `Bar`:
|
|
||||||
|
|
||||||
|--lib
|
|
||||||
| |
|
|
||||||
| |--Bar
|
|
||||||
| | |--docs
|
|
||||||
| | |--examples
|
|
||||||
| | |--src
|
|
||||||
| | |- Bar.c
|
|
||||||
| | |- Bar.h
|
|
||||||
| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
|
|
||||||
| |
|
|
||||||
| |--Foo
|
|
||||||
| | |- Foo.c
|
|
||||||
| | |- Foo.h
|
|
||||||
| |
|
|
||||||
| |- README --> THIS FILE
|
|
||||||
|
|
|
||||||
|- platformio.ini
|
|
||||||
|--src
|
|
||||||
|- main.c
|
|
||||||
|
|
||||||
Example contents of `src/main.c` using Foo and Bar:
|
|
||||||
```
|
|
||||||
#include <Foo.h>
|
|
||||||
#include <Bar.h>
|
|
||||||
|
|
||||||
int main (void)
|
|
||||||
{
|
|
||||||
...
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
The PlatformIO Library Dependency Finder will find automatically dependent
|
|
||||||
libraries by scanning project source files.
|
|
||||||
|
|
||||||
More information about PlatformIO Library Dependency Finder
|
|
||||||
- https://docs.platformio.org/page/librarymanager/ldf.html
|
|
||||||
-27
@@ -1,27 +0,0 @@
|
|||||||
@startuml
|
|
||||||
|
|
||||||
'Start at initialization
|
|
||||||
[*]--> Initialization
|
|
||||||
|
|
||||||
'states'
|
|
||||||
Initialization: entry / initialize internal parameters
|
|
||||||
|
|
||||||
Operational: entry / Turn on Led
|
|
||||||
Operational: do / normal input-output behavior
|
|
||||||
Operational: exit / stop operations
|
|
||||||
|
|
||||||
'- state changes -
|
|
||||||
Initialization -> Operational: "o" pressed
|
|
||||||
Initialization <- Operational: reset / "r" pressed
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
'Idle -> Cooling: too hot
|
|
||||||
'Idle -> Heating: too cool [restart time >= 5 mins]
|
|
||||||
|
|
||||||
'Cooling -> Idle: ok
|
|
||||||
'Cooling -> Failure : failure
|
|
||||||
|
|
||||||
|
|
||||||
@enduml
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
; PlatformIO Project Configuration File
|
|
||||||
;
|
|
||||||
; Build options: build flags, source filter
|
|
||||||
; Upload options: custom upload port, speed and extra flags
|
|
||||||
; Library options: dependencies, extra library storages
|
|
||||||
; Advanced options: extra scripting
|
|
||||||
;
|
|
||||||
; Please visit documentation for the other options and examples
|
|
||||||
; https://docs.platformio.org/page/projectconf.html
|
|
||||||
|
|
||||||
[env:nanoatmega328new]
|
|
||||||
platform = atmelavr
|
|
||||||
board = nanoatmega328new
|
|
||||||
framework = arduino
|
|
||||||
monitor_speed = 115200
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
#include "Initialization.h"
|
|
||||||
#include "Context.h"
|
|
||||||
|
|
||||||
// include things that will transition to
|
|
||||||
//#include "Operational.h"
|
|
||||||
//#include "PreOperational.h"
|
|
||||||
|
|
||||||
//const uint32_t restart_time = 10000; // 300000 = 5 minutes
|
|
||||||
|
|
||||||
// initialization setup
|
|
||||||
void Initialization::on_entry()
|
|
||||||
{
|
|
||||||
Serial.println("Now Initialization");
|
|
||||||
|
|
||||||
// initialize parameters here
|
|
||||||
|
|
||||||
Serial.println("Boot-up")
|
|
||||||
//timer = millis();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Initialization::on_do()
|
|
||||||
{
|
|
||||||
//if (millis() - timer >= restart_time)
|
|
||||||
//{
|
|
||||||
// too_cold();
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Initialization::on_exit()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// special transistions
|
|
||||||
void Initialization::o_pressed()
|
|
||||||
{
|
|
||||||
Serial.println(""O" pressed");
|
|
||||||
|
|
||||||
this->context_->transition_to(new Operational);
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#include "Operational.h"
|
|
||||||
#include "Context.h"
|
|
||||||
#include "Initialization.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Operational::on_entry()
|
|
||||||
{
|
|
||||||
Serial.println("Operational Startup");
|
|
||||||
|
|
||||||
timer = millis();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Operational::on_do()
|
|
||||||
{
|
|
||||||
// Automatically go to Idle after 2 seconds
|
|
||||||
if (millis() - timer >= 2000)
|
|
||||||
{
|
|
||||||
Serial.println("2s elapsed");
|
|
||||||
|
|
||||||
this->context_->transition_to(new Idle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Operational::on_exit()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void Operational::Reset()
|
|
||||||
{
|
|
||||||
Serial.println("Reset / "r" pressed");
|
|
||||||
|
|
||||||
this->context_->transition_to(new Reset);
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#include "Context.h"
|
|
||||||
|
|
||||||
Context::Context(State *state) : state_(nullptr)
|
|
||||||
{
|
|
||||||
this->transition_to(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
Context::~Context()
|
|
||||||
{
|
|
||||||
delete state_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Context::transition_to(State *state)
|
|
||||||
{
|
|
||||||
if (this->state_ != nullptr)
|
|
||||||
{
|
|
||||||
this->state_->on_exit();
|
|
||||||
delete this->state_;
|
|
||||||
}
|
|
||||||
|
|
||||||
this->state_ = state;
|
|
||||||
|
|
||||||
this->state_->set_context(this);
|
|
||||||
|
|
||||||
this->state_->on_entry();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Context::reset()
|
|
||||||
{
|
|
||||||
this->state_->Initialization();
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#include <digital_in.h>
|
|
||||||
#include <avr/io.h>
|
|
||||||
|
|
||||||
Digital_in::Digital_in(int pin)
|
|
||||||
{
|
|
||||||
pinMask = static_cast<uint8_t>(1U << pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Digital_in::init()
|
|
||||||
{
|
|
||||||
// Configure pin as input
|
|
||||||
DDRB &= static_cast<uint8_t>(~pinMask);
|
|
||||||
|
|
||||||
// Enable internal pull-up resistor
|
|
||||||
PORTB |= pinMask;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Digital_in::is_hi()
|
|
||||||
{
|
|
||||||
return (PINB & pinMask) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Digital_in::is_lo()
|
|
||||||
{
|
|
||||||
return (PINB & pinMask) == 0;
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
#include <digital_out.h>
|
|
||||||
#include <avr/io.h>
|
|
||||||
|
|
||||||
Digital_out::Digital_out(int pin)
|
|
||||||
{
|
|
||||||
pinMask = static_cast<uint8_t>(1U << pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Digital_out::init()
|
|
||||||
{
|
|
||||||
DDRB |= pinMask;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Digital_out::set_hi()
|
|
||||||
{
|
|
||||||
PORTB |= pinMask;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Digital_out::set_lo()
|
|
||||||
{
|
|
||||||
PORTB &= static_cast<uint8_t>(~pinMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Digital_out::toggle()
|
|
||||||
{
|
|
||||||
PORTB ^= pinMask;
|
|
||||||
}
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
#include <encoder.h>
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <avr/io.h>
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
|
|
||||||
static Encoder* activeEncoder = nullptr;
|
|
||||||
|
|
||||||
ISR(PCINT0_vect)
|
|
||||||
{
|
|
||||||
if (activeEncoder != nullptr)
|
|
||||||
{
|
|
||||||
activeEncoder->update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Encoder::Encoder(int c1Pin, int c2Pin, int ledPin)
|
|
||||||
: c1(c1Pin), c2(c2Pin), led(ledPin),
|
|
||||||
previousC1(false), count(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void Encoder::init()
|
|
||||||
{
|
|
||||||
c1.init();
|
|
||||||
c2.init();
|
|
||||||
led.init();
|
|
||||||
|
|
||||||
led.set_lo();
|
|
||||||
|
|
||||||
activeEncoder = this;
|
|
||||||
|
|
||||||
// Clear any pending PORTB pin-change interrupt
|
|
||||||
PCIFR |= (1 << PCIF0);
|
|
||||||
|
|
||||||
// Enable pin-change interrupts for PORTB
|
|
||||||
PCICR |= (1 << PCIE0);
|
|
||||||
|
|
||||||
// Enable interrupt specifically for PB3 / D8 / C1
|
|
||||||
PCMSK0 |= (1 << PCINT0);
|
|
||||||
|
|
||||||
|
|
||||||
//capture baseline
|
|
||||||
previousC1 = c1.is_hi();
|
|
||||||
count = 0;
|
|
||||||
|
|
||||||
// Enable global interrupts
|
|
||||||
sei();
|
|
||||||
|
|
||||||
// Set initial states for speed
|
|
||||||
pastCount = count;
|
|
||||||
pastTime = micros();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Encoder::update()
|
|
||||||
{
|
|
||||||
led.set_lo();
|
|
||||||
|
|
||||||
bool currentC1 = c1.is_hi();
|
|
||||||
|
|
||||||
if (currentC1 != previousC1)
|
|
||||||
{
|
|
||||||
bool currentC2 = c2.is_hi();
|
|
||||||
|
|
||||||
if (currentC1 == currentC2)
|
|
||||||
{
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
count--;
|
|
||||||
}
|
|
||||||
|
|
||||||
previousC1 = currentC1;
|
|
||||||
|
|
||||||
led.set_hi();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int Encoder::position()
|
|
||||||
{
|
|
||||||
uint8_t oldSREG = SREG;
|
|
||||||
|
|
||||||
cli();
|
|
||||||
int currentCount = count;
|
|
||||||
SREG = oldSREG;
|
|
||||||
|
|
||||||
return currentCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int Encoder::speed()
|
|
||||||
{
|
|
||||||
int currentCount = position();
|
|
||||||
uint32_t currentTime = micros(); //gives arduino microseconds since program started running
|
|
||||||
|
|
||||||
//from spec sheet we get 1400 counts per revolution from driver
|
|
||||||
// or from assignment 1: 2100
|
|
||||||
int rpm = ((currentCount-pastCount)*6e7)/((currentTime-pastTime)*2100); // we turn counts to rotations by dividing by 1400 and microsecond to minutes by multiplying with 60 and 10^6
|
|
||||||
|
|
||||||
pastTime = currentTime;
|
|
||||||
pastCount = currentCount;
|
|
||||||
|
|
||||||
return rpm;
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
// State Behaviour based on the C++ example at Refactoring Guru
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
|
|
||||||
#include "Context.h"
|
|
||||||
#include "Initialization.h"
|
|
||||||
|
|
||||||
Context *context;
|
|
||||||
|
|
||||||
void setup()
|
|
||||||
{
|
|
||||||
Serial.begin(9600);
|
|
||||||
sei();
|
|
||||||
|
|
||||||
// Start the state machine in Idle
|
|
||||||
context = new Context(new Idle);
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop()
|
|
||||||
{
|
|
||||||
int c = 0;
|
|
||||||
|
|
||||||
if (Serial.available() > 0)
|
|
||||||
{
|
|
||||||
c = Serial.read();
|
|
||||||
|
|
||||||
Serial.print("I received: ");
|
|
||||||
Serial.println(c, DEC);
|
|
||||||
|
|
||||||
if (c == 'o')
|
|
||||||
{
|
|
||||||
// Initializing -> operational
|
|
||||||
context->o_pressed();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c == 'r')
|
|
||||||
{
|
|
||||||
// operational -> initializing
|
|
||||||
context->reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run the behavior of the current state
|
|
||||||
context->do_work();
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#include <p_controller.h>
|
|
||||||
|
|
||||||
P_controller::P_controller(double kp)
|
|
||||||
: kp(kp)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
double P_controller::update(double ref, double actual)
|
|
||||||
{
|
|
||||||
return kp * (ref - actual);
|
|
||||||
}
|
|
||||||
-177
@@ -1,177 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <avr/io.h>
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
|
|
||||||
#include <encoder.h>
|
|
||||||
#include <p_controller.h>
|
|
||||||
|
|
||||||
Encoder encoder(0, 1, 5);
|
|
||||||
P_controller controller(40.0);
|
|
||||||
|
|
||||||
volatile bool updateFlag = false;
|
|
||||||
|
|
||||||
ISR(TIMER1_COMPA_vect)
|
|
||||||
{
|
|
||||||
updateFlag = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
|
|
||||||
encoder.init();
|
|
||||||
|
|
||||||
Serial.begin(115200);
|
|
||||||
|
|
||||||
// D11 / PB3 -> AIN1
|
|
||||||
DDRB |= (1 << PB3);
|
|
||||||
PORTB &= ~(1 << PB3);
|
|
||||||
|
|
||||||
// D3 / PD3 / OC2B -> AIN2 PWM
|
|
||||||
DDRD |= (1 << PD3);
|
|
||||||
|
|
||||||
// Timer1: 250 Hz
|
|
||||||
TCCR1A = 0;
|
|
||||||
TCCR1B = 0;
|
|
||||||
TCNT1 = 0;
|
|
||||||
|
|
||||||
OCR1A = 999;
|
|
||||||
|
|
||||||
TCCR1B |= (1 << WGM12);
|
|
||||||
TCCR1B |= (1 << CS11) | (1 << CS10);
|
|
||||||
|
|
||||||
TIMSK1 |= (1 << OCIE1A);
|
|
||||||
|
|
||||||
// Timer2: 7.8 kHz PWM
|
|
||||||
TCCR2A = 0;
|
|
||||||
TCCR2B = 0;
|
|
||||||
TCNT2 = 0;
|
|
||||||
|
|
||||||
OCR2B = 0;
|
|
||||||
|
|
||||||
TCCR2A =
|
|
||||||
(1 << COM2B1) |
|
|
||||||
(1 << WGM21) |
|
|
||||||
(1 << WGM20);
|
|
||||||
|
|
||||||
TCCR2B = (1 << CS21);
|
|
||||||
|
|
||||||
sei();
|
|
||||||
|
|
||||||
Serial.println("Load test starting in 2 seconds...");
|
|
||||||
|
|
||||||
uint16_t waitCount = 0;
|
|
||||||
|
|
||||||
while (waitCount < 500)
|
|
||||||
{
|
|
||||||
if (updateFlag)
|
|
||||||
{
|
|
||||||
updateFlag = false;
|
|
||||||
waitCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int previousCount = encoder.position();
|
|
||||||
|
|
||||||
int countHistory[10] = {0};
|
|
||||||
int rollingCounts = 0;
|
|
||||||
|
|
||||||
uint8_t historyIndex = 0;
|
|
||||||
uint8_t samplesFilled = 0;
|
|
||||||
|
|
||||||
uint32_t updateCount = 0;
|
|
||||||
|
|
||||||
const double reference = 50.0;
|
|
||||||
|
|
||||||
Serial.println("time_ms,reference_rpm,actual_rpm,pwm");
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
if (updateFlag)
|
|
||||||
{
|
|
||||||
updateFlag = false;
|
|
||||||
updateCount++;
|
|
||||||
|
|
||||||
uint32_t time_ms = updateCount * 4;
|
|
||||||
|
|
||||||
int currentCount = encoder.position();
|
|
||||||
|
|
||||||
int deltaCount = currentCount - previousCount;
|
|
||||||
previousCount = currentCount;
|
|
||||||
|
|
||||||
rollingCounts -= countHistory[historyIndex];
|
|
||||||
|
|
||||||
countHistory[historyIndex] = deltaCount;
|
|
||||||
rollingCounts += deltaCount;
|
|
||||||
|
|
||||||
historyIndex++;
|
|
||||||
|
|
||||||
if (historyIndex >= 10)
|
|
||||||
{
|
|
||||||
historyIndex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (samplesFilled < 10)
|
|
||||||
{
|
|
||||||
samplesFilled++;
|
|
||||||
}
|
|
||||||
|
|
||||||
double windowTime = samplesFilled * 0.004;
|
|
||||||
|
|
||||||
double rpm =
|
|
||||||
(rollingCounts * 60.0) /
|
|
||||||
(2100.0 * windowTime);
|
|
||||||
|
|
||||||
double output =
|
|
||||||
controller.update(reference, rpm);
|
|
||||||
|
|
||||||
if (output < 0.0)
|
|
||||||
{
|
|
||||||
output = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (output > 255.0)
|
|
||||||
{
|
|
||||||
output = 255.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t pwm = (uint8_t)output;
|
|
||||||
|
|
||||||
OCR2B = pwm;
|
|
||||||
|
|
||||||
if ((updateCount % 10) == 0)
|
|
||||||
{
|
|
||||||
Serial.print(time_ms);
|
|
||||||
Serial.print(",");
|
|
||||||
|
|
||||||
Serial.print(reference);
|
|
||||||
Serial.print(",");
|
|
||||||
|
|
||||||
Serial.print(rpm);
|
|
||||||
Serial.print(",");
|
|
||||||
|
|
||||||
Serial.println(pwm);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (time_ms >= 10000)
|
|
||||||
{
|
|
||||||
OCR2B = 0;
|
|
||||||
|
|
||||||
Serial.println("TEST COMPLETE");
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
Reference in New Issue
Block a user