added set for duty cycle and posibilty to change Outputs

This commit is contained in:
2025-01-28 16:07:39 +01:00
parent 1f1720672f
commit 208f8cbb78
8 changed files with 224 additions and 353 deletions

View File

@@ -35,15 +35,8 @@ static volatile bool enc_in_button_state = false;
void configure_GPIO_dir()
{
/* reset every used GPIO-pin *
gpio_reset_pin(CONFIG_HIN_U_GPIO);
gpio_reset_pin(CONFIG_HIN_V_GPIO);
gpio_reset_pin(CONFIG_HIN_W_GPIO);
*/
gpio_reset_pin(CONFIG_LIN_U_GPIO);
// gpio_reset_pin(CONFIG_LIN_V_GPIO);
// gpio_reset_pin(CONFIG_LIN_W_GPIO);
/* reset every used GPIO-pin */
gpio_reset_pin(CONFIG_HALL_A_GPIO);
gpio_reset_pin(CONFIG_HALL_B_GPIO);
gpio_reset_pin(CONFIG_HALL_C_GPIO);
@@ -51,7 +44,6 @@ void configure_GPIO_dir()
gpio_reset_pin(CONFIG_IN_ENC_A_GPIO);
gpio_reset_pin(CONFIG_IN_ENC_B_GPIO);
gpio_reset_pin(CONFIG_IN_ENC_BUT_GPIO);
//gpio_reset_pin(CONFIG_BUTTON_GPIO);
gpio_reset_pin(CONFIG_EXT_ENC_LEFT_GPIO);
@@ -66,15 +58,8 @@ void configure_GPIO_dir()
io_conf_RFE.pull_up_en = GPIO_PULLUP_DISABLE; // Pull-up-Widerstand deaktivieren
gpio_config(&io_conf_RFE);
/* Set the GPIO as a push/pull output
gpio_set_direction(CONFIG_HIN_U_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(CONFIG_HIN_V_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(CONFIG_HIN_W_GPIO, GPIO_MODE_OUTPUT);*/
gpio_set_direction(CONFIG_LIN_U_GPIO, GPIO_MODE_OUTPUT);
// gpio_set_direction(CONFIG_LIN_V_GPIO, GPIO_MODE_OUTPUT);
// gpio_set_direction(CONFIG_LIN_W_GPIO, GPIO_MODE_OUTPUT);
/* Set the GPIO as a push/pull output*/
gpio_set_direction(CONFIG_HALL_A_GPIO, GPIO_MODE_INPUT);
gpio_set_direction(CONFIG_HALL_B_GPIO, GPIO_MODE_INPUT);
gpio_set_direction(CONFIG_HALL_C_GPIO, GPIO_MODE_INPUT);

View File

@@ -80,8 +80,8 @@ menu "DIY Power PCB Configuration"
endif
config DEAD_TIME_PWM
int "time (ns)"
range 25 10000
default 500
range 0 10000
default 0
help
Deadtime
endmenu

View File

@@ -20,31 +20,33 @@ This is the first try of a Test-Software for the DIY Power PCB by Fabian Zaske
void app_main(void)
{
uint32_t Torque = 0;
/* uint32_t Torque = 0;
uint32_t Voltage_IN = 0;
int32_t Current_U = 0;
int32_t Current_V = 0;
int32_t Current_W = 0;
int32_t Current_bridge =0;
int16_t enc_counter = 0;
uint16_t menu_counter = 0;
bool Hall_A_On = false;
bool Hall_B_On = false;
bool Hall_C_On = false;
bool RFE_Pulled = false;
int direction = 0;
float Speed_indx = 0.0;
float Speed_AB = 0.0;
float duty = 0.0;
float Speed_AB = 0.0;*/
bool RFE_Pulled = false;
uint16_t menu_counter = 0;
float duty = (float)CONFIG_DUTY_PWM;
char display_message[50]; // Puffer für die Nachricht
bool enc_but_state = false;
bool in_menu = false;
configure_GPIO_dir();
SSD1306_t *dev_pt = configure_OLED();
gpio_set_level(CONFIG_HIN_U_GPIO,1);
mcpwm_init();
int i =0;
set_mcpwm_output(PHASE_U,PHASE_V,duty);
set_enc_in_counter(menu_counter);
@@ -70,9 +72,6 @@ void app_main(void)
RFE_Pulled = !(gpio_get_level(CONFIG_RFE_GPIO));
menu_counter = get_enc_in_counter();
if (menu_counter >= 4){
menu_counter=0;
set_enc_in_counter(0);
@@ -81,6 +80,19 @@ void app_main(void)
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);
//gpio_set_level(CONFIG_LIN_U_GPIO,1);
@@ -91,7 +103,7 @@ void app_main(void)
snprintf(display_message, sizeof(display_message), "PWMFreq.: %ik ", (CONFIG_FREQ_PWM/1000));
ssd1306_display_text(dev_pt, 3, display_message, 14, !(menu_counter));
snprintf(display_message, sizeof(display_message), "Duty: %i ", CONFIG_DUTY_PWM);
snprintf(display_message, sizeof(display_message), "Duty: %.1f ", duty);
ssd1306_display_text(dev_pt, 4, display_message, 14, !(menu_counter-1));
snprintf(display_message, sizeof(display_message), "DeadTime: %i ", CONFIG_DEAD_TIME_PWM);

View File

@@ -1,7 +1,14 @@
#ifndef MCPWM_H
#define MCPWM_H
typedef enum {
PHASE_U,
PHASE_V,
PHASE_W
} Phase;
void mcpwm_init();
void mcpwm_set_duty(float duty);
void set_mcpwm_output(Phase highside, Phase lowside, float Duty);
void set_mcpwm_duty(float Duty);
#endif

View File

@@ -27,13 +27,16 @@ static mcpwm_gen_handle_t generator_U_LIN = NULL;
static mcpwm_gen_handle_t generator_V_LIN = NULL;
static mcpwm_gen_handle_t generator_W_LIN = NULL;
static Phase HighsidePhase;
static Phase LowsidePhase;
uint32_t periode_ticks = CONFIG_TIMER_BASE_FREQ/CONFIG_FREQ_PWM;
/*############################################*/
/*############### MCPWM-Setup ################*/
/*############################################*/
void mcpwm_init(){
ESP_LOGI("MCPWM","started");
uint32_t periode_ticks = CONFIG_TIMER_BASE_FREQ/CONFIG_FREQ_PWM;
double tick_period_ns = 1e9 / CONFIG_TIMER_BASE_FREQ; // Zeit pro Tick in ns
uint32_t dead_time_ticks = (uint32_t)round(CONFIG_DEAD_TIME_PWM / tick_period_ns);
@@ -160,33 +163,97 @@ void mcpwm_init(){
};
ESP_ERROR_CHECK(mcpwm_new_generator(operator_W, &generator_W_LIN_config, &generator_W_LIN));
//set generator action on timer event
/* ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_U_HIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_U_HIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_U, MCPWM_GEN_ACTION_LOW)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_U_LIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_U_LIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_U, MCPWM_GEN_ACTION_LOW)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_V_HIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_V_HIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_V, MCPWM_GEN_ACTION_LOW)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_V_LIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_V_LIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_V, MCPWM_GEN_ACTION_LOW)));
*/ ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_W_HIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_W_HIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_W, MCPWM_GEN_ACTION_LOW)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_W_LIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_W_LIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_W, MCPWM_GEN_ACTION_LOW)));
//set Dead times
mcpwm_dead_time_config_t deadtime_config = {
.posedge_delay_ticks = dead_time_ticks,
.negedge_delay_ticks = 0,
};
// ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generator_U_HIN, generator_U_HIN,&deadtime_config));
// ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generator_V_HIN, generator_V_HIN,&deadtime_config));
ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generator_U_HIN, generator_U_HIN,&deadtime_config));
ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generator_V_HIN, generator_V_HIN,&deadtime_config));
ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generator_W_HIN, generator_W_HIN,&deadtime_config));
deadtime_config.posedge_delay_ticks = 0;
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_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));
}
static void set_gen(Phase phase){
switch (phase) {
case PHASE_U:
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_U_HIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_U_HIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_U, MCPWM_GEN_ACTION_LOW)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_U_LIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_U_LIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_U, MCPWM_GEN_ACTION_LOW)));
break;
case PHASE_V:
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_V_HIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_V_HIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_V, MCPWM_GEN_ACTION_LOW)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_V_LIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_V_LIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_V, MCPWM_GEN_ACTION_LOW)));
break;
case PHASE_W:
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_W_HIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_W_HIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_W, MCPWM_GEN_ACTION_LOW)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generator_W_LIN, MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generator_W_LIN, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comperator_W, MCPWM_GEN_ACTION_LOW)));
break;
default:
printf("Invalid phase selection\n");
break;
}
}
static void set_lowside(Phase lowside){
LowsidePhase = lowside;
switch (lowside){
case PHASE_U:
ESP_ERROR_CHECK(mcpwm_comparator_set_compare_value(comperator_U, 0));
break;
case PHASE_V:
ESP_ERROR_CHECK(mcpwm_comparator_set_compare_value(comperator_V, 0));
break;
case PHASE_W:
ESP_ERROR_CHECK(mcpwm_comparator_set_compare_value(comperator_W, 0));
break;
default:
printf("Invalid phase selection\n");
break;
}
}
static void set_highside(Phase highside, float Duty){
HighsidePhase = highside;
switch (highside){
case PHASE_U:
ESP_ERROR_CHECK(mcpwm_comparator_set_compare_value(comperator_U, periode_ticks*Duty/100));
break;
case PHASE_V:
ESP_ERROR_CHECK(mcpwm_comparator_set_compare_value(comperator_V, periode_ticks*Duty/100));
break;
case PHASE_W:
ESP_ERROR_CHECK(mcpwm_comparator_set_compare_value(comperator_W, periode_ticks*Duty/100));
break;
default:
printf("Invalid phase selection\n");
break;
}
}
void set_mcpwm_output(Phase highside, Phase lowside, float Duty){
set_highside(highside, Duty);
set_gen(highside);
set_lowside(lowside);
set_gen(lowside);
}
void set_mcpwm_duty(float Duty){
set_highside(HighsidePhase, Duty);
}