搜索
bottom↓
楼主: laugh

正在研发中的电动独轮车

  [复制链接]

出0入0汤圆

 楼主| 发表于 2011-7-23 20:23:06 | 显示全部楼层
吃饭回来我想明白了,调试中看到程序没有显式地读,有些标志也都被清除了,其实是调试程序读了,那个外设单元对此并没有加以区分,在设置的断点中断以后,我不执行单步调试,仅仅是把内存窗口滚动一下,让窗口内的数据更新显示,就发现标志数据变化了,同时,从设备——传感器也相继发数据过来,之前之所以在Write过程中不明显主要是因为写的过程多是要写字节进去DR才清标志,而Read过程则以读取为主,因而调试更为困难一些。

出0入0汤圆

 楼主| 发表于 2011-7-23 20:37:51 | 显示全部楼层
第一时间报告,困扰多日的I2C终于可以通信了,读出数据来了,虽然没有校验方式,不知道从器件的状态,这些在以后做产品时必须克服,不然依据得到的一堆杂乱数据,那车还不得疯了,收工,休息。

出0入0汤圆

发表于 2011-7-24 22:56:24 | 显示全部楼层
这个东西数据看了几天,同是用主控上的3.3V,MPU3050稳定性不如IDG300,那家伙吹大牛了.我想把2个IC的电源连一起,发现数据不同了,抖动大很多.设置方面问题不大了,板上2只IC都比较熟悉

出0入0汤圆

发表于 2011-7-24 23:23:39 | 显示全部楼层
呵呵~诸位加油~是不是考虑加强一下EMC、EMI防护~毕竟有个电机在~

出0入0汤圆

发表于 2011-7-24 23:25:57 | 显示全部楼层
以我的经验,这个模块可以给个中差评了.

出0入0汤圆

 楼主| 发表于 2011-7-25 10:06:39 | 显示全部楼层
回复【105楼】robotkid
-----------------------------------------------------------------------

    这个模块是不咋的,连带那个芯片,作为从设备怎么能霸着总线不放呢,不是只有来不及操作时才可以时钟展宽的吗?他们有时拉着SDA不放,搞得主设备无从下手。
    这两天在观察熟悉I2C通信,给它们各种初始条件及干扰,寻找各种恢复通信的方法,对数据还没仔细分析,看文档还可以进一步进行一些设置,这暂时都还不算是主要的事,因为I2C通信好像很不可靠,搞不好就进行不下去了,一个意外的起始条件没有跟进数据就出不来了,一个BUSY清除不掉就不往下走了,他们是他们的问题,我还得多观察观察。

    同时要鼓吹一下深圳微雪,他们的仿真器很漂亮,文档精美细致,还发顺丰速递,整个一个高档路线。

出0入0汤圆

发表于 2011-7-25 11:00:48 | 显示全部楼层
mpu3050和ADXL345同步出来是可以做到的,因为MPU3050可以开放总线给ADXL初始化,也试过调出AUX有数据出来,但一起全部出来没调好,也没心情搞这个了,只是做玩具可能还可以.

出0入0汤圆

 楼主| 发表于 2011-7-25 11:46:09 | 显示全部楼层
说实话对I2C通信我还是难以割舍的,稍微复杂点的系统,离不开这种芯片间通信方式,目前看来一时还难以完全把握,今天上午再买LPR550AL,模拟通信的带板芯片,卖家声称是示波器观察测试过的,我也先拿回来连上我已经预留好的AD通道上,先用上陀螺仪再说,毕竟研发独轮车是大方向,I2C通信只是一个末节分支。

出0入0汤圆

发表于 2011-7-25 13:14:55 | 显示全部楼层
也在那家买吗?我有一片他的,数据很抖动.

出0入0汤圆

 楼主| 发表于 2011-7-25 14:46:42 | 显示全部楼层
呵呵,还也为不是的呢,回头去看看,竟然还是在那里买的,也真好笑!抖不抖的,跟这个卖家没有多大关系吧,不还是芯片的主要问题?

出0入0汤圆

 楼主| 发表于 2011-7-25 15:31:49 | 显示全部楼层
摘抄一段网上的内容,对I2C编程很有参考价值,只是一时没想明白怎么会有9个“1”,不是每次一个字节8个位吗?如果单独发送,正常情况下是当成地址不对号的寻址数据而忽略,但对于处于等待收发的器件却可以当成没有收完的数据或者是NACK,这个主意真不错!SDA总线被拉低时,起始条件是发不出来的,但随之产生的SCL时钟可以令没有完成收发操作的从设备按它的理解完成操作,其后多余的数据位及起始停止位,自然可以被忽略或者当成已知的错误状态来处理,结果总是软件复位到可通信状态。

I2C通信的有效性保证措施

    (1)  软件复位

  有时EEPROM器件可能需要执行软件复位序列来确保其处于正确并且已知的状态。这在某些情况下会很有用。例如,在EEPROM上电时,若总线噪声过大,EEPROM上电后将会进入不正确的状态;又如,微控制器在通信期间若发生复位,将会使通信陷入不同步的状态。为了确保在出现这些情况之后,系统的微控制器与I2C串行EEPROM器件之间能够正确、有效地实现通信,可以先发送图1所示的软件复位序列,使I2C接口器件可靠复位,之后,再启动数据的传输过程。


(原文件名:080327205541400.gif)


图1  软件复位序列

  第1个起始位会使器件从期望接收微控制器数据的状态复位。在该模式下,器件处于接收模式并监视数据总线,能够检测到强制其内部复位的起始位。9 位“1”用于强制复位那些无法通过前面的起始位复位的器件。这只在以下情况下发生:器件处于在总线上驱动应答(低电平)的模式中;或处于输出模式中,正在总线上驱动输出数据位0。在这两种情况下,由于器件将总线保持在低电平,所以无法产生前面的起始位(定义为SCL为高电平时SDA被拉低)。通过发送9位 “1”,可以确保器件检测到NACK(即微控制器不将总线驱动为低电平,从而不应答EEPROM发送的数据),这样也会强制进行内部复位。

  发送第2个起始位是为了防止在以下情况中可能发生的罕见的错误写操作:微控制器在向EEPROM发送写命令时被复位,并且在发送第1个起始位时 EEPROM正在总线上驱动ACK。在这种特殊情况下,如果没有发送第2个起始位,而是发送了停止位,器件将启动写周期。只有在微控制器向EEPROM发送写命令时被复位的情况下,才可能发生这种错误写操作。

  最后的停止位将终止总线活动,并将EEPROM置于待机模式中。

  (2)  检查应答位

  I2C通信的众多优点之一就是在接收到每个字节后发送应答位ACK。除了正在进行写周期之外,I2C接口EEPROM在接收到每个字节后总会发送1位低电平,表明已收到有效的起始位和控制字节。因此,主器件可以在整个运行期间监视接收到的ACK位,以检测可能发生的任何错误。在发送期间检查接收到的ACK是否为逻辑1(表明EEPROM没有响应)始终是一种好的做法,若接收到ACK为逻辑1,则需要执行一个错误处理程序来确定器件为何没有响应,并根据需要执行软件复位序列。

出0入0汤圆

发表于 2011-7-26 07:50:20 | 显示全部楼层
从来没研究过I2C,都是参考示例套用的,但用起来还算顺,楼主再研究I2C就掉进牛角尖了.

出0入0汤圆

 楼主| 发表于 2011-7-26 10:33:40 | 显示全部楼层
