无障碍轮椅—— 520编码器直流减速电机

编码器分类

  1. 霍尔编码器(磁式)
  2. 光电编码器(光学式)
    在这里插入图片描述
  • 光电编码器容易收到环境光影响

产品参数

在这里插入图片描述

  • 电机的额定电压为12V,则TB6612FNG电机驱动的VM口一般也是12V

电机型号说明

在这里插入图片描述

电机选型

在减速电机内部马达不变的情况下,减速箱内齿轮减速比与转速和扭矩之间的关系

减速比转速与扭矩适用情况
1:19高转速,低扭矩竞速类小车
1:30转速适中,扭矩适中平衡车
1:56低转速,大扭矩越野车

接线说明

在这里插入图片描述

为什么使用直流减速电机

  1. 降低电机速度
  2. 提高输出扭矩

减速电机速度和扭矩根据减速比进行换算

编码器输出说明

在这里插入图片描述

编码器接口测速

STM32——TIM编码器接口

  • 编码器接口测速的使用场景:使用PWM驱动电机,再使用编码器(无接触式的霍尔传感器或光栅)测量电机速度,再用PID算法实现闭环控制

  • 电机测速使用双输出的正交霍尔编码器输出,这种旋转编码器不仅可以测量速度还可以测量旋转方向,编码器的两组A/B输出相位差90度的300个双相脉冲。想要使用脉冲信息测量速度,首先使用定时器定时50ms。编码器转一圈会发送脉冲,一个脉冲可以产生一个中断,在中断函数里令一个变量自加,每产生一个脉冲总脉冲数就加一。之后用脉冲数/300就可得到在这50ms内电机转动得圈数,乘以20就是每秒钟转的圈数。

### 霍尔编码器与减速电机的PID控制实现 #### 硬件基础 霍尔编码器作为一种旋转式传感器,能够将角位移或角速度转换成一串电信号脉冲[^2]。这种特性使得霍尔编码器非常适合用于测量电机轴的位置变化以及计算其转动的速度。 对于直流减速电机而言,在应用霍尔编码器时需要注意的是,所获得的编码器数值反映的是未经减速处理前的状态。因此为了得到真实的电机转速信息,需要通过特定的比例关系来进行换算[^3]。 #### PID算法理论基础 PID控制器由比例(P)、积分(I)和微分(D)三个部分组成,旨在最小化设定目标值(setpoint)与当前过程变量(process variable)之间的误差(error)[^1]。具体来说: - **D项**:预测未来的趋势来提前调整输出; 这些组件共同作用可以有效提高系统的响应性能和平稳度。 #### PID控制的相关代码模块 ##### 准备电机驱动模块 首先定义一个函数用来设置PWM占空比从而改变电机的速度方向等属性: ```python def set_motor_speed(pwm_value, direction): """Set motor speed and direction using PWM.""" if pwm_value > 0: pin_A.high() pin_B.low() elif pwm_value < 0: pin_A.low() pin_B.high() abs_pwm = min(abs(pwm_value), MAX_PWM) timer.channel(1).pulse_width_percent(abs_pwm) ``` ##### 增量式PID模块 接着创建增量式的PID类以便后续调用: ```python class IncrementalPID(object): def __init__(self, kp=0.8, ki=0.5, kd=0.01): self.kp = kp self.ki = ki self.kd = kd self.last_error = 0 self.integral = 0 def compute(self, current_value, target_value): error = target_value - current_value p_out = self.kp * error i_out = self.ki * (error + self.integral) d_out = self.kd * (error - self.last_error) output = p_out + i_out + d_out self.integral += error self.last_error = error return max(min(output, MAX_OUTPUT), MIN_OUTPUT) ``` ##### 编码器读取计数模块 最后编写一段程序周期性地从硬件接口处获取最新的位置数据,并据此更新内部状态机中的角度/圈数记录: ```python import pyb encoder_pin_a = pyb.Pin('X1', pyb.Pin.IN) encoder_pin_b = pyb.Pin('X2', pyb.Pin.IN) position_counter = 0 def update_encoder_position(): global position_counter state = encoder_pin_a.value() | (encoder_pin_b.value() << 1) # Update counter based on A/B phase relationship... ... ``` #### PID控制电机主控代码效果展示 当所有上述功能都准备好之后就可以进入核心逻辑环节了——即不断循环检测实际测得的角度偏差并通过PID运算得出合适的校正指令发送给执行机构直至达到预期的工作模式为止. ```python pid_controller = IncrementalPID(kp=KP_VALUE, ki=KI_VALUE, kdKD_VALUE) while True: measured_angle = read_encoder_position() desired_angle = get_target_angle_from_somewhere_else() correction_signal = pid_controller.compute(measured_angle, desired_angle) set_motor_speed(correction_signal, determine_direction()) wait_for_next_sample_time() ``` #### PID调节技巧 在调试过程中可能遇到振荡过大或者反应迟缓等问题,则需适当增减各系数大小直到找到最佳平衡点; 同时也可以考虑引入防风区机制防止过度修正造成反向冲击现象的发生.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值