请选择 进入手机版 | 继续访问电脑版
快捷导航
53 373

基于PID的滚球控制系统

adidas5201214 于 2018-12-19 15:42 发表在 [开源项目] [复制链接]

注册后可查看大图哦

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 adidas5201214 于 2018-12-26 08:55 编辑

项目名:基于PID的滚球控制系统

一、参与人员
       Jump(张钊荣)、@TK(田孝坤)、asura(徐硕)、吴先森(吴虎)、哇哈哈哈哈(邵慧娟)、adidas5201214(张建)

二、项目概述
   滚球控制系统,使用MPU6050六轴加速度传感器检测小球位置,将获取的小球位置信息,传送给M3。然后通过M3
实现的PID算法来计算PWM,将PWM输出至舵机来控制转角。舵机开始工作后,MPU6050六轴加速度传感器采集模块不
断采集当前小球位置坐标状态,并与之前的坐标状态比较,使得小球的运动状态逐渐趋向于平稳。

三、功能需求1.小球位置的获取
使用MPU6050六轴加速器传感器检测小球的实时位置信息,将有效的位置信息传给M3板子,M3板子使用Matlab算法计算小球运动信息;
2.小球运动轨迹的控制
M3板子将小球位置信息处理后,通过算法公式输出为对应舵机转动的角度,通过舵机转动角度的配合,完成小球轨迹的控制;

四、项目模块1.采集模块
       MPU6050六轴加速度传感器负责采集小球在平板上的位置,这里的主要难点是传感器对小球的实时位置获取。产品采用的底板是正方形,
小球的位置时刻在变化,需要将传感器放到底板上实时检测并采集数据。
2.数据处理
       通过对MPU6050六轴加速度传感器检测到的小球平衡数据(包含三轴陀螺仪检测出平衡板的倾斜角数据、三轴加速计检测平衡板的加速度数据)
传输到M3板子,并进行分析建立模型。
       1、根据平板倾斜角数据和小球加速计数据,建立PD模型,测出小球的下一位置,用Matlab进行仿真设计,模拟小球运动轨迹,观察小球的的
超调量,作为程序中重要参考值。
       2、正交摇臂支撑数据的计算,通过平板与水平方向的夹角,以及支撑架的长度和舵机转轴中心距中心点投影距离,由三角函数计算得到摇杆
的长度和舵机半轴。
3.机械控制
       采用PID算法,平板转动角度比例P对舵机角速度进行比例调整,即对平板转动角度调整。角度误差积分I:使系统消除稳态误差.提高无差度。
角度微分D:微分作用反映平板角度的变化率,即角速度。具有预见性,能预见偏差变化的趋势因此能产生超前的控制作用,在偏差还没有形成之前,
已被微分调节作用消除。舵机开始工作后,MPU6050六轴加速度传感器采集模块不断采集当前小球位置坐标状态,并与之前的状态比较,使得
小球的运动状态逐渐趋向于平稳。

五、项目所需材料
1、尺寸为30cm*30cm有色板+底板(集资购买)
2、直径约2cm有色小球(集资购买)
3、四个正交摆臂支架+支撑支架(集资购买)
4、四个舵机(实验室自备)
5、MPU6050加速度传感器(集资购买)
6、M3板子(实验室自备)

六、项目分工
1、张建负责MPU6050的配置与算法
2、田孝坤负责PID算法
3、吴虎负责舵机控制的算法
4、张钊荣、徐硕负责材料的采购以及组装
5、邵慧娟负责编写文档


Connecting & Messaging from Any.

共 53 个关于本帖的回复 最后回复于 2019-1-9 19:50

adidas5201214 注册会员 发表于 2019-1-9 19:50:20 | 显示全部楼层
距离项目答辩还剩一天了,昨晚我们小组有两个人在实验室干通宵,真的很谢谢他俩。项目开始到现在,基本上蛮顺利的,直到最后发现项目不可行了(被舵机给耽误了,所以以后要长点心眼多留意一点,技术在牛,也干不过一个小细节)。我们之前的所有准备工作都做好了,也没觉得好失望的,重要的是我们这组人心齐就行了,大家都在忙没人划水。技术不能决定一切,但人心可以决定我们能走多远。
Connecting & Messaging from Any.
举报 使用道具
吴先森12 新手上路 发表于 2019-1-7 23:09:56 | 显示全部楼层
  今天继续将整合好的代码测试板球系统,两个舵机始终朝一个方向转动,判断错误可能是PID算法出错。经过调试排除可能是PID算法的错误,舵机代码也并没有错误。
  用示波器检测PWM波形,发现PWM波形不正确。求助李亮学长,学长用万用表和示波器等检测PWM波形,检测出大部分杜邦线以及舵机都存在问题。也就是说是
  因为舵机是坏的,才无法按照正确的角度正反旋转。时间已近不多了,临时买舵机可能来不急。先用检测出来的正确舵机测试系统,临走之前测试一遍,舵机已近可以按照
  正确的角度正反旋转。
