finally fixed f*cking internal Encoder
This commit is contained in:
36
main/GPIO.c
36
main/GPIO.c
@@ -20,11 +20,13 @@ static volatile int64_t last_AB_time = 0;
|
|||||||
//internal Encoder
|
//internal Encoder
|
||||||
static void IRAM_ATTR enc_in_a_isr_handler(void *arg);
|
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_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 void IRAM_ATTR enc_in_but_isr_handler(void *arg);
|
||||||
|
|
||||||
static volatile int16_t enc_in_counter = 0;
|
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_a = 0; // Entprellungs-Timer
|
||||||
static volatile int64_t last_interrupt_time_b = 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 uint16_t last_interrupt_time_but = 0;
|
||||||
static volatile bool enc_in_button_state = false;
|
static volatile bool enc_in_button_state = false;
|
||||||
|
|
||||||
@@ -96,8 +98,8 @@ void configure_GPIO_dir()
|
|||||||
gpio_install_isr_service(0);
|
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_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_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_A_GPIO, enc_in_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_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));
|
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();
|
uint64_t interrupt_time = esp_timer_get_time();
|
||||||
|
|
||||||
// Entprellung: Verhindert die Erfassung von Störungen aufgrund von Prellung
|
// 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
|
last_interrupt_time_a = interrupt_time; // Entprellzeit zurücksetzen
|
||||||
// Bestimmen der Richtung anhand des Zustands von Pin A und B
|
// 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)) {
|
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();
|
uint64_t interrupt_time = esp_timer_get_time();
|
||||||
|
|
||||||
// Entprellung: Verhindert die Erfassung von Störungen aufgrund von Prellung
|
// 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
|
last_interrupt_time_b = interrupt_time; // Entprellzeit zurücksetzen
|
||||||
// Bestimmen der Richtung anhand des Zustands von Pin A und B
|
// 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)) {
|
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) {
|
static void IRAM_ATTR enc_in_but_isr_handler(void *arg) {
|
||||||
uint64_t interrupt_time = esp_timer_get_time();
|
uint64_t interrupt_time = esp_timer_get_time();
|
||||||
|
|
||||||
|
|||||||
@@ -76,27 +76,7 @@ void app_main(void)
|
|||||||
|
|
||||||
RFE_Pulled = !(gpio_get_level(CONFIG_RFE_GPIO));
|
RFE_Pulled = !(gpio_get_level(CONFIG_RFE_GPIO));
|
||||||
|
|
||||||
if (menu_counter >= 4){
|
get_enc_in_counter();
|
||||||
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();
|
|
||||||
}
|
|
||||||
//Current_bridge = get_current_bridge(adc1_handle, CONFIG_I_SENSE_ADC);
|
//Current_bridge = get_current_bridge(adc1_handle, CONFIG_I_SENSE_ADC);
|
||||||
//gpio_set_level(CONFIG_LIN_U_GPIO,1);
|
//gpio_set_level(CONFIG_LIN_U_GPIO,1);
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ void mcpwm_init(){
|
|||||||
{
|
{
|
||||||
.group_id = 0,
|
.group_id = 0,
|
||||||
.clk_src = MCPWM_TIMER_CLK_SRC_DEFAULT,
|
.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
|
.period_ticks = periode_ticks, //40MHz/2KHz = 20KHz
|
||||||
.count_mode = MCPWM_TIMER_COUNT_MODE_UP_DOWN,
|
.count_mode = MCPWM_TIMER_COUNT_MODE_UP_DOWN,
|
||||||
};
|
};
|
||||||
@@ -170,7 +170,7 @@ void mcpwm_init(){
|
|||||||
deadtime_config.negedge_delay_ticks = dead_time_ticks;
|
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_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_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){
|
static void set_gen(Phase phase){
|
||||||
|
|||||||
@@ -18,9 +18,9 @@
|
|||||||
#define CONFIG_HALL_B_GPIO 16
|
#define CONFIG_HALL_B_GPIO 16
|
||||||
#define CONFIG_HALL_C_GPIO 17
|
#define CONFIG_HALL_C_GPIO 17
|
||||||
|
|
||||||
#define CONFIG_IN_ENC_A_GPIO 23
|
#define CONFIG_IN_ENC_A_GPIO 3
|
||||||
#define CONFIG_IN_ENC_B_GPIO 1
|
#define CONFIG_IN_ENC_B_GPIO 2
|
||||||
#define CONFIG_IN_ENC_BUT_GPIO 3
|
#define CONFIG_IN_ENC_BUT_GPIO 23
|
||||||
|
|
||||||
#define CONFIG_EXT_ENC_INDX_GPIO 16
|
#define CONFIG_EXT_ENC_INDX_GPIO 16
|
||||||
#define CONFIG_EXT_ENC_LEFT_GPIO 18
|
#define CONFIG_EXT_ENC_LEFT_GPIO 18
|
||||||
|
|||||||
8
sdkconfig
Executable file → Normal file
8
sdkconfig
Executable file → Normal file
@@ -239,7 +239,7 @@ CONFIG_IDF_TOOLCHAIN="gcc"
|
|||||||
CONFIG_IDF_TARGET_ARCH_XTENSA=y
|
CONFIG_IDF_TARGET_ARCH_XTENSA=y
|
||||||
CONFIG_IDF_TARGET_ARCH="xtensa"
|
CONFIG_IDF_TARGET_ARCH="xtensa"
|
||||||
CONFIG_IDF_TARGET="esp32"
|
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_TARGET_ESP32=y
|
||||||
CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000
|
CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000
|
||||||
|
|
||||||
@@ -422,7 +422,7 @@ CONFIG_ENABLE_PWM=y
|
|||||||
CONFIG_TIMER_BASE_FREQ=40000000
|
CONFIG_TIMER_BASE_FREQ=40000000
|
||||||
CONFIG_FREQ_PWM=20000
|
CONFIG_FREQ_PWM=20000
|
||||||
CONFIG_DUTY_PWM=50
|
CONFIG_DUTY_PWM=50
|
||||||
CONFIG_DEAD_TIME_PWM=500
|
CONFIG_DEAD_TIME_PWM=0
|
||||||
# end of PWM configuration
|
# end of PWM configuration
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -434,9 +434,9 @@ CONFIG_HALL_A_B_C_GPIO="4, 16, 17"
|
|||||||
#
|
#
|
||||||
# Input pin configurations
|
# 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_GPIO_V1="3, 2, 23"
|
||||||
CONFIG_IN_ENCODER_DEBOUNCE_TIME=50
|
CONFIG_IN_ENCODER_DEBOUNCE_TIME=500
|
||||||
CONFIG_BUTTON_GPIO=1
|
CONFIG_BUTTON_GPIO=1
|
||||||
CONFIG_EXT_ENCODER_GPIO="16, 18, 5"
|
CONFIG_EXT_ENCODER_GPIO="16, 18, 5"
|
||||||
CONFIG_RFE_GPIO=15
|
CONFIG_RFE_GPIO=15
|
||||||
|
|||||||
20
sdkconfig.old
Executable file → Normal file
20
sdkconfig.old
Executable file → Normal file
@@ -1,6 +1,6 @@
|
|||||||
#
|
#
|
||||||
# Automatically generated file. DO NOT EDIT.
|
# 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_BROWNOUT_RESET_SUPPORTED="Not determined"
|
||||||
CONFIG_SOC_TWAI_BRP_DIV_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_TIMER_GROUP_SUPPORT_APB=y
|
||||||
CONFIG_SOC_TOUCH_SENSOR_VERSION=1
|
CONFIG_SOC_TOUCH_SENSOR_VERSION=1
|
||||||
CONFIG_SOC_TOUCH_SENSOR_NUM=10
|
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_CONTROLLER_NUM=1
|
||||||
CONFIG_SOC_TWAI_BRP_MIN=2
|
CONFIG_SOC_TWAI_BRP_MIN=2
|
||||||
CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y
|
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=y
|
||||||
CONFIG_IDF_TARGET_ARCH="xtensa"
|
CONFIG_IDF_TARGET_ARCH="xtensa"
|
||||||
CONFIG_IDF_TARGET="esp32"
|
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_TARGET_ESP32=y
|
||||||
CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000
|
CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000
|
||||||
|
|
||||||
@@ -421,8 +421,8 @@ CONFIG_LIN_U_V_W_GPIO="25, 27, 12"
|
|||||||
CONFIG_ENABLE_PWM=y
|
CONFIG_ENABLE_PWM=y
|
||||||
CONFIG_TIMER_BASE_FREQ=40000000
|
CONFIG_TIMER_BASE_FREQ=40000000
|
||||||
CONFIG_FREQ_PWM=20000
|
CONFIG_FREQ_PWM=20000
|
||||||
CONFIG_DUTY_PWM=75
|
CONFIG_DUTY_PWM=50
|
||||||
CONFIG_DEAD_TIME_PWM=500
|
CONFIG_DEAD_TIME_PWM=0
|
||||||
# end of PWM configuration
|
# end of PWM configuration
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -434,7 +434,7 @@ CONFIG_HALL_A_B_C_GPIO="4, 16, 17"
|
|||||||
#
|
#
|
||||||
# Input pin configurations
|
# 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_GPIO_V1="3, 2, 23"
|
||||||
CONFIG_IN_ENCODER_DEBOUNCE_TIME=50
|
CONFIG_IN_ENCODER_DEBOUNCE_TIME=50
|
||||||
CONFIG_BUTTON_GPIO=1
|
CONFIG_BUTTON_GPIO=1
|
||||||
@@ -733,14 +733,6 @@ CONFIG_SPI_MASTER_ISR_IN_IRAM=y
|
|||||||
CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
|
CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
|
||||||
# end of ESP-Driver:SPI Configurations
|
# 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
|
# ESP-Driver:UART Configurations
|
||||||
#
|
#
|
||||||
|
|||||||
Reference in New Issue
Block a user