bldc-motor-pwm-control-6.ino

HPMicro HPM5100: 400 MHz RISC-V MCU with Integrated Analog Peripherals · File : bldc-motor-pwm-control-6.ino · Language : C · Use case : Piloter un moteur BLDC triphasé en utilisant la sortie PWM haute fréquence et le module de protection intégrée.

Initializes the PWM module to generate high-frequency motor control signals with dynamic duty cycle adjustment.

Uses the HPM5100 PWM0 module. Requires HPMicro SDK. Code configures edge-aligned mode. Ensure PWM outputs are connected to external power drivers before running on a real motor to avoid short 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);
        }
    }
}

← Back to the board