Connecting & Messaging from Any.
举报 使用道具
吴先森12 新手上路 发表于 2019-1-6 22:28:58 | 显示全部楼层
  今天彻底解决舵机问题,简述下问题的所在,mpu先初始化影响了舵机的引脚。pass:比较玄学,但问题是真的,折磨我很久
下午测试后,mpu获取的pitch值能够驱动舵机。
  解决问题时,也更换过输出引脚,检查过MPU6050,都没有问题。
Connecting & Messaging from Any.
举报 使用道具
吴先森12 新手上路 发表于 2019-1-6 22:25:30 | 显示全部楼层
   下午把舵机完全调试成功。
    中间遇到了一个问题:舵机模块和MPU6050模块一起写的时候,舵机1没有转动、舵机2转动。
    刚开始以为是舵机代码出现问题,经过调试并没有发现舵机错误。经过弹幕调试,逐步排除发现注释掉MPU6050功能之后,两个舵机可以同时运转,而加上
    MPU6050功能,舵机1就不会转动。假设1:舵机1 的引脚与MPU6050冲突。假设2 :MPU6050有错误。
    测试方法:更换输出引脚。但没有解决问题。
    MPU6050也检查出没有问题。
    将MPU6050配置代码和PWM配置代码调换之后,很神奇的可以用了。猜测有可能是GPIOA复用太多出错。
    但感觉像学长说的很玄学。。。。
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2019-1-6 21:36:01 | 显示全部楼层
今天彻底解决舵机问题,简述下问题的所在,mpu先初始化影响了舵机的引脚。pass:比较玄学,但问题是真的,折磨我们组虎哥很久
下午测试后,mpu获取的pitch值能够驱动舵机。即这两个模块融合完毕
明天将测试三个模块共同配合实现平台。
Connecting & Messaging from Any.
举报 使用道具
吴先森12 新手上路 发表于 2019-1-5 22:16:51 | 显示全部楼层
本帖最后由 吴先森12 于 2019-1-5 22:18 编辑

    小组三个模块:MPU6050配置、PID算法、舵机控制配置已经全部分别打通。今天将整合好的代码放在一起测试,板球系统没有反应,小组都很急躁。刚开始
   感觉应该是PID没有向舵机传送正确的数据但没有分析出错误的原因。听了宁哥的建议,把模块两两测试。晚上通过将mpu和舵机整合来排除硬件错误问题,发现板子本身pb8引脚硬件损坏,后又发现程序中初始化的频率为200hz无法配和stm32使用,解决方案1,改为50hz  2,将psc增大4倍。暂时选择方案为增大四倍。增大4倍后,舵机有了反应可以转动,但不是理想状态。
   明天继续将两个模块整合在一起,加油!
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2019-1-5 22:09:43 | 显示全部楼层
主要模块:mpu6050,舵机mg996r,pid算法。已全部打通,虽然板子引脚对应的舵机控制存在问题,已不影响任务
下午开始的模块整合,发现很严重的问题,各个模块放在一起后整体构件完全无法工作,考虑到以下存在问题:接口问题,硬件问题,代码算法问题
晚上通过将mpu和舵机整合来排除硬件错误问题,发下板子本身pb8引脚硬件损坏,后又发现程序中初始化的频率为200hz无法配和stm32使用,解决方案1,改为50hz  2,将psc增大4倍。暂时选择方案为增大四倍。
今天留下的任务:尚未将以上两个模块整合完成
明天任务:将全力打通这两个模块
Connecting & Messaging from Any.
举报 使用道具
adidas5201214 注册会员 发表于 2019-1-5 21:00:32 | 显示全部楼层
本帖最后由 adidas5201214 于 2019-1-5 21:02 编辑

        今天好迷茫,项目的模块都打通了,等组合到一起时什么反应都没有。在调整了浪费了很多时间,但还是没有解决感觉好迷茫。也考虑过先两个两个整合,等分模块整合可以后再考虑全部整合,也没弄好。我估计是我们程序有问题,也有可能是我们的一些参数没有调整好。明天还要继续调整,另外PID算法还在看争取将它的原理弄懂。今天就写到这里吧!


