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