(标准库)直流无刷电机驱动(2)——霍尔传感器定时器初始化

使用通用定时器TIM4输入捕获获取hall的状态。

/* 霍尔传感器定时器 */
#define HALL_TIM           		    TIM4
#define HALL_TIM_CLK_ENABLE()  		do{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);}while(0)

#define HALL_AFIO_ENABLE()          do{RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);\
                                       GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);\
                                      }while(0)

/* 累计 TIM_Period个后产生一个更新或者中断		
	当定时器从0计数到65534,即为65535次,为一个定时周期 */
#define HALL_PERIOD_COUNT           (0xFFFF)

/* 高级控制定时器时钟源TIMxCLK = HCLK = 72MHz
	 设定定时器频率为 = TIMxCLK/HALL_PERIOD_COUNT/HALL_PRESCALER_COUNT=9.98Hz
   周期 T = 100 ms */
#define HALL_PRESCALER_COUNT        (110)													
																					
/* TIM4 通道 1 引脚 */
#define HALL_U_PIN           		  GPIO_Pin_12
#define HALL_U_GPIO_PORT     		  GPIOD
#define HALL_U_GPIO_CLK_ENABLE() 	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE)

/* TIM4 通道 2 引脚 */
#define HALL_V_PIN           		  GPIO_Pin_13
#define HALL_V_GPIO_PORT     		  GPIOD
#define HALL_V_GPIO_CLK_ENABLE() 	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE)

/* TIM4 通道 3 引脚 */
#define HALL_W_PIN           		  GPIO_Pin_14
#define HALL_W_GPIO_PORT     		  GPIOD
#define HALL_W_GPIO_CLK_ENABLE() 	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE)

#define HALL_TIM_IRQn               TIM4_IRQn


#define TIM_COM_TS_ITRx             TIM_TS_ITR0    // 内部触发配置(TIM4->ITR0->TIM1)

初始化霍尔定时器输入捕获参数

  //CH1
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;              
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;	 //下降沿捕获
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//映射到TI1上
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;	         //配置输入分频,不分频 
  TIM_ICInitStructure.TIM_ICFilter = 10;                         // 输入滤波
  TIM_ICInit(HALL_TIM, &TIM_ICInitStructure);

这个对其中一个通道作为说明:原本通道应该设为双边沿触发(霍尔其中一个引脚出现下降沿或者上升沿即触发中断),但是STM32的通用定时器TIMx,x=[2,3,4,5]不能进行双边沿触发(经过实测:双边沿触发实际为下降沿触发)!!

 对应设置的寄存器为CCER,原因是官方对CCER寄存器的位3:2保留,不能赋值0XA。

 

 解决方法可参考STM32定时器 输入捕获实现双边沿检测

                          STM32F103 设置双边沿触发输入捕获中断(TIM3 CH1)

设置霍尔传感器定时器为从定时器,触发主定时器TIMx,x=[1,8]产生PWM

TIM_SelectInputTrigger(HALL_TIM, TIM_COM_TS_ITRx);             //主从触发
TIM_SelectSlaveMode(HALL_TIM, TIM_SlaveMode_External1);        //设置HALL_TIM为从定时器

内部触发配置(TIM4->ITR0->TIM1)

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino霍尔无刷直流电机驱动是一种用于控制无刷直流电机的设备。无刷直流电机是一种高效、低噪音、长寿命的电机类型。 在使用Arduino驱动无刷直流电机之前,需要明确该电机的工作原理。无刷直流电机通过改变驱动电流的方向和大小来控制电机的转速和转向。霍尔传感器是一种常用于测量电流方向和大小的传感器。通过读取霍尔传感器的输出信号,可以确定电机的转轴位置和方向,并相应地改变驱动电流。 要使用Arduino驱动无刷直流电机,首先需要确定电机的运行参数,如额定电压和最大电流。然后连接Arduino和无刷直流电机的电路。一般情况下,需要使用电机驱动器与Arduino进行连接,电机驱动器可提供稳定的电流输出和保护电路,以防止电机过载或短路。 在Arduino程序中,需要使用适当的引脚和库函数来控制电机的转速和转向。使用PWM(脉冲宽度调制)信号来调节电机驱动电流的大小,从而控制电机的转速。通过改变PWM的占空比,可以调节驱动电流的大小。此外,根据霍尔传感器的输出信号来确定电机的位置和方向,并根据需要调整电机的运行状态。 总之,Arduino霍尔无刷直流电机驱动是一种用于控制无刷直流电机的设备,通过读取霍尔传感器的信号来确定电机的位置和方向,并使用Arduino的引脚和库函数来调节电机的转速和转向。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值