Connecting & Messaging from Any.
举报 使用道具
asura 新手上路 发表于 2019-1-4 21:06:07 | 显示全部楼层
小组单个舵机的控制代码已经初步完成了,今天参考了下用板子的定时器修改不同通道的比较寄存器的值来产生多路pwm输出来控制更多的舵机。

TIM_HandleTypeDef TIM3_Handler;         //定时器句柄
TIM_OC_InitTypeDef TIM3_CH1Handler;     //定时器3通道1句柄
TIM_OC_InitTypeDef TIM3_CH2Handler;     //定时器3通道2句柄
TIM_OC_InitTypeDef TIM3_CH3Handler;     //定时器3通道3句柄
TIM_OC_InitTypeDef TIM3_CH4Handler;     //定时器3通道4句柄

参考链接:https://blog.csdn.net/weixin_37127273/article/details/80492288?tdsourcetag=s_pcqq_aiomsg
Connecting & Messaging from Any.
举报 使用道具
Jump 注册会员 发表于 2019-1-4 20:53:55 | 显示全部楼层
舵机今天是两个都可以控制转动,代码调试差不多,需要将舵机和昨天安装在支架上的M3板子和传感器连接上,代码烧进去M3后,我将设备连接了起来,调试了下,基本没问题。
Connecting & Messaging from Any.
举报 使用道具
吴先森12 新手上路 发表于 2019-1-4 20:38:59 | 显示全部楼层
   今天我很痛苦,昨晚调试的代码今天却不能使用了。控制舵机的代码基本都大致相似,可是代码所反馈的效果却不尽人意,舵机始终没有按照代码的逻辑转动。
   经过弹幕调试和参数的不断测试,也没有发现代码上的错误。根据猜测,唯一的可能就是PWM的输出信号引脚不同。然后经过网上查询TIM复用引脚,确定了
   以PA11 PA8 两个引脚分别输出两个舵机上。中午实现了控制一个舵机的有效转动,下午实现了用一个M3板子实现输出两路不同PWM控制两个舵机的不同角度
   的转动。
   预测问题主要还是出现在引脚的重映像上。
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2019-1-4 20:37:31 | 显示全部楼层
今天早上按时到了,中午按时到了
原本计划今天开始整合代码,但早上发现pwm控制舵机老出问题,通过一天的调整调试最终得出结果是。
代码思路基本相同但缺少引脚的重定向,相同的代码缺少重定向无法达到控制舵机效果
当舵机引脚重定向为led时即可达到效果
细节决定成败,性格决定命运
Connecting & Messaging from Any.
举报 使用道具
adidas5201214 注册会员 发表于 2019-1-4 20:35:56 | 显示全部楼层
本帖最后由 adidas5201214 于 2019-1-4 20:39 编辑

今天又结束了,还剩不到一个星期项目就要答辩了。我们组已经将MPU6050和舵机打通了,现在就是如何通过PID算法将两个结合起来。这也是我们接下来工作的重点,PID算法也看了几天了,具体的思路已经有了。现在担心的是如何调节数据,达到预期效果。昨天遗留下来的问题,今天弄了一天也终于弄好了,但是还有一些小毛刺没有解决,后面继续努力来解决这些小毛病。
Connecting & Messaging from Any.
举报 使用道具
Jump 注册会员 发表于 2019-1-3 21:06:56 | 显示全部楼层
本帖最后由 Jump 于 2019-1-3 21:08 编辑

