bldc-motor-pwm-control-6.ino
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);
}
}
}