Motacon_20200317
Dependents: HelloWorld_MotorKaisei
BLDCmotorDriver.cpp
- Committer:
- mslovic
- Date:
- 2015-05-22
- Revision:
- 0:5602fba2a7f7
- Child:
- 1:786897114846
- Child:
- 2:7aae78b85e1d
File content as of revision 0:5602fba2a7f7:
#include "BLDCmotorDriver.h" BLDCmotorDriver::BLDCmotorDriver(PinName gh_a, PinName gl_a, PinName gh_b, PinName gl_b, PinName gh_c, PinName gl_c, PinName h1, PinName h2, PinName h3, PinName led1) : GH_A(gh_a), GL_A(gl_a), GH_B(gh_b), GL_B(gl_b), GH_C(gh_c), GL_C(gl_c), H1(h1), H2(h2), H3(h3), Led1(led1) { sampleTime = 1e-3; switchingPeriod = 1.0 / 20e3; dutyCycle = tempDutyCycle = 0; GH_A.period(switchingPeriod); // applies to all PwmOut instances rl.setLimits(0.1, -0.1, 0, sampleTime); // initial 10 second ramp } void BLDCmotorDriver::configure(float sampleTime, float switchingFrequency, float rampUpSlope, float rampDownSlope) { if (sampleTime < 1e-6) sampleTime = 1e-3; if (switchingFrequency < 100) switchingFrequency = 20e3; if (rampUpSlope < 0 || rampUpSlope > 1) rampUpSlope = 0.1; if (rampDownSlope > 0 || rampDownSlope < -1) rampDownSlope = -0.1; this->sampleTime = sampleTime; switchingPeriod = 1.0 / switchingFrequency; rl.setLimits(rampUpSlope, rampDownSlope, 0, sampleTime); } int BLDCmotorDriver::HallRead(){ // hall 120° if(H1.read()== 1 && H2.read()== 0 && H3.read()== 0) sektor = 1; else if(H1.read()== 1 && H2.read()== 1 && H3.read()== 0) sektor = 2; else if(H1.read()== 0 && H2.read()== 1 && H3.read()== 0) sektor = 3; else if(H1.read()== 0 && H2.read()== 1 && H3.read()== 1) sektor = 4; else if(H1.read()== 0 && H2.read()== 0 && H3.read()== 1) sektor = 5; else if(H1.read()== 1 && H2.read()== 0 && H3.read()== 1) sektor = 6; else Led1 = 1; return sektor; } void BLDCmotorDriver::komutacijaBLDC() { dutyCycle = rl.out(tempDutyCycle); sektor = HallRead(); if (dutyCycle > 0) { if (sektor > 6) sektor = 1; sektor++; switch(sektor) { case 1: //100 GH_A = dutyCycle; GL_A = 0; GH_B = 0; GL_B = 0; GH_C = 0; GL_C = 1; break; case 2: //110 GH_A = dutyCycle; GL_A = 0; GH_B = 0; GL_B = 1; GH_C = 0; GL_C = 0; break; case 3: //010 GH_A = 0; GL_A = 0; GH_B = 0; GL_B = 1; GH_C = dutyCycle; GL_C = 0; break; case 4: //011 GH_A = 0; GL_A = 1; GH_B = 0; GL_B = 0; GH_C = dutyCycle; GL_C = 0; break; case 5: //001 GH_A = 0; GL_A = 1; GH_B = dutyCycle; GL_B = 0; GH_C = 0; GL_C = 0; break; case 6: //101 GH_A = 0; GL_A = 0; GH_B = dutyCycle; GL_B = 0; GH_C = 0; GL_C = 1; break; } } else if (dutyCycle < 0) { // if (sektor < 1) sektor = 6; sektor--; switch(sektor) { case 1: //100 GH_A = dutyCycle; GL_A = 0; GH_B = 0; GL_B = 0; GH_C = 0; GL_C = 1; break; case 2: //110 GH_A = dutyCycle; GL_A = 0; GH_B = 0; GL_B = 1; GH_C = 0; GL_C = 0; break; case 3: //010 GH_A = 0; GL_A = 0; GH_B = 0; GL_B = 1; GH_C = dutyCycle; GL_C = 0; break; case 4: //011 GH_A = 0; GL_A = 1; GH_B = 0; GL_B = 0; GH_C = dutyCycle; GL_C = 0; break; case 5: //001 GH_A = 0; GL_A = 1; GH_B = dutyCycle; GL_B = 0; GH_C = 0; GL_C = 0; break; case 6: //101 GH_A = 0; GL_A = 0; GH_B = dutyCycle; GL_B = 0; GH_C = 0; GL_C = 1; break; } }else { coast(); } } void BLDCmotorDriver::setDutyCycle(float dc) { if (dc >= -1 && dc <= 1) { ticker.attach(this, &BLDCmotorDriver::komutacijaBLDC, sampleTime); tempDutyCycle = dc; } else { coast(); } } void BLDCmotorDriver::coast() { GH_A = 0; GL_A = 0; GH_B = 0; GL_B = 0; GH_C = 0; GL_C = 0; dutyCycle = tempDutyCycle = 0; rl.reset(); ticker.detach(); } float BLDCmotorDriver::getDutyCycle() { return dutyCycle; }