simplefoc / Arduino-FOC

Arduino FOC for BLDC and Stepper motors - Arduino Based Field Oriented Control Algorithm Library
https://docs.simplefoc.com
MIT License
1.95k stars 511 forks source link

[BUG]ESP32-S3 block in InlineCurrentSense init #320

Open mailonghua opened 9 months ago

mailonghua commented 9 months ago

Describe the bug When using SimpleFOC, the program will stay at the current_sense.init(); function location

Describe the hardware setup For us it is very important to know what is the hardware setup you're using in order to be able to help more directly

Config file [env:esp32-s3-devkitc-1] platform = https://github.com/platformio/platform-espressif32.git board = esp32-s3-devkitc-1 framework = arduino monitor_speed = 115200 lib_deps = askuric/Simple FOC @ ^2.3.1 SPI Wire lib_archive = false

CurrentCode

include

define A0 8

define A1 9

// current sensor // shunt resistor value // gain value // pins phase A,B, (C optional) InlineCurrentSense current_sense = InlineCurrentSense(0.01f, 50.0f, 8, 9);

void setup() { Serial.begin(115200); Serial.println("Start init current sense"); // initialise the current sensing current_sense.init(); Serial.println("End init current sense");

// for SimpleFOCShield v2.01/v2.0.2 current_sense.gain_b *= -1;

Serial.println("Current sense ready."); }

void loop() {

PhaseCurrent_s currents = current_sense.getPhaseCurrents();
float current_magnitude = current_sense.getDCCurrent();

Serial.print(currents.a*1000); // milli Amps
Serial.print("\t");
Serial.print(currents.b*1000); // milli Amps
Serial.print("\t");
Serial.print(currents.c*1000); // milli Amps
Serial.print("\t");
Serial.println(current_magnitude*1000); // milli Amps

}

Out ESP-ROM:esp32s3-20210327 Build:Mar 27 2021 rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT) SPIWP:0xee mode:DIO, clock div:1 load:0x3fce3808,len:0x44c load:0x403c9700,len:0xbe4 load:0x403cc700,len:0x2a68 entry 0x403c98d4 Start init current sense

mailonghua commented 9 months ago

I think I have located this problem. This is a bug. Each ADC of esp32s3 has 10 channels 0~9, and the SENS_SAR_MEAS1_CTRL2_REG register shows the status of ADC1, and SENS_SAR_MEAS2_CTRL2_REG shows the status of ADC2. But when I use GPIO9, currently The judgment detects BIT16 of SENS_SAR_MEAS2_CTRL2_REG, which belongs to ADC2. When I change if(channel > 7) to if(channel > 9), my current program is normal. But I think this method may not be appropriate for ADC2

mailonghua commented 9 months ago

I think I have located this problem. This is a bug. Each ADC of esp32s3 has 10 channels 0~9, and the SENS_SAR_MEAS1_CTRL2_REG register shows the status of ADC1, and SENS_SAR_MEAS2_CTRL2_REG shows the status of ADC2. But when I use GPIO9, currently The judgment detects BIT16 of SENS_SAR_MEAS2_CTRL2_REG, which belongs to ADC2. When I change if(channel > 7) to if(channel > 9), my current program is normal. But I think this method may not be appropriate for ADC2

Simple FOC\src\current_sense\hardware_specific\esp32\esp32s_adc_driver.cpp :237

runger1101001 commented 9 months ago

Thank you very much for reporting this and finding the solution! We'll look into it as soon as we can!

runger1101001 commented 9 months ago

Probably a duplicate: #295