MPU的调试基本差不多,舵机的程序还在调试,上午将MPU6050传感器安装在了滚球控制支架的上面板背面。将M3的板子使用胶枪固定在滚球控制支架的底板上,用杜邦线将传感器和M3板子连接好,测试了下,基本没什么问题。晚上在测试时由于舵机的转速太快,将正交支臂上的连接点拉断了。将支架打开,使用502胶水和胶枪将断点连接了起来,然后又将一些容易断裂的点进行了加固。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.
举报 使用道具
吴先森12 新手上路 发表于 2019-1-3 20:11:03 | 显示全部楼层
  今天继续写控制舵机的算法,舵机与M3板子连接之后并没有按照预期的结果转动,而是不规则的抖动。小组讨论后也没有发现问题所在,连M3板子也无法进行烧录。刚开始认为是杜邦线接触不良,后来修改代码之后舵机有了转动。
  以下是部分代码:
     while (1)
  {
    __HAL_TIM_SET_COMPARE(&htimx,TIM_CHANNEL_1,100);
    HAL_Delay(1000);
   
    __HAL_TIM_SET_COMPARE(&htimx,TIM_CHANNEL_1,150);
    HAL_Delay(1000);
   
    __HAL_TIM_SET_COMPARE(&htimx,TIM_CHANNEL_1,250);
    HAL_Delay(1000);
  }
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2019-1-3 20:08:49 | 显示全部楼层
早上过来发下昨天整合的代码中,main函数错误诸多,感觉凉凉
下午过程中发现错误原因导致开发板不能够正常考录,耽误大量时间
同时舵机能够正常转动,方向控制:
高电平脉冲的时间0.5ms的话,舵机转到0度,1ms -45度 1.5ms--90度 2ms--135度2.5ms-180度,只能在0.5~2.5ms之间调节,转动0到180度任意角度,你只要控制PWM波的高电平占空比就要可以达到自己想要的转动角度360度舵机是PWM控制它的旋转速度和旋转方向,500-1500us的PWM是控制它正转,值越小,旋转速度越大;1500-2500us的PWM是它反转,值越大,旋转速度越大。1500us的PWM是控制它停止
明天工作,封装好舵机代码后进行pid初步调试。
争取早日结束项目。。。
加油
Connecting & Messaging from Any.
举报 使用道具
adidas5201214 注册会员 发表于 2019-1-3 19:02:47 | 显示全部楼层
本帖最后由 adidas5201214 于 2019-1-3 19:04 编辑

           今天上午看了PID控制算法,对这个算法有了大致的理解。对于一些PID的计算公式还是有点难懂,必须得多花点时间可是留给我们的时间已经不多了,后面我们还有舵机模块要解决。下面的是我上午能理解的部分知识,把它贴出来和大家分享。
      1、比例环节:即时成比例地反应控制系统的偏差信号e(t),偏差一旦产生,调节器立即产生控制作用以减小偏差。
      2、积分环节:主要用于消除静差,提高系统的无差度。积分作用的强弱取决于积分时间常数TI,TI越大,积分作用越弱,反之则越强。
      3、微分环节:能反应偏差信号的变化趋势(变化速率),并能在偏差信号的值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。
下午没有继续看PID算法,去看了一下STM32 PWM波驱动舵机,之前做了利用PWM实现呼吸灯的实验,所以看起来还是比较顺利的。 舵机上有三根线,分别为VCC、GND、信号线。而不需要另外接驱动模块,直接用单片机的管脚控制就行了。控制信号一般要求周期为20ms的PWM信号。我们这次使用的是型号为MG996R的舵机,它需要外接6V的电流,宁哥也帮助我们怎么接电源,所以在这里也感谢宁哥。
      下面是我写的mian函数,能驱动舵机转动,但是只能往一边转动不能反转。
int main(void)
{
u16 pwmval1=749;//1.5ms->90度

delay_init(); //延时函数初始化

TIM_PWM_Init(9999,143);

while(1)
{
    TIM_SetCompare3(TIM2,pwmval1);
    TIM_SetCompare4(TIM2,pwmval1);
    TIM_SetCompare3(TIM3,pwmval1);
    TIM_SetCompare4(TIM3,pwmval1);
    TIM_SetCompare3(TIM4,pwmval1);
    TIM_SetCompare4(TIM4,pwmval1);
}
}

pwm.c初始化函数
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE);// 使能定时器时钟TIM2/TIM3/TIM4
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);  //使能GPIOA/GPIOB外设时钟使能
                                                                                    
   //设置该引脚为复用输出功能,输出TIM2 CH3(PA2复用输出)、TIM2 CH4(PA3复用输出)的PWM脉冲波形
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //TIM2_CH3(PA2复用输出)、TIM2 CH4(PA3复用输出)
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9; //TIM3的3、4通道,TIM4的3、4通道
  GPIO_Init(GPIOB,&GPIO_InitStructure);     //B口的0、1对应TIM3的3、4通道,B口的8、9对应TIM4的3、4通道,设置为复用推挽输出
        
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         50HZ
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  TIM_OC3Init(TIM2, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx        
        TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);  //CH3预装载使能        
  TIM_OC4Init(TIM2, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx        
        TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);  //CH4预装载使能
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx        
        TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //CH3预装载使能        
  TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx        
        TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //CH4预装载使能        
        TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx        
        TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  //CH3预装载使能        
  TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx        
        TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //CH4预装载使能
        
        
        TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
        TIM_CtrlPWMOutputs(TIM2,ENABLE);        //MOE 主输出使能
        TIM_Cmd(TIM2, ENABLE);  //使能TIM2
        TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
        TIM_CtrlPWMOutputs(TIM3,ENABLE);        //MOE 主输出使能
        TIM_Cmd(TIM3, ENABLE);  //使能TIM3
        TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIMx在ARR上的预装载寄存器
        TIM_CtrlPWMOutputs(TIM4,ENABLE);        //MOE 主输出使能
        TIM_Cmd(TIM4, ENABLE);  //使能TIM4
}