回复【113楼】robotkid
从来没研究过i2c,都是参考示例套用的,但用起来还算顺,楼主再研究i2c就掉进牛角尖了.
-----------------------------------------------------------------------

    实际上I2C在数字电路技术中应该是比较常见和重要的,如果跟电动车没有关系,再高级、厉害的技术也都是浮云,但现在有了那么点关系,不把它吃透,数字传感器就用不好,是没法适应复杂工况的,模拟的最多是研究时顶替一下,肯定不能用在产品上。
    经过初步的测试,I2C从设备软件复位序列不能确定地从I2C硬件发送,所以就采用了模拟的方式,通过GPIO发送:
        /*关闭I2C,用GPIO发送9位1,软件复位从设备*/
        if ((I2C->SR3 & I2C_SR3_BUSY) == I2C_SR3_BUSY)
        {
                I2C->CR1 = 0x00;              // PE=0, 禁止I2C
                GPIOE->ODR |= (BIT1|BIT2);    //使用的是默认I2C管脚PE1、PE2
                for(j=15;j>=0;j--);                                                //延时
                GPIOE->ODR &= (u8)(~BIT2);    //SDA拉低,产生起始条件
                for(j=15;j>=0;j--);                                                //延时
                GPIOE->ODR |= BIT2;                                    //SDA恢复为恒1
                for(i=18;i>=1;i--)
                {
                        GPIOE->ODR ^= BIT1;           //一高一低产生时钟信号
                        for(j=15;j>=0;j--);                                                //延时
                }
                GPIOE->ODR |= (BIT1|BIT2);    //接连产生起始、停止条件
                for(j=15;j>=0;j--);                                                //延时
                GPIOE->ODR &= (u8)(~BIT2);    //SDA拉低,产生起始条件
                for(j=15;j>=0;j--);                                                //延时
                GPIOE->ODR |= BIT2;                                    //SDA拉高产生停止条件
                I2C->CR1 = 0x01;              // PE=1, Stretch enable
        /*如果总线仍忙对本身软复位*/
        if ((I2C->SR3 & I2C_SR3_BUSY) == I2C_SR3_BUSY)
        {
                I2C->CR2 |= I2C_CR2_SWRST;
        }
        I2C->CR2 &= (u8)(~I2C_CR2_SWRST);
        I2C->SR2= 0;                                                        //清除错误标志
    经过上面的处理,有效解决了通信前总线忙的通信故障,但是通信仍然不能保证进行,当线路受到干扰,主、从设备对信号认知有偏差,就会进入互相等待的状态,这时“忙”是正常的,通信却停止了,这种情况就需要在应用层有一个状态判断,每次运行取样I2C的状态机,如果发现停止就执行软件复位。

        if ((STATE == INI_00) && (I2C->SR3 & I2C_SR3_BUSY) == I2C_SR3_BUSY)
        {        //还是初始状态,BUSY标志却置位,必须调用错误处理程序予以清除
                I2C_ErrProc();
        }
        if ((STATE == lastSTATE) && STATE != INI_00)
        {        //还是上次的状态,却不是初始状态,说明死等了,必须调用错误处理程序予以恢复
                I2C_ErrProc();
                lastSTATE = INI_00;
        }
        else
        {
                lastSTATE = STATE;
        }

    经过这样的处理,只要器件、线路没有实质的损坏,通信就能抗干扰地持续进行,当然,电路上的抗干扰也是不能忽略的,不然总被打断还是会影响实际采样速率的。

出0入0汤圆

发表于 2011-7-26 10:39:15 | 显示全部楼层
我用了几个器件是模拟的,还算稳定,都一直通信,现在就是MPU3050有时会产生0XFBFB这个数应该是读数错误的,还不知道如何修正,其它器件的基本没有问题.

出0入0汤圆

 楼主| 发表于 2011-7-26 13:37:41 | 显示全部楼层
模拟器件肯定不会有通信不稳定的问题,问题在于电源波动和传输干扰,数字的可以克服这个问题,还可以在传输之前修正偏移,这是数字传感器比较得力的地方,所以做好数字通信关系重大。今天我的任务就是分析设置那两个传感器的参数了。

出0入0汤圆

 楼主| 发表于 2011-7-26 19:40:26 | 显示全部楼层
传感器的数字可以看到,应该是带正负的,不像模拟的自己根据中间值另外计算,不过都是静止状态,差别可是比较大,以后应用中需要给他们标定。保证通信的复位片段到现在也才算调到通过,原来需要硬件软复位以后再GPIO输出,不然那所谓的高低实际上可能并不存在,在GPIO输出以后,还要再给硬件来一次软复位,再将I2C各个参数初始化,多次观察这样消除BUSY信号算是彻底了。调试中间有两个问题,其实是一个问题要留意到,硬件软复位以后,除BUSY外,各个寄存器都归零了,说是两个问题,就是先留意到PE归零了,置位以后还有问题,才发现什么CCR、OAR、ITR原来都归零了,分两次检查出来以后才彻底好了。

出0入0汤圆

发表于 2011-7-27 08:04:34 | 显示全部楼层
不知道楼主的倾角静止时抖动有多大,反正现在测到从那家伙买的MPU3050和LPR550AL都好几百,用IDG300就10左右

出0入0汤圆

发表于 2011-7-27 08:21:36 | 显示全部楼层
标记一下,支持·

出0入0汤圆

 楼主| 发表于 2011-7-27 10:29:17 | 显示全部楼层
我有点相信“倾角和加速度传感器的水深的很”了,深吧深吧,正好游泳。我也观察数据了,在最基本的设置情况下——进一步的设置还没有做——转发的加计数据波动较小,只有10以内的波动,还有不动的时候,陀螺仪的数据静态各轴互相差别较大,自身相比波动也不小,几百的差别不敢说,几十的波动是常有的,连那个温度值都有来回十几的波动,真不知道是我们见识少呢,还是什么原因呢?

出0入0汤圆

 楼主| 发表于 2011-7-27 13:37:26 | 显示全部楼层
“技术资料不完整,仅仅是焊接了两只传感器芯片及阻容元件,所有读取计算甚至额外的电路连线都要用户自己根据文档完成,所选两只芯片并不足够协调,方位排布焊接错位,高低字节相反,根本谈不上姿态模块,卖家本人经常不能在线答疑,而且也认定所售芯片存在虚夸,或者是为自己的“模块”不能符合DMP计算要求的托辞,至少买来实测比较失望。所附I2C通信例程不完整,仅仅是51机的读写EEPROM的片段,包含有限的几个传感器I2C地址参数和寄存器偏移,没有明确的MPU3000编程资料,却有个似是而非的IMU3000,卖家回应称,厂家给的就是这样。依据卖家给的芯片官方网址,要用的几个文档都不能下载到。这收货也不能延期了,货款到期支付了,卖家已经评价了,不知道评价内容如何,这里谈了这些理由,由想给中评,改为差评! ”咱这么说合适吗?

出0入0汤圆

发表于 2011-7-27 14:06:46 | 显示全部楼层
楼主说的没任何问题,我的是2次买的都是不行的,买前问清楚卖家了,抖动试过没,他说试过了,肯定比我手上的IDG300好,结果效果真是不行,那个模块布线也不行,比外行还差.我一直是用USB口供电测这种低功的,上了这个模块竟然不够电,晕的很.

出0入0汤圆

发表于 2011-7-27 14:08:23 | 显示全部楼层
楼主看清了,手上的不是MPU3000吧,而是MPU3050

出0入0汤圆

 楼主| 发表于 2011-7-27 14:18:40 | 显示全部楼层
看不清楚,字体很小,是3000还是3050没有多大区别,仅仅是是否同时支持SPI的问题,它们的说明手册都是同一个文档,说3000方便点吧。
另外友情提醒,这是个16位AD采样,设置+/-250度量程时,刻度是131 LSB/度/s,所以看着跳动大,也许不必太在意,未必是稳定性差。

出0入0汤圆

发表于 2011-7-27 18:54:07 | 显示全部楼层
已经调到2000量程,抖动几十,我说亏点也不退款.我以前有问题的板已经好评,让他发个上次的空板,没发还不止,一口咬定是他自己包装的.申请退款了,专心用手上的传感器.

出0入0汤圆

 楼主| 发表于 2011-7-28 15:24:05 | 显示全部楼层
经过沟通,最终没有给卖家差评。这个MPU芯片淘宝价也要160多,咱们花了300多元买个板子,即使性价比不是很高,其性能应该也不是泛泛了,还是值得好好挖掘一下的。只是不知道哪个设置又不对了,前面几条设置都能通过,最后一条设置语句一连写5个寄存器也通过了,但是后面的读数据就是不能通过,发送起始条件后,进入I2C中断发送I2C寻址字节,然后就没有ACK了,处处设中断,反复也没有发现哪里不对劲了,看那样子倒像是传感器被修改了地址一样,现在也看不出问题,只不过想出来可以把前面的设置语句分别屏蔽或修改一下再看效果。
    应用数字传感器数据的控制语句也基本写好了,只是对有符号数字的运算结果还不是很有把握,不过胜利就在前面招手了,试骑的日子不远了。

出0入0汤圆

发表于 2011-7-29 00:02:15 | 显示全部楼层
你搞错了,这个IC在深圳已经大量有现货,现在19元/片商家还有钱赚,真正验证这个IC还要在动态中读数.这个卖家的沟通能力比搞传感器模块的能力强非常多,MPU3050不止是比3000少了SPI这一样,成本和制作上已经完全不同,现在做到3美元以下.
人骑的车如果能用这个IC,那造小车的人水平就不是一般高了.
前一阵AVR新出的三款姿态9轴评估板,开价是54$

出0入0汤圆

 楼主| 发表于 2011-7-29 10:28:44 | 显示全部楼层
楼上在这方面确实比俺清楚,再查是IMU3000为160元,MPU3050有低至20元的,奇怪的是这个卖家宝贝类型分类是二手,详情却说是全新,还没有成交记录。不管他那么多,品质够用,能便宜当然好。

    昨天晚上排查通信故障,竟然真的是因程序错误而对传感器写入其它地址了。这源于我对编译程序理解不透彻,本来是想把那些设置字符串的数组写在程序的前面,例程的外面,又怕多占宝贵的有限的RAM,初步看看反汇编的代码,了解到机器语言程序会把例程内的数组通过立即数赋值的方式在堆栈中建立起来,这样就不用长期占用RAM了,如果这些数组在例程内使用是绝对没有问题的,可是我要用的这些数组却不在例程内使用,而是要把他们的地址指针传递给中断程序使用的,例程一结束,占用的堆栈就释放了,其它程序写入了其它的数据,而中断例程得到的指针却仍指向原来的数组地址,结果数据已经变样了,凑巧的是对应寄存器地址的字节变成了0,随后就成了对0寄存器写入其它数值了,这个0寄存器就是MPU3050的ID寄存器,所以就发生了随后寻址无应答的情况。进一步查看RAM占用情况时了解到,原来只需要对应用中不改变的数据加上const限制符,编译程序就会把他们放在ROM中,如此修改以后,通信顺利进行。
    早上对照数据手册观察陀螺仪和加计的数据,对应板子上芯片的方位和我计划放置的方位,决定取用加计的Z轴、陀螺仪的Y轴,它们的符号都要取反后使用,加计每个最低位(LSB)大约对应0.25°,做角度估算的互补滤波计算需要协调陀螺仪的数据,当前的设置是每个最低位对应°/s/131,换算成按10ms采样一次积分1秒后达到0.25°的刻度值需要给陀螺仪读数除以(131*100/4),代入互补滤波公式:angle = (0.98)*(angle + gyro * dt) + (0.02)*(x_acc)并考虑整型计算的局限进行适当修改,得到        New_Angle_Value = (Angle_data.Angle_Value *49+ (-GY_data)/66+(-AC_data))/50;

出0入0汤圆

发表于 2011-7-29 10:45:08 | 显示全部楼层
又怕多占宝贵的有限的RAM,lz的cpu是不是选小了

出0入0汤圆

 楼主| 发表于 2011-7-29 15:05:59 | 显示全部楼层
回复【131楼】comway 移动狗
又怕多占宝贵的有限的ram,lz的cpu是不是选小了
-----------------------------------------------------------------------

其实也并不见得小,有2K的RAM,只不过程序是从其它应用程序修改来的,有些无关的也保留着没有清理,只是怕而已,对内存分配还没有仔细研究。

出0入0汤圆

 楼主| 发表于 2011-7-29 17:32:42 | 显示全部楼层
回复【94楼】hitor
我现在也正在弄这种小车,读了 laugh 拉夫和robotkid两位前辈的帖子,感觉受益良多。我现在正准备购置零件,一些欲购零件如下:
【姿态模块】:三轴陀螺仪+三轴加速度计=六轴姿态模块 mpu-3000+adxl345 ,298元。【应该和两位楼主用的六轴板是同一种类型,甚至同一个卖家。但看两位楼主的意思,该六轴板好像不太规范。那怎么办呢?是分开买三轴陀螺仪和三轴加速度计然后再整合;还是就买这个六轴板,然后加以改进。但改进的话能改好吗?不要越改越坏。请两位楼主给我些意见。】
【主控板】:dfrduino nano 328控制板 (arduino nano compatible) ,163元。【有的人说arduino nano的板子就行,但我不知道这一款的主控板能不能满足实际需要?也不知道它和刚才那个传感器之间的接口能不能对上?他们之间的通信有没有问题?还是用stm32好一些?】
......
-----------------------------------------------------------------------

因为您的注_册审核通过以前俺们看不到您的回帖,这才看到。
那个6轴模块不带电源,所用两个芯片都要求电压3.3V,最高3.6V,其它方案与您不同,我用的驱动板本身带MCU,我是直接在驱动控制板上编程,传感器信号也自找管脚接入,所以没有主控板、驱动板之分。电动车轮一般是带霍尔传感的无刷直流电机,注意所选的驱动器是否合用。

出0入0汤圆

 楼主| 发表于 2011-7-30 13:25:12 | 显示全部楼层
今天给陀螺仪消偏移做标定,就是要做到静止时的输出接近于0,先记录下来未修正时的数值:00CF,FFC1,FFC4,多看几次稍有变化,基本也差不多,把这些数值直接写入偏移寄存器,却意外发现读出的数值偏差更大了,大概是原来差值的5倍,查看文档,说修正的数值跟量程有关系,但反复看说明也不具体,改变采样频率也没有影响,只好用试验逼近法,最终采用的数值是:FFCC,0010,0008,这哪里是“The values in these registers
are subtracted from the gyro sensor values before going into the sensor registers (see registers 29 to
34)”?我一时看不出来它们之间的关系。
    主控板上没有3.3V电源,只有原来的加速度计板上有这个电源,只好把这两个传感器板都用上,在最后将陀螺仪用上之前,心里很忐忑,这边测试时有时会跑飞,不知道是不是计算溢出导致的。

出0入0汤圆

发表于 2011-7-30 14:09:23 | 显示全部楼层
一个供电恒定,工业用IC,机械上水平,有温度输出的加速度和倾角模块,是这个系统的第一个关键.做一个弱弱的平衡车后,就开始解决这个问题先,然后最难的是电机控制了.
我的数值也取过了,也是自己测量的值和厂家的差不少.还好的是IDG300的计算值是2MV/度秒,静止是1.66V,这个暂时是固定的不用想,但偏差多少还不知道,人家厂家数据是在3V的情况下,在看卡夫慢是如何修正的.

出0入0汤圆

 楼主| 发表于 2011-7-31 12:22:44 | 显示全部楼层
电连接都通了,数据通信也算可以了,程序框架也搭成了,上午又观察了传感器倾角计算与驱动的正反流程,也基本正确,除了先前有几次看到计算中不可思议的跳转之外,以后再没有观察到,也才知道原来程序框架中的中断不是都在一个软件级别的,其中包含计算的时钟中断级别较低。与之前将角度和角速度一起输出作为调控参数不同,参考前人经验,先调角度对速度的影响,结果还是没有稳定的转动,正纳闷中...该吃饭了,问题总会解决的。

出0入0汤圆

发表于 2011-7-31 14:58:24 | 显示全部楼层
持续观望

出0入0汤圆

发表于 2011-7-31 20:47:15 | 显示全部楼层
强势围观

出0入0汤圆

发表于 2011-7-31 22:16:18 | 显示全部楼层
http://www.tudou.com/programs/view/0G4olNxOSzk/ 这个是早前调加速度反馈和电机正相关的视频.
所有硬件之前都调通了,后来在MPU3050模块上拖了一阵,现在玩一下算法,做个车架试试

出0入0汤圆

 楼主| 发表于 2011-8-1 10:17:40 | 显示全部楼层
回复【139楼】robotkid
-----------------------------------------------------------------------

    这加计是模拟的还是数字的?看来先用小电机做算法测试是比较明智的,大电机不仅是贵,能量大,也比较吓人。我一开始是没有经验,也不知道除了电动车轮还有没有个头小点儿的带霍尔的电机,这个12寸车轮净重5kg,转动惯量比较大,猛转猛挺的破坏力惊人。
    昨晚到今天早上都比较纳闷,不知道为啥电机不好好的转,比例、方向似乎都有,就是转几秒钟就嘎然而止,甚至处于通电刹车状态,搬不转,也不敢停太久,马上关电,不然就会烧驱动管。先是怀疑倾角没有计算好,也许换了地方电压变啦,也许通信又受阻啦,也许动态变化大啦,其实用灯指示也没有发现离谱的事。查看换相一段程序感觉有点问题,若是简单的定向旋转没有问题,但如果随时会换向,甚至在电磁刹车,尤其是要反向通电制动时,原来的换相逻辑就有问题了,改,却仍然没有消除停转的症状。接着把倾角数据屏蔽掉,直接给个固定的目标速度60rpm,匀速转动一会儿还是一样停掉,给个-60就反转然后停掉,把亮灯指示插入几个怀疑的地方都没有检测到指令运行到那里。再把目标速度给到100rpm,这次转了很久没有停,难道是速度太低?怀疑有人说的要用PMSM,不要用BLDC的道理在此了,然而我再次把目标速度给到40rpm一样转个不停,甚至还有惊喜:用手加速划转,少顷感觉到车轮反馈的刹车阻力,再猛一点的话,车轮甚至倒转了,然后再次正向转动,这正是我的设计效果,只是因为给定了目标速度和PI参数比较小,调整迟缓了一点,虽是慢动作,但动作反应是预期中的。中间也反复做过其它调整都没有作用。现在我就怀疑要不要启用看门狗功能了,当然最好是系统不要跑飞,也许接下来,就是要反复跟踪,看看昨天上午是怎么莫名跳转的,后悔不记得跳到哪里去了。

出0入0汤圆

 楼主| 发表于 2011-8-1 14:39:50 | 显示全部楼层
当时就是跟踪到这里:JRNC  0x9a4f ,就是判断有无进位,有就在高字节加一:INCW  X,没有就跳过它,顺序执行就不外乎这里,大部分时间看到也是局限在这里执行的,就那天看到单步执行到这里,就莫名其妙的跑到别处了,不是另一个中断的入口,也不是非代码区,跑到非代码区的也见过,但不是这一次。是什么机缘巧合,不管我跟踪得快慢,到这里就跑了?

0x9a49 0x4F           CLR   A
0x9a4a 0xBB3C         ADD   A,SAMPLE_GY_AC+5
0x9a4c 0x2401         JRNC  0x9a4f
0x9a4e 0x5C           INCW  X
0x9a4f 0x02           RLWA  X,A
0x9a50 0x50           NEGW  X
0x9a51 0xA642         LD    A,#0x42
0x9a53 0xCDA96D       CALL  c_sdivx

出0入0汤圆

发表于 2011-8-2 11:54:50 | 显示全部楼层
这样跟踪不出来的,你有采样和中断或时间中断的吧,用软件上的看,都是停在一个位置的.今天还在修正加速度因为安装上产生的误差,12位采样其实精度也不算很高,已经能算出角度,可以搞角度表了.
正在搞角速度的误差和计算.前几天都在重看一下积分和三角涵数.

出0入0汤圆

发表于 2011-8-3 10:29:36 | 显示全部楼层
mark.以后有时间也来试一试.

出0入0汤圆

发表于 2011-8-3 22:13:09 | 显示全部楼层
标记一下,技术含量很高,受教了!

出0入0汤圆

发表于 2011-8-5 22:09:37 | 显示全部楼层
回复【140楼】laugh  拉夫
-----------------------------------------------------------------------

能推荐几个性价比较高的轮毂电机吗?做这个项目,电机需要那些特殊功能?

出0入0汤圆

发表于 2011-8-7 10:46:55 | 显示全部楼层
试了几天,发现KALMAN算法行不行的通还有很多窍门,好在N年以前就对这个有玩过,几天内就明白过来了,其实最终依靠的还是传感器的精度和直接对飘移的修正.后悔多年以前没玩下去啊,这个做的好对测试经验要求很高,数学模型也是基于经验评估值的.KALMAN算法的稳定性在于有个加速度这样的绝对值为修正参数,但用现成的参考程序反应比较慢,数学上还要加快预测和预测准度,调参数比较烦琐.
相对刚出大学的,搞数学模型对我实在是比较难了.

出0入0汤圆

发表于 2011-8-7 10:51:44 | 显示全部楼层
KALMAN算法一点也不适合,初中级水平的玩家,从这个入手是转了个大弯,这是大家玩不下去的主要原因.现在才知道不同陀螺仪传感器的价位为什么相差那么大了

出0入0汤圆

发表于 2011-8-7 10:59:22 | 显示全部楼层
感觉不太可能成功,机器人上独轮是内部有横向的转动提供惯量.人....就不好说了.

出0入0汤圆

 楼主| 发表于 2011-8-7 11:46:28 | 显示全部楼层
窃以为目前性价比较高的轮毂电机就是俺这款吧,12寸主要用于改装自行车的,大轮径的肯定贵一些,也重一些,同样功率的小轮径相对扭力要大一些,对于平衡有正面帮助,相比减速电机,这种直驱的故障率应该低一些,维护相对容易。更小轮径的在网上也见过10寸的,但因介绍资料不详细,实际应用不多,暂时没有考虑。
    这几天没弄,没有最新进展,要弄就是查停转原因,然后得把测速间隔减小,目前是hall状态变化完整的6次计算一次速度,转一圈才计算15次,过大的反馈间隔导致了宽幅低频震荡,这个已经可以观察到了。

出0入0汤圆

 楼主| 发表于 2011-8-8 17:42:45 | 显示全部楼层
今天按计划跟踪调试查错,看到几个现象比较奇怪,还没有结论,但愿是自己少见多怪,就像说I2C的从设备拉低SDA以及陀螺仪的输出跳动一样。可以看到数据传输正常,采集数值合理,计算正确,跟踪计算符合预期,但稍长的计算周期观察计算结果跳动较大,与相对稳定的采集数值不协调,肯定中间出什么差错了。再一个,程序跑出了状态机,竟然跳到RESET片段,可是本身是没有设计重置条件的。另外,跟踪过程中看到了时钟外设的计数与程序执行是同步的,当程序停下时,时钟计数也是停止的,程序执行用的主时钟数量多,时钟计数就相应多,但是,跟踪主程序的过程中,多次看到计数满,就是没有跟踪到时钟产生中断。

出0入0汤圆

发表于 2011-8-8 18:31:48 | 显示全部楼层
我卡在算法上了,卡夫曼算法不知道如何调高速度,直接取数误差很大,小车没有一个很快的准确定位,积分的飘移比较大,静止的时候用加速度来修正陀螺仪静止中值,时间拖长,但摆动越来越大,也是飘移引起的.电机肯定不能正常控制了.

出0入0汤圆

 楼主| 发表于 2011-8-9 09:35:33 | 显示全部楼层
回复【152楼】robotkid
-----------------------------------------------------------------------

看来这里是个难点,需要应用的人仔细打磨,就像有了一把好锉刀,怎么用,要锉成什么样,还得用的人积累经验、多动脑筋,没有捷径可走。理论上、经验上,楼上朋友都有了,沉住气,踏实干,技术问题不是问题,总有水落石出的时候!

出0入0汤圆

发表于 2011-8-9 09:56:35 | 显示全部楼层
楼主还是先搞个小的无刷来测试吧,大轮子是比较难了,淘宝上小无刷有霍尔3+5线的也就30多.

出0入0汤圆

发表于 2011-8-11 11:05:09 | 显示全部楼层
左右平衡岂不是要自己身体维持吗?就跟杂技里演的差不多那样?

出0入0汤圆

 楼主| 发表于 2011-8-11 11:46:25 | 显示全部楼层
几天来,真是把我累坏了,就为了排查计算的不稳定问题。单步跟踪能把人累死,怎么细看都很正常,但不定什么时候不正常了,也已经头晕眼花不知道状况了,怀疑中断程序破坏了计算,但看编译程序似乎也很负责的把计算用到的相关内存保护入栈了,再编调试片段,符合某些条件再中止运行查看,很艰难的,我怀疑到只有一个中断做了同样的乘除计算,最终发现,c_imul使用了较多的未命名内存,而这些内存并没有在进出中断时得到入出栈保护,结果导致较低优先级中断的数据丢失。这是编译程序的错误!
    另外这几天没有碰到意外的执行RESET,单步跟踪进不了中断还是有问题,与IDE所做的单步进中断的设置不相符,只能通过在中断中设置断点来观察。

出0入0汤圆

 楼主| 发表于 2011-8-11 15:56:21 | 显示全部楼层
我是本来怀疑除法例程有问题,结果发现在做乘法时,被ADC中断以后,正常的乘数,乘出了0结果,首先去除ADC中断中的乘法运算,这边的角度计算就再也没有那样的跳动了。不过下午我想再度确认是哪个具体的内存时,却一时得不到具体答案了。

出0入0汤圆

发表于 2011-8-11 16:17:32 | 显示全部楼层
lz你用六步换向BLDC驱动方式吧?你验证BLDC由 正转->减速->停止->反向加速 的操作了吗?这涉及到BLDC的4象限运行模式。

出0入0汤圆

 楼主| 发表于 2011-8-12 10:33:35 | 显示全部楼层
楼上所说的四象限,俺印象中看到过,没有太留意这个概念,不过所说的“由 正转->减速->停止->反向加速 ”是必须考虑的,这个没敢忽视。
    不服气,再次细看c_imul的计算过程,终于确认它所用到的最后一个暂存字节是无保护的会被同样的计算返回前清零,而那个字节在进入计算的初期就被用来暂存被乘数的低字节,由于无溢出的乘法运算最重要的数据就在低字节中,所以导致了计算结果为零的现象发生!这个问题应该向ST以及COSMIC反映。

出0入0汤圆

发表于 2011-8-12 11:52:14 | 显示全部楼层
还在搞驱动啊,不如下一步搞吧,到时还要上电流环的,STM8的无刷驱动软件部分不是一般人能做好的.

出0入0汤圆

 楼主| 发表于 2011-8-12 13:34:07 | 显示全部楼层
咱就再发个技术贴吧,c_imul在本例中的汇编代码如下:
0xa6b1 PUSH  A
0xa6b2 LDW   0xce,X
0xa6b4 LD    A,YL
0xa6b6 SWAPW X
0xa6b7 MUL   X,A
0xa6b8 LDW   c_x,X
0xa6ba LD    A,YH
0xa6bc LDW   X,0xce
0xa6be MUL   X,A
0xa6bf ADDW  X,c_x
0xa6c3 LDW   c_x,X
0xa6c5 LD    A,YL
0xa6c7 LDW   X,0xce
0xa6c9 CLR   0xcf
0xa6cb MUL   X,A
0xa6cc ADDW  X,0x00ce
0xa6d0 POP   A
0xa6d1 RET
如果某个中断例程包含了c_imul计算,编译器就会汇编代码在进出中断时保护和恢复除通用寄存器以外的如下内存:(0xc9,0xca),(0xcb,0xcc),(0xcd,0xce),这些是按字保存的,c_imul中只用了0xcd,0xce,0xcf三个字节,其中的c_x就是字(0xcd,0xce),如果中断例程包含了32位计算之类(不仅仅)的,会见到有保护0xcf,0xd0,0xd2之类的操作,但是恰好有个中断例程仅仅包含了c_imul计算,而且它就没有保护0xcf,在上述汇编片段第二行: LDW   0xce,X ,就将0xcf用来保存XL了,在倒数第6行:LDW   X,0xce 取出0xcf到XL时,更高中断级别的c_imul可能已经在倒数第5行的: CLR   0xcf 操作中将它清零了。也就是说,当没有保护0xcf的高级别中断在第二行到倒数第6行之间发生且执行c_imul计算的情况下,现场被破坏。
(本文中所指0xcd等内存地址随不同的上下文变化是浮动的。)

出0入0汤圆

 楼主| 发表于 2011-8-12 13:57:16 | 显示全部楼层
回复【160楼】robotkid
还在搞驱动啊,不如下一步搞吧,到时还要上电流环的,stm8的无刷驱动软件部分不是一般人能做好的.
-----------------------------------------------------------------------

    走一步看一步吧,这个问题不解决也绕不过去呀。在研发中只感觉到摸索的艰辛和平淡,不见有成功的光辉与喝彩,每一个问题都似乎无关宏旨,都在搞些什么小名堂,我也不时会有这样的想法,但是理论上的事不就是那些事吗?早就罗列了,传感、姿态、控制,然而完整地做一件事竟是那么琐碎,有那么多想不到的坎。成功肯定是在理论之外。
    一步步走来,传感器的问题算是解决了吧,通信稳定、计算稳定(这本来都不以为是个事的),电机驱动本以为没有问题,甚至以为借鉴一个驱动库应该简单得多,然而还是有不少工作要去做,至今还没有完全做好。

出0入0汤圆

 楼主| 发表于 2011-8-13 11:37:03 | 显示全部楼层
做好了上面的工作,在裸板和仿真器上稳定运行了几十分钟,ON-FLY模式每秒查看计算结果,更新及时又稳定,烧录以后却发现电机阴死阳活的,不是自己想象的那样反应。把电机的相线拔掉两根,以免调试模式暂停时又烧坏了驱动管,保持HALL信号线相连,把HALL信息也调到WATCH窗口。进入调试模式后,偏转传感器看到数据计算仍是正常的,盘转车轮,看到HALL反应的位置信息也是连贯的,在调试连续运行模式下我尝试连上电机的相线,这时一直设置在RESET片段的断点被触发了,关电重新加电运行,传感器处于水平位置,一偏转传感器又进入到了RESET片段的断点。我怀疑电力不足了,拿万用表测量得到的电压是38V,充满电后的电压是44V,看来真可能是电力不足了,那个电池盒上的电量指示没有标定,两只绿灯看来是误导了。不过此时我又想到那电池标称是36V,测得38V按说也不算亏电哪。
    正在充电中,进一步的测试还没有进行。
    原来的充电插口被我简单的塞到电池盒里面了,反正还不能上路,电力消耗也不大,不常用充电,但眼看就要差不多可以路试了,还是得把充电的方便性考虑到,于是重新做了些调整,顺便更换磨坏了的防转垫片,现在冲击不大了,以后把车架上的方孔也做结实一些,一次性做足强度。

出0入0汤圆

发表于 2011-8-14 09:59:06 | 显示全部楼层
回复【149楼】laugh  拉夫
    窃以为目前性价比较高的轮毂电机就是俺这款吧,12寸主要用于改装自行车的,大轮径的肯定贵一些,也重一些,同样功率的小轮径相对扭力要大一些,对于平衡有正面帮助,相比减速电机,这种直驱的故障率应该低一些,维护相对容易。更小轮径的在网上也见过10寸的,但因介绍资料不详细,实际应用不多,暂时没有考虑。
    这几天没弄,没有最新进展,要弄就是查停转原因,然后得把测速间隔减小,目前是hall状态变化完整的6次计算一次速度,转一圈才计算15次,过大的反馈间隔导致了宽幅低频震荡,这个已经可以观察到了。

-----------------------------------------------------------------------

你的12寸无刷直流电机是在淘宝上买的吗?如果是,能给个卖家的网址链接吗?我以前买了一个,好像不大好用。

出0入0汤圆

 楼主| 发表于 2011-8-14 18:23:26 | 显示全部楼层
回复【164楼】hitor
-----------------------------------------------------------------------
你的怎么好像不大好用啊?俺的也不一定就好用呢。

出0入309汤圆

发表于 2011-8-14 18:50:47 | 显示全部楼层
http://www.engadget.com/2011/08/12/audi-a0-monocycle-concept-takes-you-for-a-jaunt-around-the-park/

audi的产品.lz可以去看看有没有论文可参考

出0入0汤圆

 楼主| 发表于 2011-8-15 11:25:27 | 显示全部楼层
一个商业网站的一个新上传的商品?谢谢提供信息。

    这两天连电机调试时,再次烧了MOS管,我可是老大不乐意。一开始还不太相信,总是通不上电,断开测试电压是正常的,保险管的连接不太稳固,可能导致接触电阻大,通电后压降大?夹紧以后还是依然如故,这时才单独测量控制板的电阻,几乎为零了,就这还怀疑是新连上的充电插头有问题呢,直到测量一对MOS管的栅源、栅漏电阻都几乎为零才将信将疑地决定换掉它们,这是电池均衡保护板的保护动作切断电源的,所以没有烧掉保险。
    这次拆焊用的热风,没有经验,热量不够,费劲拆下来,连带损坏了PCB板,是换个板子还是不换?不换板子就得修复损坏的连线,换就得重新焊接其它连线,一时头疼起来,越发感到干点实事的艰难,甚至怀疑要“行一百半九十”了,干脆再歇歇吧。有那么一刻,灵光一闪有了主意,又有点后悔,不该老从板子上拆焊的,再搞就把管脚剪了,半空嫁接,这样维修就简单了。

出0入0汤圆

 楼主| 发表于 2011-8-16 09:53:23 | 显示全部楼层
昨天先尝试焊接损坏连线的板子,结果热风吹乱了更多的贴片元件,MOS管的连线为了承担大电流,不仅大面积铺铜,还搪上了厚厚的一层锡,热量不足的话就很难熔化,看看那拆过两次的MOS管孔,感觉还是底子差,换块板子还是用烙铁焊吧。
    本以为有了热风不再有用的吸锡器又派上了用场,还是通过清理过孔才得以焊接各个连线,烙铁的温度由320℃调到340℃再调到400℃,原来总怕温度高了,闲时会烧老了烙铁头,现在看调高限温还是有助于提高输出功率的。干了一两个小时,眼花、腰疼,焊了两个MOS管,十来根线,还是没有全部焊完,还差I2C的插针和连线,妄念多啊,就怕啥都弄好了,结果还是有问题。

出0入0汤圆

 楼主| 发表于 2011-8-17 09:54:13 | 显示全部楼层
早就知道,电动车控制器除了基本的控制功能要求外,还要有过流、欠压、堵转等保护功能,在这次研发中,不可避免地想早日窥见成功的影子,直奔理论主题,把这些或许不难实现但也很重要的功能暂时抛在一边了,原来板子上的电压、电流采样ADC通道被我用来测量模拟加计数据了,不然直接对该通道数据做个判断也是很简单的事,如果这样做了,或许不会烧那么多次驱动管。
    我把第二块板子上要用的连线都焊好了,用万用表测量了几个关键点没有问题,可以通电,在断开电机相线的条件下,烧写了最新的程序,看到指示灯的反应跟上块板子没烧以前一样,如果电源没有问题,连上电机相线应该就成功了哈。好事多磨,仍有不明状况发生,注定还要继续摸索下去。

出0入0汤圆

 楼主| 发表于 2011-8-18 19:50:26 | 显示全部楼层
现在初步查明,电机停转是缘于TIM4中断出现了问题,TIM4没有继续执行,所以就不能继续取样HALL信号,HALL信号得不到真实反映,驱动换相就不能正常实现,因而电机被锁死在一个位置上。

出0入0汤圆

发表于 2011-8-19 08:40:04 | 显示全部楼层
每天关注中,期待成功!!!!!!

出0入0汤圆

 楼主| 发表于 2011-8-19 10:18:44 | 显示全部楼层
补充说明,俺手上用的C编译器是STM8 16K Compiler 4.3.4,COSMIC的版本IdeaSTM8-V5.2.6,嵌入在STVD4.1.6中使用,上面的c_imul编译问题就是在这个环境下产生的。
    进一步的亮灯测试表明,TIM4在停止响应时,计数使能位没有被复位,对其计数器计数值的取样表明,TIM4停止响应时,计数器值不定停在什么数值上,这就很奇怪了,都有什么情况会导致计数器停止计数呢?同样烧好的程序,加电运行有时就转很久也没有停下的意思,有时就少则1秒不到,多者5秒左右就卡死不动了。同时也做了其它测试,测试表明,卡死时,其它中断仍在运行,主程序没有复位。电源电压测量41.38V,低速运转时低至41.33V,波动不大。

出0入0汤圆

发表于 2011-8-19 10:20:00 | 显示全部楼层
学习中...

出0入0汤圆

发表于 2011-8-19 20:21:02 | 显示全部楼层
学习学习。。。。。楼主什么时候可以出成果呀

出0入0汤圆

发表于 2011-8-19 23:11:11 | 显示全部楼层
钻到牛角上了,驱动找个反映比较好的就行了,自己玩要很长时间的,首先从数学建模开始,对指定电机的性能全面测好,不是那么简单.

出0入0汤圆

发表于 2011-8-20 10:33:46 | 显示全部楼层
期待楼主成功,建议多注重安全性。

出0入0汤圆

 楼主| 发表于 2011-8-20 14:02:23 | 显示全部楼层
现在我带着比较轻松的心情来宣布,找到原因了。前天说TIM4没有执行是对的,其它中断在执行是对的,主程序没有复位是对的,但是TIM4的计数并没有停止,是因为当时是在中断级别为0的主程序循环上做的测试,当中断级别为1的TIM4都被挂起时,主程序反映的情况就凝结在当时的TIM4计数上。当用中断级别为3的TIM1来测试时,就发现TIM4的计数等所有状态都在持续进行,当电机锁死时TIM4处于中断等待状态,排查了大部分的中断,都没有发现哪个高级中断持续运行,后来还是怀疑到I2C头上,本来I2C应该是在TIM4中断中定时发出读传感器数据时才会发生中断传输,但是还是留意到在TIM4挂起时,它仍在运行。把亮灯测试语句放在I2C中断例程中不同的地方,发现在BTF一段是核心问题所在。进一步的检查发现是我自己添加的“按寄存器地址读”的程序不严密,原来写程序时还添加了注释:
        I2C->SR3;
        I2C->DR = u8_Offset_cpy ;
        I2C->CR2 |= I2C_CR2_START;        //随后将发生BTF事件接着是ReStart,其中BTF没有对应的状态将被忽略

    TIM1与I2C的软件中断级别都是3,但TIM1的硬件级别比I2C高,它们不能嵌套,但如同时排队,则TIM1优先执行。猜想是这样的:BTF事件与ReStart是由硬件相继产生的,BTF事件如果发生在TIM1中断执行期间或者排在TIM1后面,则BTF事件还没来得及被相应,新的START事件又跟着产生了,于是就象先前设想的那样,BTF被忽略了,即使它们在中断管理上是或的关系,I2C中断例程也是先处理START信号的。另外的情况,如果BTF不被打扰,在START产生之前就被响应了,那么START信号可能因为I2C中断例程正在执行而被忽略,但是BTF只是引起中断,执行一些无关疼痒的操作,正像设计时所说的,没有对应的状态,也就是没有读写DR寄存器消除BTF标志,那么它可能就这么着不断地引起中断,除了TIM1可以优先执行外,I2C不再给其它程序留时间。
    重新设计程序,增加一个对应状态的处理,问题解决了。

出0入0汤圆

 楼主| 发表于 2011-8-20 20:55:41 | 显示全部楼层
旧的问题解决,新的问题浮出水面,正反两方向表现还不一致,正向的角度相关性还比较好,反向还要更飘忽一些,有时也能正确反映角度的大小。
    至于说是不是牛角尖呢,那就不好说了,这些技术细节对人也是个磨练和考验吧,能不能在所谓技术之外下点功夫让问题简单一些,这个想法是不错,不过,现在所做的似乎也不过分,是研发应有之义吧。

出0入0汤圆

 楼主| 发表于 2011-8-21 10:30:05 | 显示全部楼层
在撤掉亮灯语句时感觉到稳定性变差了,这也实在让人纳罕。联想到之前见到的进出中断的现场保护代码,我意识到,编译器并非完全是根据数学_运算的需要来保护相关内存的,只要中断例程中有例程调用,不管调用的例程代码是否复杂,是否用到相关计算内存,编译器都给出了比较完善的内存保护,一句                LightLED();                        //亮灯
的例程就是:
void LightLED(void)
{
                GPIOA->ODR |= BIT6;                                //亮灯例程

}
这么简单的另一句,它们导致中断保护代码的区别,或许这样已经让编译器认为够复杂了,否则就是太简单。
    我没有细分是什么冲突,但从经验来看,中断中调用个例程有助于减少冲突。我现在有意先保留亮灯例程,进行较长一段测试时间再看。

出0入0汤圆

 楼主| 发表于 2011-8-23 11:51:17 | 显示全部楼层
有时间就加电试试,把传感器偏来偏去,把车轮转来转去,还没有改测速程序,也还没有改刹车条件,就先保持原样,发现大部分时间正向偏置时,转速与倾角是正相关的,慢慢偏转到负倾角时,电机反转并也与角度大小相关,但如果快速偏转到负倾角,大多是快速正传、慢速反转,并如此反复若干次,且没有最后保持稳定反转的趋势,还有,有时不管偏转到哪个角度,电机就是不自主转动,如果用手盘转,稍后它就反弹转回来,并且有这样的表现,如果缓慢盘转,它反弹时如果持续给它阻力,它就会持续的转动,如果没有阻力,它却不再转了。还有一个特别的表现,加电就高速等速转动,不管传感器是什么角度。
    说起来还是比较乱的,回来看能不能查明白是怎么回事。

出0入0汤圆

发表于 2011-8-23 14:04:14 | 显示全部楼层
好像这种无刷电机的正,发加减速运转停难处理的

出0入0汤圆

 楼主| 发表于 2011-8-24 10:12:20 | 显示全部楼层
心需要沉淀!
    在解决电机死锁问题以后,我的胆子又大起来,反正传感器处于水平位置附近时,电流输出也很小,我不妨再联机调试,这样既可以观察控制流程,也可以随时查看关键数据的变化,比用所谓上位机要方便而且功能强大,还考虑需要时把有些数据写入EEPROM,随后还能回放查看,有了这些手段,查出问题就是早晚的事了。昨晚如此联机调试,重启两三次,表现都基本没有问题,只有一次看到传感器数据缓冲区都是不变的0,那时就表现为传感器无反应,盘转电机会反弹。

出0入0汤圆

发表于 2011-8-24 13:37:35 | 显示全部楼层
很好

出0入0汤圆

 楼主| 发表于 2011-8-24 20:48:52 | 显示全部楼层
今天先把电磁刹车的条件提高到60rpm以上了,低速正转PID调节到下限时直接转反向驱动,刚提高后,车轮在远离零位时稳速运转,在零位附近表现为反复震荡。进一步把测速频次提高6倍,即于每次Hall变化时统计速度,震荡现象消失,反复倾斜传感器,车速反应正常稳定。有一次发现其它正常,但倾角计算恒定为0xff38,后来证实,这其实是传感器接收缓存的初始化数据,真正的数据并没有读入,这就是有时开机就高速等速转动而不理传感器的内在原因,看来I2C通信的问题还没有完全解决。进一步检查发现定时读取I2C的容错判断只是对冲突做了处理,对传感器类似断电无应答的状态没有判断处理。

出0入0汤圆

发表于 2011-8-24 23:07:47 | 显示全部楼层
关注 学习中.

出0入0汤圆

 楼主| 发表于 2011-8-25 10:29:14 | 显示全部楼层
前几天看到的快速正传、慢速反转,并如此反复若干次的情况,应该与大测速间隔和低至0速仍在等待刹车PID调节达到极限的策略有关,这两项改写以后,只要传感器工作正常,车速反应就基本正常稳定了。传感器还有一样不稳定的,表现为陀螺仪有效,加计失效,反应在动作表现上就是偏转中有倾角反映的转动,停在任何角度倾角反映应有的转动都停止了。尽管如此,暂时不考虑传感器可能断电的表现,我打算把角速度考虑进来,再次立车实验。
    把设置目标速度的角度相系数设为0,调整角速度相系数,从0.5一直增加到32才得到比较明显的速度反应,然后恢复角度相系数为0.5,合并计算以后,车轮车架水平躺着,传感器单拿着处于工作姿态,看到车轮的转动基本符合预期,就把电线归整归整,把传感器用叠好的卫生纸垫着顶在控制盒侧面。可惜这次实验仍以失败告终,表现还不如当初只用一个模拟加计,反应怪怪的,有时突然快速转动,我再次陷入困局。

出0入0汤圆

 楼主| 发表于 2011-8-26 09:47:55 | 显示全部楼层
“科学的东西是个老老实实的东西,来不得半点的虚伪和骄傲。”我只当它是耳旁风,想如今诸多困局,无非是冒险急进的结果,如果踏实一些,知道的问题先解决,碰到问题就研究解决问题,也没什么期待和困顿。
    昨天晚上把独轮车重新放倒,把顶在控制盒侧面的传感器拿出来,通电测试和立车测试的反应一样,说明还是有实质问题没有解决,不一定是平躺与立车的区别。

出0入0汤圆

发表于 2011-8-27 08:13:52 | 显示全部楼层
楼主,散件在哪儿订购的。

出0入0汤圆

 楼主| 发表于 2011-8-27 11:09:04 | 显示全部楼层
根据130楼的描述,加之近来实验认为+/-250°的量程偏小,将量程改到+/-500°,相应公式改为,New_Angle_Value = (Angle_data.Angle_Value *49+ (-GY_data)/33+(-AC_data))/50; 刚才振作起来继续实验,加电无反应,查过之后发现是虚惊一场,原来是SWIM的一根信号线接错了。更正之后联机没有发现特别的问题,我还是打算把知道的问题先处理好再说。

出0入0汤圆

 楼主| 发表于 2011-8-29 10:56:55 | 显示全部楼层
反正陀螺仪的采样数值还是要除以一个很大的数值(66、33等),何必用那么小的量程呢?即使改为+/-2000°的量程,换算成0.25°的刻度还是要除以8,超出量程如果是舍弃高位的话,那么造成的误差可不是一点点了。在存在震动、摇动和摆动的情况下,难保哪次采样时瞬时角速度不会超出量程,甚至在零点几秒内连续超出量程,如果是这样的话,小量程得到的结果可信度就很差了,说不定那个怪怪的反应就是这么来的,我还是把量程设到最大吧,而且需要在发现I2C通信出错时,重新初始化传感器的若干设置,以免读出的是缺省设置下的数值就仍然是问题。
    将速度相系数设为32或许太大了,也许需要做其它形式的计算,它的本意是要让车轮形成一个适当的加速度以抵偿角速度,目前直接与角度相加权相加并不是一个严谨的做法。
    测速间隔改为每霍尔信号后,盘转车轮的反应就比原来及时多了,大约在10-20°的样子就受到很大的阻力,这个反应或许可以起到及时平衡的作用了。

出0入0汤圆

 楼主| 发表于 2011-8-30 11:14:54 | 显示全部楼层
“转起来容易,要长久的转,转得好才难!”正是应了这个论断,成功?不知道是哪天、啥叫成功了。虽然我不是黄蓉,我没有武功,可是有梦想谁都了不起不是?
    这两天把启动时调用的8条I2C的while设置语句修改了一下,改成分时顺序调用,成功执行的下一调用时刻顺序进行下一条,不成功的,下一调用时刻继续执行本条,当程序读传感器数据时同时读出设置数据,如果不符合应当写入的设置值,就将设置变量设为设置语句条数,分时调用程序可以顺序将它们一一执行,从而避免陷入死循环。
    暂时还将角速度项去掉,仅仅保留角度项,并把系数由0.5提高到1,这样反映出来的速度就比较快了,比较接近实际上路时的倾角-速度关系。如此修改的程序直接烧写了,转速对倾角的反应还是正常的,但有时快速折返时的一声“喀”还是让人不太放心,也许在PID的调节下无论如何要柔和曲线一些,不应该一顿吧,还是有那么一次,顿住了就不动,用手搬不转,诧异间,一股青烟升起,不同路的两只MOS管又烧了。我不能再用TIM4的低软件级别中断读取霍尔信号了,这太容易卡住了。

出0入0汤圆

 楼主| 发表于 2011-8-30 15:23:04 | 显示全部楼层
回复【188楼】xijinma
楼主,散件在哪儿订购的。
-----------------------------------------------------------------------

    就好像我冷清的小店里来了客人,赶紧招呼吧。散件的来源在最前面大致说了一下的,基本上就是淘宝上买的,目前折腾得并无成效,客官不如自己另寻方案再来交流。

出0入0汤圆

 楼主| 发表于 2011-9-1 15:47:52 | 显示全部楼层
还没有时间和心情空中嫁接MOS管,今天先把传感器连在仿真开发板上用调试器跑跑程序看。上午跑得没发现什么异常,刚刚在重新建立条件试跑时,发现没有进入正常的读数循环,点击暂停时恰好停在了I2C中断入口处,跟着看了一下,SR1中的TXE与BTF是置位的,CR2中的ACK与STOP是置位的,SR2中无错误位信息,奇怪在于STATE是初始化状态的0,照这后者的意思,我的程序还没有发送任何读写指令,I2C的中断从何而来呢?跟踪之后,BTF可能因调试程序的读取而清零,但TXE没有因此而清零,感觉有异常,先记录下来再说。

出0入0汤圆

 楼主| 发表于 2011-9-2 11:27:41 | 显示全部楼层
再度查看程序,I2C的中断控制器初始化时没有开放缓冲中断,只开放了事件中断和错误中断,也就是说TXE是不会引起中断的,但BTF会,昨天记录下来那些内容以后,接着跟踪,退出I2C中断以后,紧接着先后执行了另外两个排队的ADC和TIM4中断,反正可以断定,还是意外的没有Hold住的BTF导致了I2C不断地中断使TIM4不能执行而烧了MOS管。

出0入0汤圆

 楼主| 发表于 2011-9-2 17:35:13 | 显示全部楼层
在传感器模块加电以后就不再断电的情况下,调试程序通过SWIM重启MCU,这种情况下发生了对GY寻址无应答,但是GY本应缺省关闭正常设置也是打开后就关闭的第二I2C通道却表现畅通,对AC的设置命令却能正常返回。我已经把设置要用的数据都设在ROM中了,不应当再有误写GY的ID寄存器的情况发生了,老是寻址不到,我真的对这个什么MPU3050要失望了。本来也没有什么I2C和传感器使用经验,总是折腾这些,积累的这种经验有用吗?

出0入0汤圆

发表于 2011-9-2 21:15:16 | 显示全部楼层
手机用的加速度能好的到那里,退一步从最简单的开始就容易明白了.

出0入0汤圆

发表于 2011-9-2 22:16:13 | 显示全部楼层
上个月出差米国,正好看到这玩意,顺手来了一张。
独轮车ourdev_673594HNAK7I.JPG(文件大小:6.62M,只有400K以内的图片才能直接显示) (原文件名:独轮车.JPG)

出0入0汤圆

 楼主| 发表于 2011-9-4 08:50:47 | 显示全部楼层
楼上的图片看不到,得到的网页是
Proxy Error
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /bbs_upload849306/files_45/ourdev_673594HNAK7I.JPG.

Reason: Error reading from remote server

    今天早上空中嫁接两只MOS管顺利成功,尽管正如第一次设想的那么好,但这么多天来没动其实还是害怕失败,另一方面也说明,适当的放下,也能积攒一定的心理能量。

远景 (原文件名:SNC00194.jpg)


近景 (原文件名:SNC00193.jpg)

出0入0汤圆

发表于 2011-9-4 10:45:15 | 显示全部楼层
力挺!

出0入0汤圆

 楼主| 发表于 2011-9-5 15:47:29 | 显示全部楼层
又纠正了一个通信BUG,并把I2C总线及电源断开重接,也在未人为干预的情况下,看到程序检查GY失态时重新初始化,这会儿,又停下来,竟然在我欲设置0x1a的位置出现了非0的0x1b,我真的不能不怀疑这款器件的性能了,希望走过路过的朋友能再热心推荐一款。

出0入0汤圆

发表于 2011-9-5 16:07:54 | 显示全部楼层
回复【201楼】laugh  拉夫
    又纠正了一个通信bug,并把i2c总线及电源断开重接,也在未人为干预的情况下,看到程序检查gy失态时重新初始化,这会儿,又停下来,竟然在我欲设置0x1a的位置出现了非0的0x1b,我真的不能不怀疑这款器件的性能了,希望走过路过的朋友能再热心推荐一款。
-----------------------------------------------------------------------

我也正在做这种独轮车,刚刚起步在传感器,单片机,电机驱动器三者的连接上遇到了些困难,有些问题我想及时请教楼主。1471670475这是我的qq号,你能加我qq吗?传感器的问题我可以提供些意见。

出0入0汤圆

 楼主| 发表于 2011-9-5 20:31:59 | 显示全部楼层
请有话发在论坛吧,俺不常上QQ。

出0入0汤圆

发表于 2011-9-6 11:23:51 | 显示全部楼层
我是转回去用ADXL103+ADXRS300这样组合了,原来的IDG300+MXC62025只是用来验证一下,正在从STM32转到PIC的单片机上了,你的传感算法再好,器件不行也没用的.如果传感器好根本不用算法,直接出来数据就是非常正确和同步的.

出0入0汤圆

发表于 2011-9-6 11:40:52 | 显示全部楼层
酷贴。这个有难度。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 21:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表