Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: HIDScope QEI biquadFilter mbed
main.cpp
- Committer:
- ekiliptiay
- Date:
- 2018-10-18
- Revision:
- 3:659998b2bee1
- Parent:
- 2:93918cad51dd
- Child:
- 4:6dec99ee29e6
File content as of revision 3:659998b2bee1:
#include "mbed.h"
#include "math.h"
#include "QEI.h"
#include "HIDScope.h"
HIDScope scope(3);
AnalogIn pot1(A2); // Controls potentiometer 1, which controls motor 1
AnalogIn pot2(A3); // Controls potentiometer 2, which is used to control Kp (position gain)
InterruptIn button1(D0);
InterruptIn motor1A(D13); // Encoder 1a
InterruptIn motor1B(D12); // Encoder 1b
QEI Encoder1(D12,D13,NC,64); // Note that we use X2 encoding, so there are 4200 counts/rotation, as opposed to 8400 from the documentation.
DigitalOut directionpin1(D7);
PwmOut pwmpin1(D6);
Serial pc(USBTX, USBRX); // tx, rx
Ticker Motor1;
double GetReferencePosition(){
// Returns the wanted reference position
const int CpR = 4200; //Counts Per Revolution; when the counts i 4200, 1 revolution has been made. (Using X2 encoding)
double ReferencePosition = CpR*pot1; // Returns a value between 0 and 4200, the wanted rotation.
return ReferencePosition;
}
double GetActualPosition(){
double ActualPosition = -Encoder1.getPulses(); // Gets the actual amount of counts from motor 1. Note the minus sign for convention (CCW = positive counts.)
return ActualPosition;
}
double P_controller(double error){
double Kp = pot2*17+1;
double u_k = Kp*error; // Proportional part
// Sum all parts and return it
return u_k;
}
void SetMotor1(double motorValue){
// Given -1<=motorValue<=1, this sets the PWM and direction
// bits for motor 1. Positive value makes motor rotating
// clockwise. motorValues outside range are truncated to
// within range
if (motorValue >=0) directionpin1=1;
else directionpin1=0;
if (fabs(motorValue)>1) pwmpin1 = 1;
else pwmpin1 = fabs(motorValue);
}
void ScopeData(){
scope.set(0,pot1*4200); // Wanted amount of counts
scope.set(1,-Encoder1.getPulses()); // Amount of counts of motor 1
scope.set(2,pwmpin1); // Current pwm-value send to motor 1
scope.send(); // send what's in scope memory to PC
}
void MeasureAndControl(void){
// This function determines the desired velocity, measures the
// actual velocity, and controls the motor with
// a simple Feedback controller. Call this from a Ticker.
float ReferencePosition = GetReferencePosition();
float ActualPosition = GetActualPosition();
float motorValue = P_controller(ReferencePosition - ActualPosition);
SetMotor1(motorValue);
ScopeData();
}
int main(){
pwmpin1.period_us(60);
// Motor1.attach(&MeasureAndControl, 0.01);
while(1){
float ReferencePosition = GetReferencePosition();
float ActualPosition = GetActualPosition();
float motorValue = P_controller(ReferencePosition - ActualPosition);
SetMotor1(motorValue);
ScopeData();
wait(0.01f);
}
}