Connecting & Messaging from Any.
举报 使用道具
asura 新手上路 发表于 2019-1-2 21:57:03 | 显示全部楼层
asura 发表于 2019-1-2 21:54
今天简单看了下mpu6050参数获取,mpu6050其实就是一个 I2C 器件,通过读写mpu里的几个寄存器来操作这个芯片 ...

C:\Users\12941\Desktop
Connecting & Messaging from Any.
举报 使用道具
asura 新手上路 发表于 2019-1-2 21:54:43 | 显示全部楼层
今天简单看了下mpu6050参数获取,mpu6050其实就是一个 I2C 器件,通过读写mpu里的几个寄存器来操作这个芯片,主要问题是 stm32 和 mpu的 I2C 通信。mpu的配置与初始化和I2C的配置
Connecting & Messaging from Any.
举报 使用道具
吴先森12 新手上路 发表于 2019-1-2 21:48:59 | 显示全部楼层
本帖最后由 吴先森12 于 2019-1-2 21:59 编辑

  今天的任务是把板子上的舵机能够转动。晚上从宁哥那里借来一台数控电源。我们将舵机的地线接了两根,一根接在M3板子上,一根接在数控电源上。舵机的信号线接在PB5,复用引脚PB5可以通过 LED3观察灯的明亮情况判断PWM情况。用数控电源接通舵机后,舵机逆时针转了一圈停了下来。刚开始没有发现问题,后来发现是没有考虑到舵机转动方向问题。明天继续研究。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.
举报 使用道具
Jump 注册会员 发表于 2019-1-2 21:44:00 | 显示全部楼层
本帖最后由 Jump 于 2019-1-2 21:57 编辑

白天有事耽误了,晚上到实验室,考虑到需要为舵机(MG996R)提供电源,舵机的使用电源参数为:电压在4.8V-7.2V之间,电流没有硬性的要求。在工作电压区间内,不同的电压对应的相同的转角完成时间不同,大电压要比小电压完成相同转角所需时间少。M3开发板(我们使用的是德飞莱的),有3.3V和5V的电源,但是考虑到电源不稳定,首先我们考虑的是使用4节1.5V的电池,串联起来达到6V,从实验室找到了俩个电池盒,用胶枪将电池盒拼接了起来,再使用电烙铁将对应的线焊接起来。焊接完成后,听取了宁哥的建议,使用了数码电源,更为稳定。F:\IMG_20190102_214000.jpgF:\IMG_20190102_214005.jpg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2019-1-2 21:34:10 | 显示全部楼层
跨年到今天才开始工作
今天先将pid核心算法实现,以及将算法和mpu6050实现的功能相结合,代码的前两部分基本融汇,明天开始总攻舵机部分。
关于代码的可用性,后期待三部分全部结合后,通过硬件平台进行调试跟进
附件代码无法上传
不接受反驳
Connecting & Messaging from Any.
举报 使用道具
adidas5201214 注册会员 发表于 2019-1-2 21:30:10 | 显示全部楼层
本帖最后由 adidas5201214 于 2019-1-2 21:46 编辑

这几天MPU6050的相关工作结束了,今天把前几天工作的成果展示出来。接下来的工作就是将MPU6050的数据与PID算法相结合,将的得到得结果通过信号线将舵机驱动起来,所以我们还有很多工作没有玩成,接下来也该加班加点了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.
举报 使用道具
哇哈哈哈哈 新手上路 发表于 2019-1-2 21:23:22 | 显示全部楼层
测试了队友写的代码,一起讨论了一些修改意见
Connecting & Messaging from Any.
举报 使用道具
Jump 注册会员 发表于 2019-1-1 19:56:43 | 显示全部楼层
又将MPU6050的代码看了看,大致将对LCD屏幕配置的代码看了一遍,各种寄存器的配置,然后修改了部分代码段,使得LCD在MPU传来数据内容显示时可以更加的舒适。
Connecting & Messaging from Any.
举报 使用道具
Jump 注册会员 发表于 2018-12-29 23:29:16 | 显示全部楼层
本帖最后由 Jump 于 2018-12-29 23:30 编辑

