STM32 BLDC无刷直流电机 HALL霍尔硬件接口 程序

这里是使用STM32F103系列,其他型号可能略有区别

设置步骤:

1.首先HALL的IO口初始化

2.硬件HALL接口初始化

3.检测到hall信号变化会触发TIM5中断,中断处理进行电机换向

重点分析:

xx.TIM_Channel = TIM_Channel_1;是通道选择,这里只有通道1,也只能选择通道1,因为1/2/3通道最后都只能异或到通道1上,没有其他选择

xx.TIM_ICSelection = TIM_ICSelection_TRC;选择触发捕获,1/2/3通道被连在一起

TIM_SelectInputTrigger(TIM5, TIM_TS_TI1F_ED);                   //输入触发源选择,选择通道1  

xx.TIM_ICFilter = 0x04;//重点说一下滤波器,数据手册上解释的不够清楚,这里TIM5的时钟频率是84MHz,1个周期时间=1/84 ns;如果TIM_ICFilter=0,说明采样一个周期的信号就作为有效判断信号,例如前一刻IN=0,下一刻IN=1,这时开始捕获电平,那捕获多长时间作为有效判断呢,这个参数就是决定这个的,如果设定上升沿有效,TIM_ICFilter=0说明只需要采集1个周期(1/84 ns)的电平信号就来判断是否是上升沿,如果TIM_ICFilter=8那就是采集8*1/81 ns这么长时间再判断是否有上升沿,如果中间有一次电平不一样,则重新采样计数,知道连续8次的电平一样才作为判断依据;

滤波器其实是为了抗干扰,因为会有电磁干扰进入引脚,就相当于按键的多次计数软件滤波

另外说明:使用定时器5计数溢出中断,这个是为了计算hall跳变换相时间间隔,用来计算速度

代码分享:

void HALL_IO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStre;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

    GPIO_InitStre.GPIO_Pin=HALL_U_Pin|HALL_V_Pin|HALL_W_Pin;
    GPIO_InitStre.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
    GPIO_InitStre.GPIO_Speed=GPIO_Speed_10MHz;
    GPIO_Init(GPIOA,&GPIO_InitStre);    
}
/**********************************************************************/
//名称:void HALL_InterIO_Init(void)
//功能:HAll信号外部中断初始化
//参数:无
//返回:无
/**********************************************************************/
void HALL_InterIO_Init(void)
{
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    HALL_IO_Init();//Hall IO基本初始化
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
    //初始化定时器 84MHz
    TIM_TimeBaseInitStre.TIM_Prescaler=84-1;//1MHz
    TIM_TimeBaseInitStre.TIM_Period=0xFFFF-1;//计数65535=65.535ms
    TIM_TimeBaseInitStre.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInitStre.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInitStre.TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStre);


    //CC1S=01     选择输入端 IC1映射到TI1上
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;// 注意只有一个通道|TIM_Channel_2|TIM_Channel_3;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;//双边沿触发
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//配置输入分频,不分频 
  TIM_ICInitStructure.TIM_ICFilter = 0x04;//滤波器
    TIM_ICInit(TIM5,&TIM_ICInitStructure);  

  /* 配置TIM为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
    
    TIM_SelectHallSensor(TIM5,ENABLE);                          //使能TIMx的霍尔传感器接口,同时异或映射
  TIM_SelectInputTrigger(TIM5, TIM_TS_TI1F_ED);                   //输入触发源选择    
  
    TIM_SelectSlaveMode(TIM5, TIM_SlaveMode_Reset);                 //从模式选择为复位模式
  TIM_SelectMasterSlaveMode(TIM5, TIM_MasterSlaveMode_Enable);    //主从模式选择 使能
   /* 允许更新中断 ,允许CC1IE捕获中断     */
  TIM_ITConfig(TIM5, TIM_IT_Trigger, ENABLE);//
  /* 使能定时器 */
  TIM_ClearITPendingBit(TIM5,TIM_IT_Trigger);//清除触发中断标志

     TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);//使能溢出中断
     TIM_ClearITPendingBit(TIM5, TIM_IT_Update);//清除中断

     TIM_ARRPreloadConfig(TIM5,ENABLE);//自动装载 
     TIM_Cmd(TIM5, ENABLE);//使能
}

