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: mbed-dev-f303 FastPWM3
Revision 3:6a0015d88d06, committed 2016-03-09
- Comitter:
- benkatz
- Date:
- Wed Mar 09 04:00:48 2016 +0000
- Parent:
- 2:8724412ad628
- Child:
- 4:c023f7b6f462
- Commit message:
- more motter;
Changed in this revision
--- a/CurrentRegulator/CurrentRegulator.cpp Fri Feb 19 04:13:06 2016 +0000 +++ b/CurrentRegulator/CurrentRegulator.cpp Wed Mar 09 04:00:48 2016 +0000 @@ -11,7 +11,7 @@ _Inverter = inverter; PWM = new SPWM(inverter, 2.0); _PositionSensor = position_sensor; - IQ_Ref = 5; + IQ_Ref = 1; ID_Ref = 0; V_Q = 0; V_D = 0;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ImpedanceController/ImpedanceController.cpp Wed Mar 09 04:00:48 2016 +0000 @@ -0,0 +1,2 @@ +#include "ImpedanceController.h" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ImpedanceController/ImpedanceController.h Wed Mar 09 04:00:48 2016 +0000 @@ -0,0 +1,11 @@ + + + +class ImpedanceController{ + public: + + + private: + float reference, K, B, output; //Referene position (rad), motor stiffness (N-m/rad), motor damping (N-m*s/rad), output(N-m) + + }; \ No newline at end of file
--- a/Inverter/Inverter.cpp Fri Feb 19 04:13:06 2016 +0000 +++ b/Inverter/Inverter.cpp Wed Mar 09 04:00:48 2016 +0000 @@ -39,18 +39,7 @@ TIM1->PSC = 0x0; // no prescaler, timer counts up in sync with the peripheral clock TIM1->ARR = 0x1194; // 20 Khz TIM1->CCER |= ~(TIM_CCER_CC1NP); //Interupt when low side is on. - TIM1->CR1 |= TIM_CR1_CEN; - - //NVIC->ISER[0] |= 1<< (TIM2_IRQn); // enable the TIM2 IRQ - //TIM2->DIER |= TIM_DIER_UIE; // enable update interrupt - //TIM2->CR1 |= TIM_CR1_ARPE; // autoreload on, - //TIM2->EGR |= TIM_EGR_UG; - //TIM2->PSC = 0x0; // no prescaler, timer counts up in sync with the peripheral clock - //TIM2->ARR = 0x8CA; // - //TIM2->CCER |= TIM_CCER_CC1NP; - //TIM1->CR1 &= ~(TIM_CR1_CEN); - //TIM1->CR1 |= TIM_CR1_CMS; - + TIM1->CR1 |= TIM_CR1_CEN; // ADC Setup RCC->APB2ENR |= RCC_APB2ENR_ADC2EN; // clock for ADC2
--- 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){
--- a/PositionSensor/PositionSensor.h Fri Feb 19 04:13:06 2016 +0000 +++ b/PositionSensor/PositionSensor.h Wed Mar 09 04:00:48 2016 +0000 @@ -13,6 +13,8 @@ PositionSensorEncoder(int CPR, float offset); virtual float GetMechPosition(); virtual float GetElecPosition(); + virtual float GetMechVelocity(); + virtual float GetElecVelocity(); private: InterruptIn *ZPulse; DigitalIn *ZSense; @@ -20,7 +22,7 @@ virtual void ZeroEncoderCount(void); int _CPR; //int state; - float _offset; + float _offset, MechPosition; }; #endif \ No newline at end of file
--- a/main.cpp Fri Feb 19 04:13:06 2016 +0000 +++ b/main.cpp Wed Mar 09 04:00:48 2016 +0000 @@ -42,6 +42,12 @@ void Loop(void){ foc.Commutate(); } + +void PrintStuff(void){ + float velocity = encoder.GetMechVelocity(); + float position = encoder.GetMechPosition(); + printf("%f, %f;\n\r", position, velocity); + } /* void voltage_foc(void){ theta = encoder.GetElecPosition() + offset; @@ -56,10 +62,12 @@ wait(1); testing.attach(&Loop, .0001); - //inverter.SetDTC(.2, .5, .97); + //testing.attach(&PrintStuff, .05); + //inverter.SetDTC(.1, 0, 0); //inverter.EnableInverter(); while(1) { - + //printf("%f\n\r", encoder.GetElecPosition()); + //wait(.1); } }