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.
Fork of Smoothie by
CurrentControl.cpp
00001 #include "libs/Kernel.h" 00002 #include "CurrentControl.h" 00003 #include "libs/nuts_bolts.h" 00004 #include "libs/utils.h" 00005 00006 #include "Gcode.h" 00007 00008 // add new digipot chips here 00009 #include "mcp4451.h" 00010 #include "ad5206.h" 00011 00012 #include <string> 00013 using namespace std; 00014 00015 CurrentControl::CurrentControl(){ 00016 digipot= NULL; 00017 } 00018 00019 void CurrentControl::on_module_loaded(){ 00020 if( !THEKERNEL->config->value( currentcontrol_module_enable_checksum )->by_default(false)->as_bool() ){ 00021 // as this module is not needed free up the resource 00022 delete this; 00023 return; 00024 } 00025 00026 // allocate digipot, if already allocated delete it first 00027 delete digipot; 00028 00029 // see which chip to use 00030 int chip_checksum = get_checksum(THEKERNEL->config->value(digipotchip_checksum)->by_default("mcp4451")->as_string()); 00031 if(chip_checksum == mcp4451_checksum) { 00032 digipot = new MCP4451(); 00033 }else if(chip_checksum == ad5206_checksum) { 00034 digipot = new AD5206(); 00035 }else { // need a default so use smoothie 00036 digipot = new MCP4451(); 00037 } 00038 00039 // Get configuration 00040 this->alpha_current = THEKERNEL->config->value(alpha_current_checksum )->by_default(0.8f)->as_number(); 00041 this->beta_current = THEKERNEL->config->value(beta_current_checksum )->by_default(0.8f)->as_number(); 00042 this->gamma_current = THEKERNEL->config->value(gamma_current_checksum )->by_default(0.8f)->as_number(); 00043 this->delta_current = THEKERNEL->config->value(delta_current_checksum )->by_default(0.8f)->as_number(); 00044 this->epsilon_current = THEKERNEL->config->value(epsilon_current_checksum)->by_default(-1)->as_number(); 00045 this->zeta_current = THEKERNEL->config->value(zeta_current_checksum )->by_default(-1)->as_number(); 00046 this->eta_current = THEKERNEL->config->value(eta_current_checksum )->by_default(-1)->as_number(); 00047 this->theta_current = THEKERNEL->config->value(theta_current_checksum )->by_default(-1)->as_number(); 00048 00049 digipot->set_max_current( THEKERNEL->config->value(digipot_max_current )->by_default(2.0f)->as_number()); 00050 digipot->set_factor( THEKERNEL->config->value(digipot_factor )->by_default(113.33f)->as_number()); 00051 00052 this->digipot->set_current(0, this->alpha_current); 00053 this->digipot->set_current(1, this->beta_current ); 00054 this->digipot->set_current(2, this->gamma_current); 00055 this->digipot->set_current(3, this->delta_current); 00056 if(this->epsilon_current >= 0){ 00057 this->digipot->set_current(4, this->epsilon_current); 00058 this->digipot->set_current(5, this->zeta_current ); 00059 this->digipot->set_current(6, this->eta_current); 00060 this->digipot->set_current(7, this->theta_current); 00061 } 00062 00063 this->original_delta_current= this->delta_current; // remember this to determine if we want to save on M500 00064 00065 this->register_for_event(ON_GCODE_RECEIVED); 00066 } 00067 00068 00069 void CurrentControl::on_gcode_received(void *argument) 00070 { 00071 Gcode *gcode = static_cast<Gcode*>(argument); 00072 char alpha[8] = { 'X', 'Y', 'Z', 'E', 'A', 'B', 'C', 'D' }; 00073 if (gcode->has_m) 00074 { 00075 if (gcode->m == 907) 00076 { 00077 int i; 00078 for (i = 0; i < 8; i++) 00079 { 00080 if (gcode->has_letter(alpha[i])){ 00081 float c= gcode->get_value(alpha[i]); 00082 this->digipot->set_current(i, c); 00083 switch(i) { 00084 case 0: this->alpha_current= c; break; 00085 case 1: this->beta_current= c; break; 00086 case 2: this->gamma_current= c; break; 00087 case 3: this->delta_current= c; break; 00088 case 4: this->epsilon_current= c; break; 00089 case 5: this->zeta_current= c; break; 00090 case 6: this->eta_current= c; break; 00091 case 7: this->theta_current= c; break; 00092 } 00093 } 00094 gcode->stream->printf("%c:%3.1fA%c", alpha[i], this->digipot->get_current(i), (i == 7)?'\n':' '); 00095 } 00096 00097 }else if(gcode->m == 500 || gcode->m == 503) { 00098 if(this->delta_current != this->original_delta_current) { // if not the same as loaded by config then save it 00099 gcode->stream->printf(";Extruder current:\nM907 E%1.5f\n", this->delta_current); 00100 } 00101 } 00102 } 00103 }
Generated on Tue Jul 12 2022 20:09:00 by
1.7.2
