bldc-motor-pwm-control-6.ino

HPMicro HPM5100: Microcontrolador RISC-V de 400 MHz con analógica integrada · Archivo : bldc-motor-pwm-control-6.ino · Lenguaje : C · Uso : Piloter un moteur BLDC triphasé en utilisant la sortie PWM haute fréquence et le module de protection intégrée.

Inicializa el módulo PWM para generar señales de control de motor de alta frecuencia con ajuste dinámico del ciclo de trabajo.

Utiliza el módulo PWM0 de HPM5100. Requiere SDK HPMicro. El código configura el modo de alineación en borde. Asegúrese de conectar las salidas PWM a controladores de potencia externos antes de ejecutar en un motor real para evitar cortocircuitos.

bldc-motor-pwm-control-6.ino

#include "board.h"
#include "hpm_pwmv2_drv.h"
#include "hpm_clock_drv.h"

/* Configuration PWM pour moteur BLDC sur HPM5100 */
#define PWM_MOTOR_FREQ      20000
#define PWM_MAX_CYCLE       1000

void bldc_motor_init(void)
{
    pwmv2_config_t pwm_config;
    pwmv2_channel_config_t ch_config;
    
    /* Activer l' horloge du module PWM */
    clock_add_to_group(clock_pwm0, 0);
    
    /* Configuration de base du module PWM */
    pwm_config.pwm_reload = PWM_MAX_CYCLE;
    pwm_config.clock_dividing = pwm_clock_dividing_1;
    pwm_config.work_mode = pwm_work_mode_edge_aligned;
    pwm_config.pwm_cmp0_mode = pwm_cmp_mode_immediate_loading;
    pwm_config.pwm_cmp1_mode = pwm_cmp_mode_immediate_loading;
    pwmv2_init(PWM0, &pwm_config);
    
    /* Configuration du canal pour la phase U (ex: PWM0_CH0) */
    ch_config.enable_reload = true;
    ch_config.enable_output = true;
    ch_config.output_pin = pwm_output_pin0;
    ch_config.cmp0_point = PWM_MAX_CYCLE / 2; /* 50% Duty Cycle initial */
    ch_config.cmp1_point = 0;
    pwmv2_channel_set_config(PWM0, PWM0_CH0, &ch_config);
    
    /* Activer la sortie */
    pwmv2_channel_enable_output(PWM0, PWM0_CH0, true);
}

void bldc_set_duty(uint8_t channel, uint16_t duty)
{
    if (duty > PWM_MAX_CYCLE) duty = PWM_MAX_CYCLE;
    pwmv2_set_cmp0(PWM0, channel, duty);
}

int main(void)
{
    board_init();
    bldc_motor_init();
    
    while (1) {
        /* Rampe simple pour démonstration */
        for (uint16_t i = 0; i <= PWM_MAX_CYCLE; i++) {
            bldc_set_duty(PWM0_CH0, i);
            delay_ms(10);
        }
        for (uint16_t i = PWM_MAX_CYCLE; i > 0; i--) {
            bldc_set_duty(PWM0_CH0, i);
            delay_ms(10);
        }
    }
}

← Volver a la ficha