OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 18|回复: 0

无刷电机速度高时,驱动板报过流故障

[复制链接]

11

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2018-11-13
在线时间
27 小时
发表于 2 小时前 | 显示全部楼层 |阅读模式
1金钱
官方的F407IGT6例程中,PWM的占空比最高可以设置到4800,但我自己写的程序,最高到2500就开始报电流过大了。我的思路和官方例程是一样的。先在main函数中初始化,然后在定时器gtim.c的中断里查询霍尔传感器的值,然后在bldc.c中改变通电顺序。如果占空比设置超过2500,通电后会抖一下,然后停机,电流过大的指示灯亮起。我找了半天没发现问题的坐在,请大佬帮忙找找原因。非常感谢。
/************以下之主函数的初始化,定时器部分和官方例程的参数一样***************/

int main(void)
{
    HAL_Init();                              /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);      /* 设置时钟,168Mhz */
    delay_init(168);                         /* 延时初始化 */
    usart_init(115200);                      /* 串口初始化为115200 */
    led_init();                              /* 初始化LED */
    key_init();                              /* 初始化按键 */
    beep_init();                             /* 初始化蜂鸣器 */
    gtim_tim1_oc_chy_init(10000-1,0);        /* 定时器1初始化 */

    while (1)
    {

    }
}


/****************以下代码是在定时器中断回调函数中,检测霍尔传感器位置,并改变电流方向***************************/

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)         /* 每次计数到达自动重装载值时,就进入一次中断 */
{
    if(htim->Instance == TIM1)                                      /* 55us */
    {
        hall_one = 0;
        if(HAL_GPIO_ReadPin(GPIOH, GPIO_PIN_10) != GPIO_PIN_RESET)
        {
            hall_one |= 0x01;
        }
        if(HAL_GPIO_ReadPin(GPIOH, GPIO_PIN_11) != GPIO_PIN_RESET)
        {
            hall_one |= 0x02;
        }
        if(HAL_GPIO_ReadPin(GPIOH, GPIO_PIN_12) != GPIO_PIN_RESET)
        {
            hall_one |= 0x04;
        }
    }

    if(m1_direction == 0)                             //正转
    {
        switch(hall_one)
        {
            case 0x05:
                m1_uhvl();
            break;
            case 0x01:
                m1_uhwl();
            break;
            case 0x03:
                m1_vhwl();
            break;
            case 0x02:
                m1_vhul();
            break;
            case 0x06:
                m1_whul();
            break;
            case 0x04:
                m1_whvl();
            break;
            default:
                m1_stop();
            break;
        }
    }

    if(m1_direction == 1)                             //反转
    {
        switch(hall_one)
        {
            case 0x05:
                m1_vhul();
            break;
            case 0x01:
                m1_whul();
            break;
            case 0x03:
                m1_whvl();
            break;
            case 0x02:
                m1_uhvl();
            break;
            case 0x06:
                m1_uhwl();
            break;
            case 0x04:
                m1_vhwl();
            break;
            default:
                m1_stop();
            break;
        }
    }
}

/****************以下代码是六步换向,其中m1_speed不能大于2500*********************/


uint16_t m1_speed = 2500;                   /* 电机1的转速 */
void m1_uhvl(void)
{
    g_atim1_handle.Instance->CCR1 = m1_speed;
    g_atim1_handle.Instance->CCR2 = 0;
    g_atim1_handle.Instance->CCR3 = 0;

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);            //U相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);              //V相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);            //W相下桥臂
}

void m1_uhwl(void)
{
    g_atim1_handle.Instance->CCR1 = m1_speed;
    g_atim1_handle.Instance->CCR2 = 0;
    g_atim1_handle.Instance->CCR3 = 0;

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);            //U相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);            //V相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);              //W相下桥臂
}

void m1_vhwl(void)
{
    g_atim1_handle.Instance->CCR1 = 0;
    g_atim1_handle.Instance->CCR2 = m1_speed;
    g_atim1_handle.Instance->CCR3 = 0;

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);            //U相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);            //V相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);              //W相下桥臂
}

void m1_vhul(void)
{
    g_atim1_handle.Instance->CCR1 = 0;
    g_atim1_handle.Instance->CCR2 = m1_speed;
    g_atim1_handle.Instance->CCR3 = 0;

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET);              //U相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);            //V相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);            //W相下桥臂
}

void m1_whul(void)
{
    g_atim1_handle.Instance->CCR1 = 0;
    g_atim1_handle.Instance->CCR2 = 0;
    g_atim1_handle.Instance->CCR3 = m1_speed;

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET);              //U相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);            //V相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);            //W相下桥臂
}

void m1_whvl(void)
{
    g_atim1_handle.Instance->CCR1 = 0;
    g_atim1_handle.Instance->CCR2 = 0;
    g_atim1_handle.Instance->CCR3 = m1_speed;

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);            //U相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);              //V相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);            //W相下桥臂
}

void m1_stop(void)
{
   __HAL_TIM_SET_COMPARE(&g_atim1_handle, TIM_CHANNEL_1, 0);        //U相上桥臂
   __HAL_TIM_SET_COMPARE(&g_atim1_handle, TIM_CHANNEL_2, 0);        //V相上桥臂
   __HAL_TIM_SET_COMPARE(&g_atim1_handle, TIM_CHANNEL_3, 0);        //W相上桥臂

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);            //U相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);            //V相下桥臂
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);            //W相下桥臂
}

再次感谢大佬。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-11-1 11:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表