前言
两路PWM驱动电机,一定情况下PHY6222存在复位且电机控制力度不足
两路PWM波形输出理应为异步,原因在于采用了定时不断开启,关闭,长时间运行会导致定时精度不准确,导致同一时间两路都输出高或者低时,或者高,低同步的时间长,整体电流就会变高且对应的电机转动力度降低demo传送门提取码:j4ny
处理
在配置PWM时不用定时器去延时输出,两路采用相反的配置互补输出即可(附上测试demo),关键部分已框红
#define PWM0_PIN P32
#define PWM1_PIN P33
#define PWM_TOP_VALUE 1000
static void pwm_test_init(void)
{
hal_pwm_init(PWM_CH1, PWM_CLK_DIV_16, PWM_CNT_UP, PWM_POLARITY_FALLING);
hal_pwm_set_count_val(PWM_CH1, 400, PWM_TOP_VALUE);
hal_pwm_open_channel(PWM_CH1, PWM1_PIN);
hal_pwm_init(PWM_CH0, PWM_CLK_DIV_16, PWM_CNT_UP, PWM_POLARITY_RISING);
hal_pwm_set_count_val(PWM_CH0, 400, PWM_TOP_VALUE);
hal_pwm_open_channel(PWM_CH0, PWM0_PIN);
hal_pwm_start();
LOG("PWM init start\n");
}
void chufa_P14(gpio_pin_e pin, gpio_polarity_e type)
{
static int cnt = 0;
cnt++;
LOG("P14_chufa_type==%d,cnt==%d\n", type, cnt);
if(cnt % 2 == 0)
{
pwm_test_init();
}
else
{
LOG("PWM stop\n");
HAL_ENTER_CRITICAL_SECTION();
*(volatile int*)0x4000E004 = 0x00;
*(volatile int*)0x4000E008 = 0x00;
*(volatile int*)0x4000E010 = 0x00;
*(volatile int*)0x4000E014 = 0x00;
HAL_EXIT_CRITICAL_SECTION();
hal_pwm_destroy(PWM_CH0);
hal_pwm_destroy(PWM_CH1);
hal_pwm_stop();
}
}
void anjian_pwm(void)
{
hal_gpio_pin_init(GPIO_P14, IE);//ÊäÈë
hal_gpio_pull_set(GPIO_P14, STRONG_PULL_UP);
hal_gpioin_register(P14, NULL, chufa_P14);
}
void Key_Demo_Init(uint8 task_id)
{
uint8_t i = 0;
key_TaskID = task_id;
hal_pwm_module_init();
anjian_pwm();
// osal_start_reload_timer(key_TaskID,PWM_INIT,3000);
}
PWM_POLARITY_FALLING 1
PWM_POLARITY_RISING 0
即可输出相反的PWM波形,注册按键下降沿中断,取余开关,两路输出1KHz的PWM,PWM输出的频率看datasheet的计算公式,波形效果如下