STM32HAL库电机开发-速度环-位置式PID-无刷直流电机

工作原理

无刷电机和有刷电机不同,无刷电机采用三相控制,大概是这样,原理就是安培定则,也叫右手螺旋定则,电生磁来控制转子,也就是说我们需要输出的pwm波有三条通道。
在这里插入图片描述
无刷电机用到的传感器是霍尔传感器。霍尔传感器是根据霍尔效应制作的一种磁场传感器。霍尔效应:当电流垂直于外磁场通过半导体时, 载流子发生偏转,垂直于电流和磁场的方向会产生一附加电场,从而在半导体的两端产生电势差, 这一现象就是霍尔效应,这个电势差也被称为霍尔电势差。

在BLDC中一般采用3个开关型霍尔传感器测量转子的位置,由其输出的3位二进制编码去控制三相六臂全桥中的6 个MOS管的导通实现换相。如果将一只霍尔传感器安装在靠近转子的位置,当N极逐渐靠近霍尔传感器即磁感器达到一定值时, 其输出是导通状态;当N极逐渐离开霍尔传感器、磁感应逐渐小时,其输出仍然保持导通状态; 只有磁场转变为S极便达到一定值时,其输出才翻转为截止状态。在S和N交替变化下传感器输出波形占高、 低电平各占50%。如果转子是一对极,则电机旋转一周霍尔传感器输出一个周期的电压波形,如果转子是两对极, 则输出两个周期的波形。
在直流无刷电机中一般把3个霍尔传感器按间隔120度或60度的圆周分布来安装,如果按间隔120度来安装, 则3个霍尔传感器输出波形相差120度电度角,输出信号中高、低电平各占180度电度角。 如果规定输出信号高电平用“1”表示,低电平用“0”表示,则输出的三个信号可以用三位二进制码表示, 如下图所示。
在这里插入图片描述
转子每旋转一周可以输出6个不同的信号,这样正好可以满足我们条件。只要我们根据霍尔传感器输出的值来导通MOS管即可。 通常厂家也会给出真值表。一般有两个,一个是对应顺时针旋转,另一个对应的是逆时针旋转。配套电机的真值表如下。
在这里插入图片描述
上表的意思是:当检测到的3个霍尔传感器的值,则导通对应值的MOS管。例如,检测到霍尔a、 霍尔b和霍尔c分别为0、0和1,则导通B-和C+对应的MOS管,其他MOS管都要处于截止状态。 当导通对应的MOS管后电机就会旋转一个角度,旋转到下一个霍尔值改变为101,这时在关闭B-和C+, 导通A+和B-,这样电机有将会旋转一个角度直到下一个霍尔值改变, 只要我们按表中的霍尔值导通对应的MOS管电机就可按一定的方向旋转。

软件设计

  1. 基础定时器产生定时更新执行回调函数
    在这里插入图片描述

  2. 回调函数判断是否堵转保护电路

  3. 回调函数执行pid控制函数bldcm_pid_control()
    在这里插入图片描述

  4. pid控制函数获得电机转动速度,判断执行pid计算,判断运行方向,根据pid计算返回值设置电机速度函数set_bldcm_speed()
    在这里插入图片描述

  5. 电机控制函数输出pwm波控制函数set_pwm_pulse在这里插入图片描述

  6. pwm控制函数对通道进行占空比调整,再对三相进行换相HAL_TIM_TriggerCallback。

  7. 换相函数中调取函数get_hall_state获取霍尔传感器的状态作为换相的依据,判断正反转之后进行换相来,换相函数中进行pwm波输出。
    在这里插入图片描述

mian.c中的控制速度是调控pwm波占空比的多少。
在这里插入图片描述
霍尔传感器采用输入捕获模式,三个通道捕获。
无刷电机的多环控制是,类比于有刷电机的多环控制。采用双环,原因是野火无刷电机驱动板上没有电流检测。