昨天将MPU结合上位机的使用弄明白,但是在MPU传输的数据(俯仰角、横滚角、航向角)通过LCD显示上出了问题,LCD可以将MPU的数据接收到,但是屏幕不显示,今天才知道是烧进去的代码里面对于LCD的配置没有将LCD的背光打开,数据其实已经在屏幕显示,只是屏幕没有背景光源。
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2018-12-29 20:15:21 | 显示全部楼层
今天早上主要是一起弄好了lcd模块,提前完成了本周计划,mpu和lcd均基本完工,接下来就是通过pid的实现以及后期舵机的调控。
争取早日完工!!!加油
Connecting & Messaging from Any.
举报 使用道具
asura 新手上路 发表于 2018-12-28 21:13:20 | 显示全部楼层
今天主要看了下mpu模块,发现用mpu模块就要用到IIC通信原理,看了一下感觉mpu就是一个IIC器件,像一个微控制器,相当于主机,将读取到的数据处理后通过IIc总线传给处理器,相当于从机,然后处理器会对传来的数据进行处理得到我们需要的数据
Connecting & Messaging from Any.
举报 使用道具
吴先森12 新手上路 发表于 2018-12-28 21:04:51 | 显示全部楼层
  今天看了一下PID算法,因为控制舵机的PWM是从PID算法那里接收得到的。PID算法是对偏差进行积分、微分、比例,然后将得到有效数据发送到执行器里。通过误差信号控制被控量,其中偏差量等于实际值 减去预期值。而预期值是通过大量计算得到的,而商家的预期值是在特定情况下计算出来的。所以我们
需要进行大量计算得到我们自己的预期值。
Connecting & Messaging from Any.
举报 使用道具
哇哈哈哈哈 新手上路 发表于 2018-12-28 21:00:23 | 显示全部楼层
今天还是在看手册和群里分享的资料
Connecting & Messaging from Any.
举报 使用道具
adidas5201214 注册会员 发表于 2018-12-28 20:58:51 | 显示全部楼层
今天依然在处理昨天遗留下来的问题,现在LCD能够显示了,但是闪了几下就黑屏。估计是FSMC配置出现了问题,到目前为止具体问题在哪也没找到。明天会继续来检查具体问题在哪,如果把这个问题解决了,我们项目的MPU模块也基本上解决了。今天下午也看了关于MPU6050陀螺仪的姿态解算
说明,通过I2C接口读出来的转换结果ADC值,并不是以度每秒为单位。一般按以下公式进行转换:
Anglerate = ADCrate /灵敏度
以量程为±1000º/s为例,说明如何转换。假设读取x轴的ADC值为200,从上表中得知在
±1000º/s下的灵敏度为32.8LSB/(º/s) 。根据上面的公式:
Anglerate = 200/32.8 = 6.09756º/s
这就是说,MPU6050检测到模块正在以约6度每秒的速度绕X轴(或者叫在YZ平面上)旋转.
ADC值并不都是正的,请注意,当出现负数时,意味着该设备从现有的正方向相反的方向旋转