/**********************************************************************/
//名称:void EXTI15_10_IRQHandler(void)
//功能:Hall TIM5输入捕获中断服务函数
//参数:无
//返回:无
/**********************************************************************/
void TIM5_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM5,TIM_IT_Trigger)!=RESET)
    {
        HAll_ChangePhase();//电机换相

    TIM_ClearITPendingBit(TIM5,TIM_IT_Trigger);
    }

    if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
    {
        Count++;//溢出次数

    TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
    }


}    

  • 10
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: STM32F030是意法半导体(STMicroelectronics)所推出的一款微控制器,它采用了ARM Cortex-M0内核,具有高性能和低功耗的特点。 BLDC无刷直流)电机是一种基于永磁体和电子换向器的电机,它不需要使用传统的换向装置,因此具有可靠性高和寿命长的优点。 在使用STM32F030控制BLDC电机时,我们可以结合STM32 Cube软件进行开发。首先,我们需要配置GPIO口以控制电机的相位和PWM信号的输出。接下来,我们可以使用定时器模块产生PWM信号,以控制电机的转速和转向。同时,我们还可以使用外部中断或定时器中断来检测电机位置,以实现电机的换向操作。 为了更好地控制BLDC电机,我们可以使用编码器或霍尔传感器来获取电机位置反馈。根据反馈信息,我们可以实现闭环控制算法,如PID控制器,来调节电机的转速和位置。 另外,STM32F030还提供了多种通信接口,如UART、SPI和I2C,可以用于与外部设备进行通信,如编码器、传感器或主机控制器。这些接口可以使我们实现更复杂的功能,如电机的速度控制、位置控制和故障诊断等。 总之,通过使用STM32F030微控制器,结合BLDC无刷直流电机驱动技术,我们可以实现高效、可靠的电机控制系统,并且可以通过外部设备进行通信和反馈控制。 ### 回答2: STM32F030是一种32位的微控制器,适用于许多应用,包括直流无刷电机控制。BLDC电机是一种无刷直流电机,具有高效率、高功率密度和长寿命等优点。 要控制BLDC电机,需要使用PWM信号来驱动电机的三相线圈。STM32F030提供了多个PWM通道输出,可以方便地生成PWM信号。 首先,通过STM32的GPIO功能,将PWM通道与电机的三个线圈连接起来。然后,在STM32的引脚复用寄存器中配置这些引脚为PWM输出。 接下来,在STM32的定时器中,设置一个适当的周期和占空比来产生PWM信号。通过调整占空比,可以控制BLDC电机的转速。 同时,还可以使用STM32的定时器中断功能,来编写中断服务程序,以便进行电机控制算法的实现。例如,可以采用传感器无刷电机控制算法,测量并反馈电机角度,根据反馈调整PWM信号,使电机能够按照预期转动。 此外,STM32F030还具有丰富的通信接口,例如USART、SPI和I2C,可用于与外部设备进行通信,如编码器、传感器或其他控制器。 总之,通过使用STM32F030微控制器,可以方便地控制BLDC直流无刷电机,实现高效、精确和可靠的电机控制。 ### 回答3: STM32F030是一款32位微控制器,BLDC代表无刷直流电机,代表一种电机技术,即无刷直流电机。因此,STM32F030 BLDC直流无刷电机指的是使用STM32F030微控制器控制的无刷直流电机无刷直流电机是一种先进的电机技术,相较于传统的有刷直流电机具有更高的效率和可靠性。它由三个电感和永磁体组成,通过控制不同相位的电流来产生旋转力,并且无需碳刷与电机转子直接接触,减少了机械磨损和摩擦。 STM32F030是一款强大的微控制器,具备高性能和低功耗的特点。它具有丰富的外设资源,包括定时器、PWM输出、ADC、I2C、USART、SPI等接口,可以方便地实现对BLDC无刷直流电机的控制。同时,STM32F030还具有强大的编程和调试支持,可提供图形化编程环境和多种开发工具,使开发者可以快速开发和调试BLDC电机的控制程序。 使用STM32F030控制BLDC无刷直流电机的过程大致分为以下几个步骤:首先,通过PWM输出控制引脚,向电机的三个相位输入电流;其次,利用定时器和编码器测量电机的转速和位置,以便实现闭环控制;最后,根据实际需求,通过PID算法或其他控制策略,调整输入电流或PWM占空比,以实现对电机转速、位置和扭矩的精确控制。 总之,STM32F030微控制器在BLDC直流无刷电机的应用中具有广泛的应用前景,开发者可以通过合理的设计和编程,实现对BLDC电机的高效控制和优化性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值