added set for duty cycle and posibilty to change Outputs
This commit is contained in:
23
main/GPIO.c
23
main/GPIO.c
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
109
main/mcpwm.c
109
main/mcpwm.c
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user