Connecting & Messaging from Any.
举报 使用道具
Jump 注册会员 发表于 2018-12-28 20:54:36 | 显示全部楼层
今天在昨天的基础上,查看附带的MPU6050代码,但是LCD的屏幕还是无法点亮显示出传感器的数据,俯仰角、横滚角、航向角。在淘宝找到M3板子的店铺和老板交流了一下,可能是LCD屏幕有问题,然后使用了老板给的软件测试了下,屏幕可以点亮,并且显示出硬件的相关信息,排除了屏幕的问题。根据MPU6050附送的代码,找到了配置LCD的.c文件,查看了对应的参数设置,但是还没有配置好,明天需要努力下,解决这个问题,然后再去查看下传感器数据的解析问题。
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2018-12-28 20:40:49 | 显示全部楼层
早上过来把pid算法实现的样例代码尝试执行,发现衔接过程——入参和返回值——存在不清晰项。比如:mpu传入的欧拉角、pid算法自身的标准平衡参数、返回值电压和pid算法实现过程。
下午针对上午存在的问题进行探究,同时学习mpu内容。总结:四元检测参数,一个欧拉角输出,算法实现一阶互补算法(https://blog.csdn.net/u014183456/article/details/78324680),I2C更改库文件:(DMP库需要对 I2C 函数进行修改,如 DMP 库中的 I2C 写:i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 1, &(data[0]));有4个输入变量,而 STM32 硬件 I2C 的 I2C 写为:void MPU6050_I2C_ByteWrite(u8 slaveAddr, u8 pBuffer, u8 writeAddr),只有 3 个输入量(这之间的差异好像是由于 MPU6050 的 DMP 库是针对 MSP430 单片机写的),所以必须进行修改。)。
同时,没有办法实现mpu的安装以及调试。
明天将和同学一起实现显示平功能:fsmc——>lcd
Connecting & Messaging from Any.
举报 使用道具
哇哈哈哈哈 新手上路 发表于 2018-12-27 21:25:23 | 显示全部楼层
今天主要是看了一下MPU605 的资料,并且结合着软件测试了一下它的性能,明天继续研究
Connecting & Messaging from Any.
举报 使用道具
Jump 注册会员 发表于 2018-12-27 21:20:33 | 显示全部楼层
查阅MPU6050附送的资料包,看到了它的原理图和简单介绍,根据附送的测试代码,烧录到开发板内,首先在百为上测试,多次烧录,上位机依旧无反应,并且无任何错误提示,更换为德飞莱后完成上位机的测试,可以看到传感器的数据通过串口发现到上位机上,数据非常多,姿态识别里可以看到三维模式下的传感器位置变化,但是对接收的数据如何解析还有许多疑问
Connecting & Messaging from Any.
举报 使用道具
asura 新手上路 发表于 2018-12-27 21:04:16 | 显示全部楼层
舵机支架与板子之间的误差有些大,放到板子上的mpu采集到的小球对板子产生的数据就会有误差,会对后期的数据处理及舵机的控制都有一定的影响
Connecting & Messaging from Any.
举报 使用道具
吴先森12 新手上路 发表于 2018-12-27 20:38:54 | 显示全部楼层
本帖最后由 吴先森12 于 2018-12-27 20:41 编辑

  控制舵机转角的角度方法已经知道,但如何将接收过来的PWM转化为对应的角度,也就是如何自动将不断变化的PWM转化为不断变化的角度的算法还没有解决。将舵机的VCC线、GND线、信号线分别与STM32 对应引脚相连,STM32板子出现电压不稳的情况,应当外接一个电源,明天外接电源到了之后,继续研究。
Connecting & Messaging from Any.
举报 使用道具
adidas5201214 注册会员 发表于 2018-12-27 20:32:11 | 显示全部楼层
总结一下今天的成果,通过查阅MPU6050六轴模块的使用说明书,大致知道如何使用MPU6050,并通过上位机得到MPU6050相关数据。但是得到的这些数据看不懂,所以接下来我们要弄清它的工作原理以及数据处理。明天的任务是解析MPU6050的数据,期望得到的是姿态数据,也就是欧拉角:航向角( yaw)、横滚角( roll)和俯仰角(pitch)。有了这三个角,我们就可以得到当前的姿态,这才是我们想要的结果,并通过LCD将相关数据打印出来。现在还有一个困惑我的地方,我们这个项目需要几个MPU6050模块,还有如何固定在我们板子上。
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2018-12-27 20:05:40 | 显示全部楼层
@TK 发表于 2018-12-27 20:03
上个帖子没附加上的

明天开始转变学习模式,通过集体讨论的方式,替代各自分工,突出以研究形式的学习为主,发展成为自主学习
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2018-12-27 20:03:45 | 显示全部楼层
上个帖子没附加上的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

@TK 明天开始转变学习模式,通过集体讨论的方式,替代各自分工,突出以研究形式的学习为主,发展成为自主学习  详情 回复 发表于 2018-12-27 20:05
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2018-12-27 20:02:35 | 显示全部楼层
今天总结了pid几种处理数据模式
个人觉得抗积分饱和的pid算法比较合适,明天将继续研究项目中需要那种学法,并和组内同学讨论
同时铭记:切勿将个人感情态度带入讨论过程中,避免发生矛盾
附上总结word后期使用
Connecting & Messaging from Any.
举报 使用道具
哇哈哈哈哈 新手上路 发表于 2018-12-27 10:05:07 | 显示全部楼层
昨天忘记写了,这段时间组内一直在讨论用料和项目方案,找相关资料,昨天下午,定的架子到了,就一起把架子拼了一下,接下来项目就要进入正轨了,继续努力吧
Connecting & Messaging from Any.
举报 使用道具
asura 新手上路 发表于 2018-12-26 21:07:23 | 显示全部楼层
下午滚球控制的架子和mpu模块都到了,架子组装好了,mpu模块还没有确定装在支架的哪个部分可以更好的采集数据,舵机的供电方案也正在研究中,因为一块M3板子只能给一个舵机供电,所以准备一个电源模块给舵机供电,电压也够稳定。
Connecting & Messaging from Any.
举报 使用道具
Jump 注册会员 发表于 2018-12-26 20:43:56 | 显示全部楼层
下午物料已经到了,滚球控制系统的支架已经组装完成,两个舵机(型号为MG996R)已经安装在了支架上。通过查找资料对MPU6050六轴传感器有了初步的了解,三轴陀螺仪传感器,检测运动的姿态角速度,三轴加速计传感器检测加速度的数据变化。含有一个IIC(集成电路总线),可外接磁力计传感器,达到九轴。MPU6050支持3.3V电压,可以直接连接到M3开发板上进行使用。
Connecting & Messaging from Any.
举报 使用道具
吴先森12 新手上路 发表于 2018-12-26 20:07:28 | 显示全部楼层
  自从项目确定后,这两天一直在看如何用STM32控制舵机角的度数和舵机转角的速度。从网上的一些资料来看,控制舵机是用PWM实现的,
  式子如下 :TIM3->CCR2 = x; 通过改变x的值,改变占空比,同时设置一定的参数,使舵机控制周期为20ms。也就是通过改变占空比,控制
  舵机转角的度数。但今天与宁哥聊后发现通过改变PWM控制舵机并不是真正的原理,控制舵机的原理应该是PPM,二者虽然现象相同但PWM
  的脉冲信号在下一次转变之前会一直保持同一个状态,因此会消耗更多的功耗。
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2018-12-26 19:57:54 | 显示全部楼层
adidas5201214 发表于 2018-12-26 19:51
饭得一口一口吃,事得一件一件做,只要今天比昨天好,那不就是希望吗?加油 ...

从你之后,再无心动
Connecting & Messaging from Any.
举报 使用道具
adidas5201214 注册会员 发表于 2018-12-26 19:51:46 | 显示全部楼层
@TK 发表于 2018-12-26 19:43
沙发没了?????
几天的pid算法原理看下来并没有太大收货,感觉理论性东西和代码脱节,今天看了下网上的 ...

饭得一口一口吃,事得一件一件做,只要今天比昨天好,那不就是希望吗?加油

点评

@TK 从你之后,再无心动  详情 回复 发表于 2018-12-26 19:57
Connecting & Messaging from Any.
举报 使用道具
@TK 注册会员 发表于 2018-12-26 19:43:04 | 显示全部楼层
沙发没了?????
几天的pid算法原理看下来并没有太大收货,感觉理论性东西和代码脱节,今天看了下网上的样例代码,感觉代码实现不难,难点在于理论。
争取本周五前把算法原理搞懂!!!
typedef struct
{
    float kp;      //比例系数
          float ki;      //积分系数
          float kd;      //微分系数
          float erorr;   //当前偏差
          float last_erorr;  //上一次偏差
          float erorr_sum;   //偏差累计
          float target;      //设定的目标值
          float feedback;    //反馈量
          float out;
}PID_TypeDef;
pid结构体,核心结构。
中午通过和宁哥交流明白了,先微分再积分。即先pd后pi。。。自己的问题出现在微分和积分概念不清。
pass:好好休息,头疼。。。记住休息。。。

点评

adidas5201214 饭得一口一口吃,事得一件一件做,只要今天比昨天好,那不就是希望吗?加油  详情 回复 发表于 2018-12-26 19:51
Connecting & Messaging from Any.
举报 使用道具
adidas5201214 注册会员 发表于 2018-12-26 19:31:36 | 显示全部楼层
本帖最后由 adidas5201214 于 2018-12-26 19:34 编辑

今天下午买的材料都到了,我们已经将项目的器件组装好了。小组成员也开始了相关代码的编写以及知识点的学习,我也了解了MPU6050的相关情况和参数配置。中途也对一些知识点感到模糊,比如我们采用MPU6050到底如何工作,采集的数据如何处理。这也是我们接下来要解决的问题。明天开始MPU6050相关代码的编写,这样才有时间准备后续工作。
Connecting & Messaging from Any.
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-4-19 12:45