void bldcm_pid_control(void)
{
  int32_t location_actual = get_motor_location();   // 电机旋转的当前位置

	
  if (bldcm_data.is_enable)
  {
    float cont_val = 0;    // 当前控制值

		cont_val = location_pid_realize(&pid_location, location_actual);    // 进行 PID 计算
		
		/* 目标速度上限处理 */
		if (cont_val > TARGET_SPEED_MAX)
		{
			cont_val = TARGET_SPEED_MAX;
		}
		else if (cont_val < -TARGET_SPEED_MAX)
		{
			cont_val = -TARGET_SPEED_MAX;
		}
		
		set_pid_target(&pid_speed, cont_val);    // 设定位置的目标值
		
		#if defined(PID_ASSISTANT_EN)
			int32_t temp = cont_val;
			set_computer_value(SEND_TARGET_CMD, CURVES_CH2, &temp, 1);     // 给通道 2 发送目标值
		#endif
	
		
		int32_t actual_speed = get_motor_speed();
		cont_val = speed_pid_realize(&pid_speed, actual_speed);    // 进行 PID 计算
		if (cont_val < 0)
		{
				cont_val = -cont_val;
				bldcm_data.direction = MOTOR_REV;
		}
		else 
		{
				bldcm_data.direction = MOTOR_FWD;
		}

		cont_val = (cont_val > PWM_PERIOD_COUNT) ? PWM_PERIOD_COUNT : cont_val;  // 上限处理

		set_bldcm_speed(cont_val);
		
	#if defined(PID_ASSISTANT_EN)
		set_computer_value(SEND_FACT_CMD, CURVES_CH2, &actual_speed, 1);      // 给通道 2 发送实际值
		set_computer_value(SEND_FACT_CMD, CURVES_CH1, &location_actual, 1);     // 给通道 1 发送实际值
	#else
		printf("实际值:%d, 目标值: %.0f,控制值: %.0f\n", location_actual, get_pid_target(), cont_val);
	#endif
	}
	
}
  • 8
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STM32直流无刷电机电路图是用来控制直流无刷电机的电路图。直流无刷电机是一种无刷电机,它通过改变电机转子上的磁场来实现转子的转动,而不需要使用传统的换向器。STM32是一款由ST公司推出的高性能32位微控制器。 在STM32直流无刷电机电路图中,通常包含以下几个主要部分:控制模块、功率模块、电机驱动模块和传感器模块。 控制模块是用来控制整个电机系统的大脑,通常使用STM32微控制器。STM32具有较高的计算能力和丰富的外设接口,可以实现精确的电机控制算法。 功率模块主要用于控制电机的供电。它通常包括高性能的电源管理电路,能够为电机提供稳定可靠的电源。 电机驱动模块是用来实现电机的驱动控制的部分。它通常包括电机驱动芯片,用于控制电机的相序和功率输出。电机驱动芯片可以根据控制模块的指令,控制电机的转向、转速和力矩等参数。 传感器模块是用来感知电机运行状态的部分。它通常包括位置传感器、速度传感器和电流传感器等。这些传感器可以将电机的实时状态反馈给控制模块,以便调整电机的控制策略。 总之,STM32直流无刷电机电路图是用来控制直流无刷电机的电路图。它由控制模块、功率模块、电机驱动模块和传感器模块等部分组成,能够通过STM32微控制器精确控制电机的运行状态和性能。 ### 回答2: STM32是一种广泛使用的微控制器,用于控制各种电子设备和系统。直流无刷电机是一种高效的电机类型,常用于工业和汽车应用中。下面是一个简单的STM32直流无刷电机电路图的描述。 在STM32直流无刷电机电路图中,首先需要一个STM32微控制器。微控制器负责控制无刷电机的速度和方向。通过配置和编程,可以实现精确的电机控制。 接下来,需要一个无刷电机驱动器。电机驱动器负责将来自STM32微控制器的控制信号转换为电机所需的电流和电压。电机驱动器通常使用MOSFET或IGBT作为开关元件。 然后,还需要一个无刷电机本身。电机的型号和参数根据具体应用需求选择。无刷电机通常由三个相互独立的绕组组成,每个绕组与电机驱动器的三个输出相连。 另外,还需要一些附加元件,如电源电路、电流传感器和保护电路。电源电路为整个系统提供所需的电源。电流传感器用于监测电机的电流,以确保电机工作在安全范围内。保护电路可以保护电机和其他部件免受过载、短路和过热等不良情况的损坏。 最后,从STM32微控制器到电机驱动器和电机之间需要进行适当的连接,使用电缆或连接器来实现信号和电源的传输。 通过以上组件的组合和连接,可以实现STM32直流无刷电机电路图。这样的电路可以用于各种应用,如机器人、自动化设备、电动汽车等,以实现精确和高效的电机控制。有了该电路图,开发者可以进一步进行软件编程和电机参数调整,以实现所需的功能和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值