bldc-motor-pwm-control-6.ino

HPMicro HPM5100 : Microcontrôleur RISC-V 400 MHz avec analogique intégré · Fichier : bldc-motor-pwm-control-6.ino · Langage : C · Usage : Piloter un moteur BLDC triphasé en utilisant la sortie PWM haute fréquence et le module de protection intégrée.

Initialise le module PWM pour générer des signaux de commande moteur haute fréquence avec réglage dynamique du rapport cyclique.

Utilise le module PWM0 du HPM5100. Nécessite le SDK HPMicro. Le code configure le mode alignement sur front. Assurez-vous de connecter les sorties PWM aux drivers de puissance externes avant d'exécuter le code sur un vrai moteur pour éviter les courts-circuits.

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);
        }
    }
}

← Retour à la fiche