发新帖我要提问
12
返回列表
打印
[其他ST产品]

六步换向、FOC,STM32cubemx从零开始搭建BLDC六步换相代码、FOC代码

[复制链接]
楼主: 甲虫666
手机看帖
扫描二维码
随时随地手机跟帖
21
甲虫666|  楼主 | 2024-1-30 16:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
(3)测试定时中断
在工程里新建两个文件:hall.c、hall.h。在main里加头文件。
加入下面中断回调函数,先测基本定时器中断,串口助手看现象。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        printf("tim\r\n");
}
————

使用特权

评论回复
22
甲虫666|  楼主 | 2024-1-30 16:40 | 只看该作者

使用特权

评论回复
23
甲虫666|  楼主 | 2024-1-30 16:41 | 只看该作者
(4)测试霍尔中断
hall.c 加入如下代码

uint8_t state = 0;
//换相中断
void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)
{
        state = get_hall_state();
        printf("%d\r\n",state);
}

//获取霍尔传感器值
uint8_t get_hall_state(void)
{
  uint8_t state = 0;
  
#if 1
  /* 读取霍尔传感器 U 的状态 */
  if(HAL_GPIO_ReadPin(hallu_GPIO_Port, hallu_Pin) != GPIO_PIN_RESET)
  {
    state|= 0x01U << 0;
//                printf("u1\r\n");
  }
  
  /* 读取霍尔传感器 V 的状态 */
  if(HAL_GPIO_ReadPin(hallv_GPIO_Port, hallv_Pin) != GPIO_PIN_RESET)
  {
    state |= 0x01U << 1;
//                printf("v1\r\n");
  }
  
  /* 读取霍尔传感器 W 的状态 */
  if(HAL_GPIO_ReadPin(hallw_GPIO_Port, hallw_Pin) != GPIO_PIN_RESET)
  {
    state |= 0x01U << 2;
//                printf("w1\r\n");
  }
#else
  state = (GPIOH->IDR >> 10) & 7;    // 读 3 个霍尔传感器的状态
#endif
        //printf("stateL:%d\n",state);
  return state;    // 返回传感器状态
}

使用特权

评论回复
24
甲虫666|  楼主 | 2024-1-30 16:41 | 只看该作者

使用特权

评论回复
25
甲虫666|  楼主 | 2024-1-30 16:41 | 只看该作者
把电机霍尔接口接到板子上,用手转动电机,能看到串口打印出此时电机对应的霍尔编码值。

使用特权

评论回复
26
甲虫666|  楼主 | 2024-1-30 16:41 | 只看该作者

使用特权

评论回复
27
甲虫666|  楼主 | 2024-1-30 16:41 | 只看该作者
这个时候霍尔的状态值读回来了,也就是什么时候换相可以知道了,下一步就是驱动全桥电路,用3个普通PWM+3个普通IO口。

使用特权

评论回复
28
甲虫666|  楼主 | 2024-1-30 16:42 | 只看该作者
4 开环控制
(1)普通PWM cubemx配置

使用特权

评论回复
29
甲虫666|  楼主 | 2024-1-30 16:42 | 只看该作者
更改引脚名字

使用特权

评论回复
30
甲虫666|  楼主 | 2024-1-30 16:42 | 只看该作者
测试PWM是否正常输出,加入PWM启动代码和初始化占空比。
用万用表电压档,去测对应引脚电压是否符合占空比值。

使用特权

评论回复
31
甲虫666|  楼主 | 2024-1-30 16:42 | 只看该作者
在main里加入下面代码:
        HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
        HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
        HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,800);        //U
        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);        //V
        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0);        //W

使用特权

评论回复
32
甲虫666|  楼主 | 2024-1-30 16:42 | 只看该作者

使用特权

评论回复
33
甲虫666|  楼主 | 2024-1-30 16:43 | 只看该作者
(2)普通GPIO配置
cubemx

使用特权

评论回复
34
甲虫666|  楼主 | 2024-1-30 16:43 | 只看该作者
测试,在main中加入下代码
用电压档,测对应引脚是否正常输出电压。
//普通IO初始化,驱动3个下桥臂
        HAL_GPIO_WritePin(PWMUL_GPIO_Port,PWMUL_Pin,GPIO_PIN_RESET);//UL//GPIO_PIN_SET   GPIO_PIN_RESET
        HAL_GPIO_WritePin(PWMVL_GPIO_Port,PWMVL_Pin,GPIO_PIN_RESET);//VL
        HAL_GPIO_WritePin(PWMWL_GPIO_Port,PWMWL_Pin,GPIO_PIN_RESET);//WL

使用特权

评论回复
35
甲虫666|  楼主 | 2024-1-30 16:43 | 只看该作者

使用特权

