From 0089ed9d6745cc53f0503dc37d0c869f3be1f187 Mon Sep 17 00:00:00 2001 From: der_zaske Date: Mon, 3 Feb 2025 00:01:45 +0100 Subject: [PATCH] finally fixed f*cking internal Encoder --- main/GPIO.c | 36 ++++++++++++++++++++++++++++++++---- main/app_main.c | 22 +--------------------- main/mcpwm.c | 4 ++-- parsed_pins.h | 6 +++--- sdkconfig | 8 ++++---- sdkconfig.old | 20 ++++++-------------- 6 files changed, 48 insertions(+), 48 deletions(-) mode change 100755 => 100644 sdkconfig mode change 100755 => 100644 sdkconfig.old diff --git a/main/GPIO.c b/main/GPIO.c index 45b951c..2340507 100755 --- a/main/GPIO.c +++ b/main/GPIO.c @@ -20,11 +20,13 @@ static volatile int64_t last_AB_time = 0; //internal Encoder static void IRAM_ATTR enc_in_a_isr_handler(void *arg); static void IRAM_ATTR enc_in_b_isr_handler(void *arg); +static void IRAM_ATTR enc_in_isr_handler(void *arg); static void IRAM_ATTR enc_in_but_isr_handler(void *arg); static volatile int16_t enc_in_counter = 0; static volatile int64_t last_interrupt_time_a = 0; // Entprellungs-Timer static volatile int64_t last_interrupt_time_b = 0; // Entprellungs-Timer +static volatile int64_t last_interrupt_time = 0; static volatile uint16_t last_interrupt_time_but = 0; static volatile bool enc_in_button_state = false; @@ -96,8 +98,8 @@ void configure_GPIO_dir() gpio_install_isr_service(0); ESP_ERROR_CHECK(gpio_isr_handler_add(CONFIG_EXT_ENC_INDX_GPIO, index_isr_handler, NULL)); ESP_ERROR_CHECK(gpio_isr_handler_add(CONFIG_HALL_A_GPIO, enc_ab_isr_handler, NULL)); - ESP_ERROR_CHECK(gpio_isr_handler_add(CONFIG_IN_ENC_A_GPIO, enc_in_a_isr_handler, NULL)); - ESP_ERROR_CHECK(gpio_isr_handler_add(CONFIG_IN_ENC_B_GPIO, enc_in_b_isr_handler, NULL)); + ESP_ERROR_CHECK(gpio_isr_handler_add(CONFIG_IN_ENC_A_GPIO, enc_in_isr_handler, NULL)); + ESP_ERROR_CHECK(gpio_isr_handler_add(CONFIG_IN_ENC_B_GPIO, enc_in_isr_handler, NULL)); ESP_ERROR_CHECK(gpio_isr_handler_add(CONFIG_IN_ENC_BUT_GPIO, enc_in_but_isr_handler, NULL)); } @@ -165,7 +167,7 @@ static void IRAM_ATTR enc_in_a_isr_handler(void *arg) { uint64_t interrupt_time = esp_timer_get_time(); // Entprellung: Verhindert die Erfassung von Störungen aufgrund von Prellung - if (interrupt_time - last_interrupt_time_a > (CONFIG_IN_ENCODER_DEBOUNCE_TIME*1000)) { // Entprellungszeit + if (interrupt_time - last_interrupt_time_a > (CONFIG_IN_ENCODER_DEBOUNCE_TIME)) { // Entprellungszeit last_interrupt_time_a = interrupt_time; // Entprellzeit zurücksetzen // Bestimmen der Richtung anhand des Zustands von Pin A und B if (gpio_get_level(CONFIG_IN_ENC_A_GPIO)==gpio_get_level(CONFIG_IN_ENC_B_GPIO)) { @@ -179,7 +181,7 @@ static void IRAM_ATTR enc_in_b_isr_handler(void *arg) { uint64_t interrupt_time = esp_timer_get_time(); // Entprellung: Verhindert die Erfassung von Störungen aufgrund von Prellung - if (interrupt_time - last_interrupt_time_b > (CONFIG_IN_ENCODER_DEBOUNCE_TIME*1000)) { // Entprellungszeit + if (interrupt_time - last_interrupt_time_b > (CONFIG_IN_ENCODER_DEBOUNCE_TIME)) { // Entprellungszeit last_interrupt_time_b = interrupt_time; // Entprellzeit zurücksetzen // Bestimmen der Richtung anhand des Zustands von Pin A und B if (gpio_get_level(CONFIG_IN_ENC_A_GPIO)==gpio_get_level(CONFIG_IN_ENC_B_GPIO)) { @@ -189,6 +191,32 @@ static void IRAM_ATTR enc_in_b_isr_handler(void *arg) { } } +static volatile uint8_t last_state = 0; + +static void IRAM_ATTR enc_in_isr_handler(void *arg) { + static uint64_t last_interrupt_time = 0; + + // Aktueller Zustand der Pins lesen + uint8_t current_state = (gpio_get_level(CONFIG_IN_ENC_A_GPIO) << 1) | gpio_get_level(CONFIG_IN_ENC_B_GPIO); + uint64_t interrupt_time = esp_timer_get_time(); + + // Zustandswechsel-Logik (FSM) ohne starre Entprellzeit + if (current_state != last_state) { + // Nur wenn der Wechsel signifikant verzögert ist (gute Flanke) + if ((interrupt_time - last_interrupt_time) > CONFIG_IN_ENCODER_DEBOUNCE_TIME) { + if ((last_state == 0b01 && current_state == 0b11) || + (last_state == 0b10 && current_state == 0b00)) { + enc_in_counter++; // Vorwärtsdrehen + } else if ((last_state == 0b10 && current_state == 0b11) || + (last_state == 0b01 && current_state == 0b00)) { + enc_in_counter--; // Rückwärtsdrehen + } + last_state = current_state; // Zustand aktualisieren + last_interrupt_time = interrupt_time; + } + } +} + static void IRAM_ATTR enc_in_but_isr_handler(void *arg) { uint64_t interrupt_time = esp_timer_get_time(); diff --git a/main/app_main.c b/main/app_main.c index fee121d..5d2e4ad 100755 --- a/main/app_main.c +++ b/main/app_main.c @@ -76,27 +76,7 @@ void app_main(void) RFE_Pulled = !(gpio_get_level(CONFIG_RFE_GPIO)); - if (menu_counter >= 4){ - menu_counter=0; - set_enc_in_counter(0); - } - enc_but_state = get_enc_in_but(); - if (enc_but_state){ - in_menu ^= 1; - } - if (in_menu){ - switch(menu_counter){ - case 0: - - break; - case 1: - set_enc_in_counter(0); - break; - } - - }else{ - menu_counter = get_enc_in_counter(); - } + get_enc_in_counter(); //Current_bridge = get_current_bridge(adc1_handle, CONFIG_I_SENSE_ADC); //gpio_set_level(CONFIG_LIN_U_GPIO,1); diff --git a/main/mcpwm.c b/main/mcpwm.c index c5b9fc7..43509a9 100755 --- a/main/mcpwm.c +++ b/main/mcpwm.c @@ -44,7 +44,7 @@ void mcpwm_init(){ { .group_id = 0, .clk_src = MCPWM_TIMER_CLK_SRC_DEFAULT, - .resolution_hz = 40000000, //40MHz + .resolution_hz = CONFIG_TIMER_BASE_FREQ, //40MHz .period_ticks = periode_ticks, //40MHz/2KHz = 20KHz .count_mode = MCPWM_TIMER_COUNT_MODE_UP_DOWN, }; @@ -170,7 +170,7 @@ void mcpwm_init(){ deadtime_config.negedge_delay_ticks = dead_time_ticks; ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generator_U_HIN, generator_U_LIN, &deadtime_config)); ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generator_V_HIN, generator_V_LIN, &deadtime_config)); - ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generator_W_HIN, generator_W_LIN, &deadtime_config)); + ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generator_W_HIN, generator_W_LIN, &deadtime_config)); } static void set_gen(Phase phase){ diff --git a/parsed_pins.h b/parsed_pins.h index 36e1be2..d3e8747 100755 --- a/parsed_pins.h +++ b/parsed_pins.h @@ -18,9 +18,9 @@ #define CONFIG_HALL_B_GPIO 16 #define CONFIG_HALL_C_GPIO 17 -#define CONFIG_IN_ENC_A_GPIO 23 -#define CONFIG_IN_ENC_B_GPIO 1 -#define CONFIG_IN_ENC_BUT_GPIO 3 +#define CONFIG_IN_ENC_A_GPIO 3 +#define CONFIG_IN_ENC_B_GPIO 2 +#define CONFIG_IN_ENC_BUT_GPIO 23 #define CONFIG_EXT_ENC_INDX_GPIO 16 #define CONFIG_EXT_ENC_LEFT_GPIO 18 diff --git a/sdkconfig b/sdkconfig old mode 100755 new mode 100644 index 04d037b..93011c7 --- a/sdkconfig +++ b/sdkconfig @@ -239,7 +239,7 @@ CONFIG_IDF_TOOLCHAIN="gcc" CONFIG_IDF_TARGET_ARCH_XTENSA=y CONFIG_IDF_TARGET_ARCH="xtensa" CONFIG_IDF_TARGET="esp32" -CONFIG_IDF_INIT_VERSION="5.3.1" +CONFIG_IDF_INIT_VERSION="5.3.0" CONFIG_IDF_TARGET_ESP32=y CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 @@ -422,7 +422,7 @@ CONFIG_ENABLE_PWM=y CONFIG_TIMER_BASE_FREQ=40000000 CONFIG_FREQ_PWM=20000 CONFIG_DUTY_PWM=50 -CONFIG_DEAD_TIME_PWM=500 +CONFIG_DEAD_TIME_PWM=0 # end of PWM configuration # @@ -434,9 +434,9 @@ CONFIG_HALL_A_B_C_GPIO="4, 16, 17" # # Input pin configurations # -CONFIG_IN_ENCODER_GPIO="23, 1, 3" +CONFIG_IN_ENCODER_GPIO="3,2,23" CONFIG_IN_ENCODER_GPIO_V1="3, 2, 23" -CONFIG_IN_ENCODER_DEBOUNCE_TIME=50 +CONFIG_IN_ENCODER_DEBOUNCE_TIME=500 CONFIG_BUTTON_GPIO=1 CONFIG_EXT_ENCODER_GPIO="16, 18, 5" CONFIG_RFE_GPIO=15 diff --git a/sdkconfig.old b/sdkconfig.old old mode 100755 new mode 100644 index 66685e3..638723a --- a/sdkconfig.old +++ b/sdkconfig.old @@ -1,6 +1,6 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) 5.3.1 Project Configuration +# Espressif IoT Development Framework (ESP-IDF) 5.3.0 Project Configuration # CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" @@ -174,7 +174,7 @@ CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y CONFIG_SOC_TOUCH_SENSOR_VERSION=1 CONFIG_SOC_TOUCH_SENSOR_NUM=10 -CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 +CONFIG_SOC_TOUCH_SAMPLER_NUM=1 CONFIG_SOC_TWAI_CONTROLLER_NUM=1 CONFIG_SOC_TWAI_BRP_MIN=2 CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y @@ -239,7 +239,7 @@ CONFIG_IDF_TOOLCHAIN="gcc" CONFIG_IDF_TARGET_ARCH_XTENSA=y CONFIG_IDF_TARGET_ARCH="xtensa" CONFIG_IDF_TARGET="esp32" -CONFIG_IDF_INIT_VERSION="$IDF_INIT_VERSION" +CONFIG_IDF_INIT_VERSION="5.3.0" CONFIG_IDF_TARGET_ESP32=y CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 @@ -421,8 +421,8 @@ CONFIG_LIN_U_V_W_GPIO="25, 27, 12" CONFIG_ENABLE_PWM=y CONFIG_TIMER_BASE_FREQ=40000000 CONFIG_FREQ_PWM=20000 -CONFIG_DUTY_PWM=75 -CONFIG_DEAD_TIME_PWM=500 +CONFIG_DUTY_PWM=50 +CONFIG_DEAD_TIME_PWM=0 # end of PWM configuration # @@ -434,7 +434,7 @@ CONFIG_HALL_A_B_C_GPIO="4, 16, 17" # # Input pin configurations # -CONFIG_IN_ENCODER_GPIO="23, 1, 3" +CONFIG_IN_ENCODER_GPIO="3,2,23" CONFIG_IN_ENCODER_GPIO_V1="3, 2, 23" CONFIG_IN_ENCODER_DEBOUNCE_TIME=50 CONFIG_BUTTON_GPIO=1 @@ -733,14 +733,6 @@ CONFIG_SPI_MASTER_ISR_IN_IRAM=y CONFIG_SPI_SLAVE_ISR_IN_IRAM=y # end of ESP-Driver:SPI Configurations -# -# ESP-Driver:Touch Sensor Configurations -# -# CONFIG_TOUCH_CTRL_FUNC_IN_IRAM is not set -# CONFIG_TOUCH_ISR_IRAM_SAFE is not set -# CONFIG_TOUCH_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:Touch Sensor Configurations - # # ESP-Driver:UART Configurations #