# 单关节实验平台 **Repository Path**: robinbirdgo/single_joint_exp ## Basic Information - **Project Name**: 单关节实验平台 - **Description**: 单关节实验平台内容 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 2 - **Created**: 2023-05-08 - **Last Updated**: 2024-11-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 单关节实验平台 git ### 介绍 单关节实验平台内容 注意:excel中的大部分单元格是内含公式的,单击就能在fx栏看到公式 ![image-20230624110355147](README.assets/image-20230624110355147.png) ### 误差分析 > - 受力不均:该平台的机构安装时可能存在锥齿轮的锥点没有重合/安装轴线严重不垂直的问题,导致**关节平台在上半周运动流畅,下半周(无标尺的区域)明显有很大的阻力**,这个会导致:上电位置在下半周区域内时可能因为阻力过大而导致电机堵转无法启动的问题/电机运动到该区域会有明显的减速(甚至在较小速度/电压时都只是依靠有一定的速度勉强过去,没被中间减速到0而已,但是太小的速度就会直接停转在这个区域)(电流环尤其注意) > - 电流环那里的时间测量误差比较大,是直接用手机时钟估算的 > - 编码器测速的结果略有一些不准确(因为是间隔0.01s的时间计算脉冲数,而低速下的这个结果比较小,容易有误差) ### 内容介绍 > 位置环速度环-旧版:不用管,只是怕写代码写崩了的备份 > > 增加前馈:不用管,是修正代码前的版本,可以跑,但是是凑出来的 1. 速度模式**开环**模型 > - 说明:该代码是仅输出一定值的uc,也就是控制电压(通过设定stm32的比较值来修改),来调节电机的速度,目的是测量该平台的等效阻尼 > > - 思路:由于存在误差(目前个人感觉是由于平台的机构传动在圆周上不均匀),所以和理论的速度模式阶跃响应后的结果不太一样,所以在平台旋转起来后的一段时间,将**测量的速度值取平均**,作为稳定时与阻尼力矩平衡的状态,同时对应的**电流值也是取平均**,用于**计算当前的电机输出力矩**,测量4组数据,最终用excel作线性回归求得拟合直线的斜率,即为Bm > > ![image-20230622174641740](README.assets/image-20230622174641740.png) > > - 代码部分:主要是测速,只在代码中以pulses/s为单位测量,在excel中需要用 > $$ > v_{rad/s} = \frac{v_{pulses/s}*2*\pi}{16*4*30} > $$ > 其中16是编码器分辨率;4是使用了四倍频;30是电机内部的减速比,编码器测量的是减速前的值(而电机真正输出的是减速后的速度) > > - 具体的**计算可以见excel表格的part-one** 2. 力矩模式\_or\_电流环 > - 说明:该部分代码是用于测量Im,即等效转动惯量。控制器采样电枢电流做pid,输出uc。 > > - 原理:有一定误差,但目前采用一个尽量减少误差的方案。由于本质上不是电流型驱动器,所以电流环是根据采样电流反馈来改变uc而间接控制的,所以电流、速度一直波动(包括最开始说的平台机构上的影响),所以还是使用平均值等效“恒定”区间的值(下面的表述都用恒定来描述等效的意义) > > 在一个电流目标值下,平台基本上会稳定在一个恒定速度,可测,此时的恒定电流可测,接着**改变电流目标值**,平台会加速,到下一个恒定状态,但由于电流为**恒定的新值**,那么电机输出的力矩也是一个可以算得的恒定值,再减去始末速度的平均值带来的阻尼力矩(假定阻尼系数恒定,并且把速度的变化给简化为线性),剩余值除以角加速度就是I值,多组结果求平均;中间加速时间是通过串口传输的数据行数来估计的 > $$ > \beta = \frac{\omega_{ed}-\omega_{st}}{t_{加速}}\\ > I = \frac{i_{new}*K_a - B_m *\overline{\omega}}{\beta} > $$ > > - 代码部分:这个部分数据较多,所以选用了串口传输,即重定向printf串口的传输函数完成格式化显示,需要测得电流值、速度值,用于后续计算,**详细可见excel表格的part-two** > > ![image-20230622215332750](README.assets/image-20230622215332750.png) 3. 位置速度环修正(这一部分的原理放最下面说) > - 说明: > > !!!!!!!!!!!!**只能给正的目标位置值**!!!!!!!!!!!!!!!! > > 可以上电后简单使用调试助手给目标位置来调试;若需要使用轨迹曲线请每次重新上电,因为初始位置在0(因为初始位置0这个总是比较准确的,但是每次要是先到一个指定位置再来的话就不一定是准确在指定未知的,观察的结果就不好) > > > > - 效果大概如下: > > 位置s曲线 > > ![image-20230528222109684](README.assets/image-20230528222109684.png) > > 速度s曲线 > > ![image-20230528222119519](README.assets/image-20230528222119519.png) 4. 增加速度前馈(这个指的是增加期望的速度值) > 位置s曲线 > > ![image-20230528230909528](README.assets/image-20230528230909528.png) > > 速度s曲线 > > ![image-20230528230925882](README.assets/image-20230528230925882.png) 5. 增加分散前馈(这个包括了可选的真·速度前馈和加速度前馈) > - 这个是加了速度前馈 > > 位置s曲线 > > ![image-20230530110419258](README.assets/image-20230530110419258.png) > > 速度s曲线 > > ![image-20230530110317607](README.assets/image-20230530110317607.png) > > - 这个是加了速度&加速度前馈 > > 位置s曲线 > > ![image-20230530111610871](README.assets/image-20230530111610871.png) > > 速度s曲线 > > ![image-20230530111521577](README.assets/image-20230530111521577.png) ### 位置-速度环的注释--所有相关计算见excel的part3 1. 在旧版的硬件中,由于编码器得到的结果,也就是直接求脉冲数,用于表示位置,所以在excel的计算中直接进行了预处理,来转换一下单位(以【0-1920】对应【0-2pi】(即1圈对应的pos值是1920)) 2. 用到的计算公式如下,计算思路相同,只是单位需要进行一些转换:所有与输出uc有关的参数都需要乘以一个系数来保证单位一致,因为(方便统一)理论计算中的输出uc是以V为单位的,而且速度的单位是rad/s,but在stm32代码中的速度单位是pulses/s(这个结果比较大,可以一定程度上减少测量误差),输出的结果是compare-value而不是直接uc,所以这两个地方使得所有直接与输出uc有关的参数都需要在理论的基础上修改。 ![image-20230508203620111](README.assets/image-20230508203620111.png) ![image-20230508203557325](README.assets/image-20230508203557325.png) ![image-20230508214437932](README.assets/image-20230508214437932.png) ![image-20230622225421067](README.assets/image-20230622225421067.png) 3. 具体参考这张图 ![b2a2433d3d31c9d4de71635b614e3ee](README.assets/b2a2433d3d31c9d4de71635b614e3ee.jpg) 4. 关于速度和加速度前馈部分:由于在定义好的轨迹函数中,已经算得的是以rad/s^2的速度和加速度,所以这里不需要进行上面的速度上的单位转换(当然对于uc->比较值的还是要有),直接按照理论值求即可 ### stm32时钟补充 主要针对电机伺服控制的周期和电流采样周期做一个简述,具体计算见excel-PART-4 - 电机伺服控制: 1. 以10ms为周期进行控制,用TIM6作为定时器来控制;TIM6的时钟来源是APB1,设定了一个预分频系数 2. 中断服务函数(也即伺服控制函数),为motor_pid_control函数,在TIM6定时中断(即每隔10ms)时就调用一次 - 电流采样: 1. 参考教程:(野火电流采集三讲)[基础部分-第5讲 直流有刷驱动板电流电压采集(1)_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1AZ4y1V7wt?p=10&vd_source=2d7aee534c0106401a858a7d6e7c51b3) 2. 时钟来源:使用ADC1,通道0,分辨率12位(采样一次需要**15倍**ADC时钟周期),而ADC1时钟来源于APB2,也有对应的预分频系数 3. 采样原理:测量采样用的电阻两端倍放大后的电压,经AD后得到采样值,再换算,DA求得电流值(mA为单位);带有10A的保护阈值 4. 滤波处理:两次平均滤波,效果已经比较好了。第一次每采样1024组数据(电压电流通道各一半),得到平均值并累积,第二次是每一次需要使用电流的采样值时,再把计算的累加平均电流采样值再平均,即get_curr_val;而且还在上电时预先获取了偏置电压(用于电流采样的),以得到真正的“电流零位”;(下图1是测试堵转时电流采样;图2是电机在给定点数电压下运转的电流采样图,可见采样结果平稳,且足够灵敏) ![image-20230702114151917](README.assets/image-20230702114151917.png) ![image-20230702114633025](README.assets/image-20230702114633025.png)