评论回复
36
甲虫666|  楼主 | 2024-1-30 16:43 | 只看该作者
(3)开环控制
我的电机是2对极,60度霍尔,所以能用下面这个换相表。同类型电机可以用,不同的话就要网上找一下对应的换相表,然后改下对应代码。

使用特权

评论回复
37
甲虫666|  楼主 | 2024-1-30 16:43 | 只看该作者

使用特权

评论回复
38
甲虫666|  楼主 | 2024-1-30 16:43 | 只看该作者
在hall.c里加入换相代码

uint16_t state=0;
uint16_t pwm_pulse=0
void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)
{
        state = get_hall_state();
//        printf("%d\r\n",state);

        //513264
        switch(state)
        {
                case 1:    /* U+ W- */

                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,pwm_pulse);        //U+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);        //V+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0);        //W+
                        HAL_GPIO_WritePin(PWMUL_GPIO_Port,PWMUL_Pin,GPIO_PIN_RESET);//U-        //GPIO_PIN_SET   GPIO_PIN_RESET
                        HAL_GPIO_WritePin(PWMVL_GPIO_Port,PWMVL_Pin,GPIO_PIN_RESET);//V-
                        HAL_GPIO_WritePin(PWMWL_GPIO_Port,PWMWL_Pin,GPIO_PIN_SET);//W-
//                        printf("%d\r\n",pwm_pulse);
                        break;
               
                case 2:     /* V+ U- */

                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,0);        //U+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,pwm_pulse);        //V+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0);        //W+
                        HAL_GPIO_WritePin(PWMUL_GPIO_Port,PWMUL_Pin,GPIO_PIN_SET);//U-        //GPIO_PIN_SET   GPIO_PIN_RESET
                        HAL_GPIO_WritePin(PWMVL_GPIO_Port,PWMVL_Pin,GPIO_PIN_RESET);//V-
                        HAL_GPIO_WritePin(PWMWL_GPIO_Port,PWMWL_Pin,GPIO_PIN_RESET);//W-
                        break;
               
                case 3:    /* V+ W- */

                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,0);        //U+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,pwm_pulse);        //V+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0);        //W+
                        HAL_GPIO_WritePin(PWMUL_GPIO_Port,PWMUL_Pin,GPIO_PIN_RESET);//U-        //GPIO_PIN_SET   GPIO_PIN_RESET
                        HAL_GPIO_WritePin(PWMVL_GPIO_Port,PWMVL_Pin,GPIO_PIN_RESET);//V-
                        HAL_GPIO_WritePin(PWMWL_GPIO_Port,PWMWL_Pin,GPIO_PIN_SET);//W-
                        break;

                case 4:     /* W+ V- */

                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,0);        //U+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);        //V+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,pwm_pulse);        //W+
                        HAL_GPIO_WritePin(PWMUL_GPIO_Port,PWMUL_Pin,GPIO_PIN_RESET);//U-        //GPIO_PIN_SET   GPIO_PIN_RESET
                        HAL_GPIO_WritePin(PWMVL_GPIO_Port,PWMVL_Pin,GPIO_PIN_SET);//V-
                        HAL_GPIO_WritePin(PWMWL_GPIO_Port,PWMWL_Pin,GPIO_PIN_RESET);//W-
                        break;

                case 5:     /* U+  V -*/

                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,pwm_pulse);        //U+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);        //V+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0);        //W+
                        HAL_GPIO_WritePin(PWMUL_GPIO_Port,PWMUL_Pin,GPIO_PIN_RESET);//U-        //GPIO_PIN_SET   GPIO_PIN_RESET
                        HAL_GPIO_WritePin(PWMVL_GPIO_Port,PWMVL_Pin,GPIO_PIN_SET);//V-
                        HAL_GPIO_WritePin(PWMWL_GPIO_Port,PWMWL_Pin,GPIO_PIN_RESET);//W-
                        break;
               
                case 6:     /* W+ U- */

                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,0);        //U+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);        //V+
                        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,pwm_pulse);        //W+
                        HAL_GPIO_WritePin(PWMUL_GPIO_Port,PWMUL_Pin,GPIO_PIN_SET);//U-        //GPIO_PIN_SET   GPIO_PIN_RESET
                        HAL_GPIO_WritePin(PWMVL_GPIO_Port,PWMVL_Pin,GPIO_PIN_RESET);//V-
                        HAL_GPIO_WritePin(PWMWL_GPIO_Port,PWMWL_Pin,GPIO_PIN_RESET);//W-
                        break;

        }
}

使用特权

评论回复
39
甲虫666|  楼主 | 2024-1-30 16:44 | 只看该作者
更改pwm_pulse占空比值。然后就可以上电测试。!注意,上电前,一定确保你的这个换相逻辑和你的板子是对应起来的,别一上电上下桥同时导通,烧毁一切。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则