LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

iic_servo

2022/7/20

复现IIC舵机

稚晖君将普通舵机魔改成了IIC舵机,尝试从原理上复现一下

项目地址:https://github.com/peng-zhihui/ElectronBot/tree/main/1.Hardware/ServoDrive


电路原理

拆开舵机可以发现,里面主要是电机,电位器,齿轮组。

简单来讲实现闭环就是电机输出,齿轮组传动,读电位器位置,闭环。


稚晖君设计的舵机板,需要拆开舵机底座,替换掉电路板

将舵机板的A、V、G口对应连接电位器的ADC采样、VCC、GND口、舵机板的OUT1、OUT2口对应电机输出。

主要实现功能是外部发送期望角度主控芯片闭环控制电机以及电机转动时将角度数据发送给外部。


电位器引脚确定

电位器可以理解成滑动变阻器,有三个引脚,其中两个脚的阻值不随转动变化。


对于舵机,我们只能通过拧舵机进而调节电位器,需要安装好舵盘。

而舵机拧到底也不一定对应电位器拧到底,故用电表笔通断档测是不行的,需要用电阻档。

把舵盘沿任一方向拧到底,分别记录三个引脚各自的电压。

把舵盘沿反方向拧到底,分别记录三个引脚各自的电压。

假设三个引脚为ABC,我测量的电压如下:

AB AC BC
一个方向拧到底 0.003千欧 5.1千欧 5.1千欧
另一个方向拧到底 4.97千欧 5.1千欧 0.2千欧

这样就可以判断B脚是阻值变化脚了,而另外两个不关键,正反接决定了不同转向对应电阻的增大还是减少。

电机驱动采用FM116B,输入两个PWM,输出两个信号。

这两个输出引脚接到电机的两个引脚,同样正反接决定了正反转。


FM116B逻辑如下:

IN1 IN2 OUT1 OUT2 功能
L L Z Z 停止
H L H L 正转
L H L H 反转
L L L L 刹车

软件实现

用到了F0芯片,要安装芯片包,链接:https://www.keil.com/dd2/Pack/

配置ADC和PWM,测试确定一下电位器的增减方向以及电机的正反转方向。

PID的控制就较为简单了,电位器的最大值和最小值对应着角度的最大值和最小值。

控制所需的角度值,转化为对应的电位器的值,作为PID的偏差进行控制即可。

放一段主要代码:

while (1)
{
	if(HAL_OK == HAL_ADC_PollForConversion(&hadc, 50))
	{
		now_value = HAL_ADC_GetValue(&hadc);
		target_value = Angle2Potentiometer(target,0.0,180.0,Potentiometer_min,Potentiometer_max);
		PID_Calc(Servo_PID_ptr,now_value,target_value,500);
		if(Servo_PID_ptr->Output>0)
		{
			TIM3->CCR1 = 0;
			TIM3->CCR2 = Servo_PID_ptr->Output;
		}
		else
		{
			TIM3->CCR1 = -Servo_PID_ptr->Output;
			TIM3->CCR2 = 0;
		}		
	}
	
	HAL_Delay(1);
}