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.
Diff: PositionSensor/PositionSensor.cpp
- Revision:
- 3:6a0015d88d06
- Parent:
- 1:b8bceb4daed5
- Child:
- 5:51c6560bf624
diff -r 8724412ad628 -r 6a0015d88d06 PositionSensor/PositionSensor.cpp
--- a/PositionSensor/PositionSensor.cpp Fri Feb 19 04:13:06 2016 +0000
+++ b/PositionSensor/PositionSensor.cpp Wed Mar 09 04:00:48 2016 +0000
@@ -3,11 +3,11 @@
#include "PositionSensor.h"
#include <math.h>
-
PositionSensorEncoder::PositionSensorEncoder(int CPR, float offset) {
_CPR = CPR;
_offset = offset;
+ MechPosition = 0;
// Enable clock for GPIOA
__GPIOA_CLK_ENABLE(); //equivalent from hal_rcc.h
@@ -33,6 +33,26 @@
TIM3->CNT = 0x8000; //reset the counter before we use it
+ // Extra Timer for velocity measurement
+ /*
+ __TIM2_CLK_ENABLE();
+ TIM3->CR2 = 0x030; //MMS = 101
+
+ TIM2->PSC = 0x03;
+ //TIM2->CR2 |= TIM_CR2_TI1S;
+ TIM2->SMCR = 0x24; //TS = 010 for ITR2, SMS = 100 (reset counter at edge)
+ TIM2->CCMR1 = 0x3;// CC1S = 11, IC1 mapped on TRC
+
+ //TIM2->CR2 |= TIM_CR2_TI1S;
+ TIM2->CCER |= TIM_CCER_CC1P;
+ //TIM2->CCER |= TIM_CCER_CC1NP;
+ TIM2->CCER |= TIM_CCER_CC1E;
+
+
+ TIM2->CR1 = 0x01; //CEN
+ */
+ TIM3->CR1 = 0x01; // CEN
+
ZPulse = new InterruptIn(PB_0);
ZSense = new DigitalIn(PB_0);
ZPulse->enable_irq();
@@ -50,14 +70,20 @@
int raw = TIM3->CNT-0x8000;
if (raw < 0) raw += _CPR;
if (raw >= _CPR) raw -= _CPR;
- return 6.28318530718f*(raw)/(float)_CPR + _offset;
+ float signed_mech = fmod(((6.28318530718f*(raw)/(float)_CPR + _offset)), 6.28318530718f); //7 pole pairs
+ if (signed_mech < 0){
+ return signed_mech + 6.28318530718f;
+ }
+ else{
+ return signed_mech;
+ }
}
float PositionSensorEncoder::GetElecPosition() { //returns rotor electrical angle in radians.
int raw = TIM3->CNT-0x8000;
if (raw < 0) raw += _CPR;
if (raw >= _CPR) raw -= _CPR;
- float signed_elec = fmod((7.0f*(6.28318530718f*(raw)/(float)_CPR + _offset)), 6.28318530718f);
+ float signed_elec = fmod((7.0f*(6.28318530718f*(raw)/(float)_CPR + _offset)), 6.28318530718f); //7 pole pairs
//float signed_elec = (7*(6.28318530718*(TIM3->CNT-0x8000)/(float)_CPR + _offset));
if (signed_elec < 0){
return signed_elec + 6.28318530718f;
@@ -67,6 +93,19 @@
}
}
+float PositionSensorEncoder::GetElecVelocity(){
+ float rawPeriod = TIM2->CCR1; //Clock Ticks
+ float dir = (((TIM3->CR1)>>4)&1)*2-1; // +/- 1
+ return dir*7*90000000.0f*(6.28318530718f/(float)_CPR)/rawPeriod;
+ }
+
+float PositionSensorEncoder::GetMechVelocity(){
+ float rawPeriod = TIM2->CCR1; //Clock Ticks
+ float dir = -2.0f*(float)(((TIM3->CR1)>>4)&1)+1.0f; // +/- 1
+ return dir*90000000.0f*(6.28318530718f/(float)_CPR)/rawPeriod;
+
+ }
+
void PositionSensorEncoder::ZeroEncoderCount(void){
if (ZSense->read() == 1){
if (ZSense->read() == 1){