diff --git a/Source/ADC.cpp b/Source/ADC.cpp index b7a09de..b2a80b0 100644 --- a/Source/ADC.cpp +++ b/Source/ADC.cpp @@ -64,8 +64,11 @@ extern "C" void DMA1_Channel1_IRQHandler(void) /* DMA1 Channel 1 namespace ElektronischeLast { - iADC::iADC(void) + iADC::iADC(float voltage_gain, float current_gain) { + this->voltage_gain = voltage_gain; + this->current_gain = current_gain; + /**ADC1 GPIO Configuration PA0 ------> ADC1_IN0 PA1 ------> ADC1_IN1 @@ -222,7 +225,7 @@ namespace ElektronischeLast */ std::uint32_t iADC::get_current(void) { - const float factor = 3.3f / 4096.0f * 1000.0f * 4.0f / 1.08f; + const float factor = 3.3f / 4096.0f * 1000.0f * this->current_gain; return factor * current; } /** @@ -242,8 +245,21 @@ namespace ElektronischeLast * @return Spannung in mV */ std::uint32_t iADC::get_voltage(void) - { //22,48484848484 - const float factor = /*(100000.0f + 4700.0f) / 4700.0f*/22.484848484848f * 3.3f / 4096.0f * 1000.0f; + { + const float factor = this->voltage_gain * 3.3f / 4096.0f * 1000.0f; return factor * voltage; } + std::uint32_t iADC::get_current_raw(void) + { + return current; + } + + std::uint32_t iADC::get_temperature_raw(void) + { + return temperature; + } + std::uint32_t iADC::get_voltage_raw(void) + { + return voltage; + } } diff --git a/Source/ADC.hpp b/Source/ADC.hpp index 646c536..cbb3219 100644 --- a/Source/ADC.hpp +++ b/Source/ADC.hpp @@ -15,12 +15,17 @@ namespace ElektronischeLast class iADC { public: - iADC(void); + iADC(float voltage_gain, float current_gain); ~iADC(void); std::uint32_t get_current(void); std::uint32_t get_temperature(void); std::uint32_t get_voltage(void); + std::uint32_t get_current_raw(void); + std::uint32_t get_temperature_raw(void); + std::uint32_t get_voltage_raw(void); private: + float voltage_gain; + float current_gain; }; } diff --git a/Source/ElektronischeLast.cpp b/Source/ElektronischeLast.cpp index 0550f31..71489f4 100644 --- a/Source/ElektronischeLast.cpp +++ b/Source/ElektronischeLast.cpp @@ -21,15 +21,22 @@ using namespace ElektronischeLast; +static void do_icall(iADC& adc); +static void do_ucall(iADC& dac); + uint16_t set_solltrom (CLI_OutFunction pfvOutFunction, char *acCommands[], uint16_t u16ArgCount); uint16_t set_dutyCyle (CLI_OutFunction pfvOutFunction, char *acCommands[], uint16_t u16ArgCount); uint16_t ist_werte(CLI_OutFunction pfvOutFunction, char *acCommands[], uint16_t u16ArgCount); +uint16_t set_ucall(CLI_OutFunction pfvOutFunction, char *acCommands[], uint16_t u16ArgCount); +uint16_t set_icall(CLI_OutFunction pfvOutFunction, char *acCommands[], uint16_t u16ArgCount); static CLI_Command_t commands[] = { { "isoll", "Zielstrom für Last", set_solltrom }, { "ist", "Zeige Istwerte an [-r für wiederholende Anzeige]", ist_werte }, { "fan", "Setze Tastverhältnis für Lüfter", set_dutyCyle }, + { "icall", "Starte Strom Kalibrierung", set_icall }, + { "ucall", "Starte Spannungs Kalibrierung", set_ucall } }; static std::uint32_t i_soll = 0U; @@ -49,6 +56,7 @@ static uint32_t strom; static uint32_t spannung; static uint32_t temperatur; static uint32_t geschwindigkeit; +static enum { normal, icall, ucall } modus; int main (void) { @@ -57,7 +65,7 @@ int main (void) CLI_Init(commands, sizeof(commands)/sizeof(commands[0])); LED led = LED(500U); iDAC dac = iDAC(); - iADC adc = iADC(); + iADC adc = iADC(22.272125f, 3.685331f); FanControl fan = FanControl(); std::uint32_t last_tick = systick; @@ -73,16 +81,27 @@ int main (void) if(last_tick != systick) { last_tick = systick; - dac_value = (uint32_t)PIDController_Update(&pid, i_soll, adc.get_current()); - dac.write(iDAC::CHANNEL_1, dac_value); + switch(modus) + { + case icall: + do_icall(adc); + break; + case ucall: + do_ucall(adc); + break; + case normal: + default: + dac_value = (uint32_t)PIDController_Update(&pid, i_soll, adc.get_current()); + dac.write(iDAC::CHANNEL_1, dac_value); - fan.run(adc.get_temperature()); - - strom = adc.get_current(); - spannung = adc.get_voltage(); - temperatur = adc.get_temperature(); - geschwindigkeit = fan.get_speed(); + fan.run(adc.get_temperature()); + strom = adc.get_current(); + spannung = adc.get_voltage(); + temperatur = adc.get_temperature(); + geschwindigkeit = fan.get_speed(); + break; + } serial_cyclic(); } } @@ -131,7 +150,9 @@ uint16_t ist_werte(CLI_OutFunction pfvOutFunction, char *acCommands[], uint16_t char buffer[64]; if(newline) { - pfvOutFunction("\n"); + buffer[0] = '\n'; + buffer[1] = '\0'; + pfvOutFunction(buffer); } snprintf(buffer, sizeof(buffer), "\rI: %5" PRIu32 "mA U: %5" PRIu32 "mV T: %3" PRIu32 "°C V: %4" PRIu32 "RPM", strom, spannung, temperatur, geschwindigkeit); @@ -158,3 +179,45 @@ uint16_t set_dutyCyle (CLI_OutFunction pfvOutFunction, char *acCommands[], uint1 pfvOutFunction(buf); return 0; } +uint16_t set_ucall(CLI_OutFunction pfvOutFunction, char *acCommands[], uint16_t u16ArgCount) +{ + spannung = 0UL; + strom = 0UL; + modus = ucall; + return 0U; +} + +uint16_t set_icall(CLI_OutFunction pfvOutFunction, char *acCommands[], uint16_t u16ArgCount) +{ + spannung = 0UL; + strom = 0UL; + modus = icall; + return 0U; +} + +static void do_icall(iADC& adc) +{ + strom += adc.get_current_raw(); + spannung++; + if(spannung == 1000UL) + { + float current_gain = 1.0f / ((float)strom / 1000.0f * 3.3f / 4096.0f); + printf("\r\nStromverstärkung: %f", current_gain); + modus = normal; + spannung = 0UL; + strom = 0UL; + } +} +static void do_ucall(iADC& adc) +{ + spannung += adc.get_voltage_raw(); + strom++; + if(strom == 1000UL) + { + float voltage_gain = 15.0f / ((float)spannung / 1000.0f * 3.3f / 4096.0f); + printf("\r\nSpannungsverstärkung: %f", voltage_gain); + modus = normal; + spannung = 0UL; + strom = 0UL; + } +}