cj_212121 发表于 2011-9-2 11:00

【顶】TI例程PMSM3_1 level4 调试

小弟在调试PMSM3_1的时候,前三步调试都OK,给电机发600转参考转速,电机能稳定运行,当准备调试第四步后,准备调试QEP模块,借鉴的是TI的QEP代码,将代码添加及运行之后发现电机是能正常运行的,但是电机转速不能实时显示?这是问题一
问题二在于DerectionQep这个变量发现一直在0~1之间变化,但是我给的是正转模式,不可能一直在0~1之间变化的,我能够确认我的硬件环境搭建是正确的,但是为何转速检测就不对了呢,而且转速在CCS上不能实时显示,需要定时刷新,反馈出来的转速PU值也有问题?
最后,不管level4调试后,直接进去level5调试,将各个模块弄好之后,给电机发600转速,一上电,电机就卡在那里,一直不懂,经检测PWM波形不对,有些IGBT上下桥臂都是导通的,不知道为什么?
我怀疑是转速检测有误导致了IQ电流输出有误,于是就形成了PWM波形不正确的问题?
但是,我采用的QEP代码是TI例程的,代码应该是正确的啊,但为何转速检测不行呢?
我只是将编码器脉冲改了下 其他都没变,因为我的编码器脉冲线程为1024的?
请高手能够及时帮助我 谢谢!
一直等待中~

lbz0123 发表于 2011-9-2 15:09

楼主把代码好好看看吧 不能全都套TI的吧
测试的方法 动动脑子就有了吧
你怀疑转速检测有问题 用一个检测仪器把转速量出来嘛
对照方针时看到的转速 看看不就知道有没有问题了 有问题 一步步反推 朝上找 一定找得到问题的
显示是标幺值 再建个变量 把标幺的反算回来不就好了
要定时刷新 一般编译软件都有实时监控功能吧 没有的话 用DA送出来 用串口送出来 用LED显示出来 都可以的吧

lyftcl 发表于 2011-9-2 18:59

很早前弄过这个例程,当时好像QEP出现过一些问题,最后发现是接地的问题。
仅供参考。

另外,最好先单独验证QEP输出的波形是否对,你可以转起来验证,也可以手来慢慢转,然后看QEP的编码。

遇到问题,最好的就是从根源慢慢找,总会找到的。

建议先不考虑level 5和IGBT波形,专心QEP

cj_212121 发表于 2011-9-3 09:40

各位,谢谢了,其实有个问题:
就是编码器出来的是A、B、Z三相脉冲,这三相脉冲就直接连接到QEP1、QEP2、CAP3就行了,但是有个问题 编码器出来的地也要接到控制板上QEP接口的地吗?
我现在调试是连着的?
其实我是这么采集转速的,我用的是多摩川的旋转变压器,采用其输出脉冲的模式A/B/Z脉冲来输入到控制板QEP中来进行转速采集的
用手动转 电机用示波器看看是否QEP1引脚那里有没有方波脉冲是不是?
还有一个问题,琁变除了A/B/Z三相脉冲外,还有一个方向信号,这个信号也要接到QEP的接插件上吗/
在CCS怎么能够实时地显示转速PU值。看变量窗口 这个好像实时性不高。
希望能尽快帮助我,谢谢

1huangbin 发表于 2011-9-3 10:53

请问你是怎么具体调试的

cj_212121 发表于 2011-9-3 13:08

什么怎么调试的,我有驱动板,是可以用开关来控制电压输入的,然后利用旋变输出A/B/Z三相脉冲信号接入到QEP1/QEP2/CAP3中,然后点运行,但是发现转速检测不正确,同时在CCS上夜看不到是否能进入到CAP3中断中,同时DirectionQEP这个变量 一直在0~1之间变化。但是给定的电机是正转,不可能一直在变化的。目前所以的QEP代码基于TI的,我也看了N遍 程序应该没有多大问题,数据格式也看过了 就是找不到原因。同时,在CCS变量窗口上想看反馈的实际转速 却是0 Q0格式的,到底为什么呢?我确认A/B/Z脉冲都已经接入到QEP中了,但就是找不到原因。

lbz0123 发表于 2011-9-3 13:24

旋变 多摩川的多数是一对极的 这个要注意 解码芯片出来的信号 首先要确认信号的质量 有时候会有干扰影响
方向信号应该不用了 AB信号可以表示的

lyftcl 发表于 2011-9-4 11:17

...那个,多摩川的旋变,如果是指的磁阻式旋转变压器的话,还真没见有一对极的。不知道什么样子?是椭圆型转子的那个吗?
椭圆型的那个定子,代表有两个凸起,或者叫lobe

如果你用旋变的话,就不再是编码器的地了,你肯定用了AD12XX或者AU6XX芯片,把芯片的板子的地和DSP板子的地连一起,这个很重要。

然后还是先验证RDC (Resolver to Digital Converter)这块电路没有问题,自己手转,看A,B信号是否正常,以及能否出Z。
这些验证完以后,再次确认硬件平台无误以后,再验证QEP的结果。
旋变芯片产生的方向信号请忽略。
DirectionQEP信号也可以忽略。

一个很重要的问题,电机具体是怎么转的,不管软件里面如何显示的,电机到底转了没?是不是你手动转的?还是在电流驱动下转的?
另外,帮忙说下LEVEL 4到底是哪个调试,记得LEVEL 3是电流环吧,4是转速环吗?多谢。

另外,CCS没法很好的实时显示变量,即使实用实施模式,而且上高压直流母线以后,实时模式有一定的概率出故障,会导致管子直通,烧过三个控制器,其中一个用了灭火器。如果可能就用CAN。如果不可能,就手转慢点儿。。。

cj_212121 发表于 2011-9-5 10:04

首先,谢谢大家,在这里给我回复!
就像lyftcl所说的,已经确认过了 RDC (Resolver to Digital Converter)这块电路没有问题,自己手转看A,B信号有脉冲信号 正常,也能出Z脉冲;
同时,将解码板脉冲输出的地和DSP板上的地已经连在一起了,然后用示波器显示 A/B/Z脉冲信号都出现了,然后将A/B/Z分别接到DSP的QEP1/QEP2/CAP3 。然后再level4调试 level4 是电流闭环 转速开环 主要检测QEP模块和转速检测,前期几个步骤都调试OK了,现在就是QEP的问题
有个问题,琁变解码板连出来的A/B/Z/GND/DIR(方向)中的DIR还要不要连到DSP端?
然后给电机发转速指令,电机稳定运行,用TI的QEP程序但就是不能检测出电机转速,转速反馈出来也不是正确的?是不是由于琁转变压器与电机A相绕组的偏移角度 设置问题还是什么问题?
请各位帮忙

lyftcl 发表于 2011-9-5 11:38

DIR不需要连接到DSP端.
不是旋变的偏差问题(叫做旋变安装误差),这个只会影响转矩,不会影响转速检测。
我饭后看一下TI那个程序,稍侯再回复。

lyftcl 发表于 2011-9-5 12:58

刚看了TI的那个历程,LEVEL 4是给个假速度指令,然后运转的。那样就好办了。
你现在已经明确了是QEP或者SPEED_FR的问题,所以针对假速度信号和真速度信号做对比。
先看EvaRegs.T2CNT,再看qep1.RawTheta的数值是否合理,然后看qep1.ElecTheta和 speed1.ElecTheta
这里有很重要的一点:你的电机是几对极的,旋变几对极的?旋变极对数必须是电机极对数的最小公约数。
如果不满足此点的话,换电机或者换旋变。
如果满足了最小公约数的关系,看上面speed1.ElecTheta和qep1.RawTheta之间是否满足了这个极对数比的关系。
如果以上都没问题的话,开始调试speed模块。
自己建一个变量叫什么OldElecTheta,别忘记在.h里面声明,然后把ElecTheta的数值每次赋值给OldElecTheta,自己通过Watch Window来观察数值是否正常。然后看Tmp1,这个是内部量,要引出来看。
我记得以前帮同事调过一段这个程序,最后发现是他Q格式之间转换有问题,所以最后输出的结果就永远是0了。

这样调试下来,应该能找到问题的,而且遇到问题一般也是这样从最根本一步一步来的顺序的,这是一位我很佩服的顾问教我的第一点。

lyftcl 发表于 2011-9-5 13:01

还有一点,如果看到椭圆型转子的多摩川旋变,不要以为这是一对极的。这是两对极的。。。
尽管当时多摩川最大的代理艾尔特口口声声说这是一对极的。。。
这样的旋变,我们这用了不少了,所以椭圆转子是两对极的信息,还是可以保证的。

cj_212121 发表于 2011-9-5 13:03

电机位置检测:
#include "DSP28_Device.h"
#include "f28xqep.h"
#include "f28xbmsk.h"

voidF28X_EV1_QEP_Init(QEP *p)
{

          EvaRegs.CAPCON.all = 0x9004;   /*设置捕捉单元 */
          EvaRegs.T2CON.all = 0x9872;    /*设置捕捉定时器*/
          EvaRegs.T2PR = p->         
    EvaRegs.EVAIFRC.bit.CAP3INT = 1;                           /*清除CAP3标志*/
          EvaRegs.EVAIMRC.bit.CAP3INT = 1;                   /*使能CAP3中断*/
          GpioMuxRegs.GPAMUX.all |= 0x0700;                    /*配置捕捉单元的引脚*/
}   


void F28X_EV1_QEP_Calc(QEP *p)
{
   long tmp;

   p->dir_QEP = 0x4000&EvaRegs.GPTCONA.all;
   p->dir_QEP = p->dir_QEP>>14;
   
   p->theta_raw = EvaRegs.T2CNT + p->cal_angle;
   
   tmp = (long)(p->theta_raw*p->mech_scaler);                /* Q0*Q26 = Q26 */
   tmp &= 0x03FFF000;
   p->theta_mech = (int)(tmp>>11);                                 /* Q26 -> Q15 */
   p->theta_mech &= 0x7FFF;
             
   p->theta_elec = p->pole_pairs*p->theta_mech;                /* Q0*Q15 = Q15 */
   p->theta_elec &= 0x7FFF;
   
}

void F28X_EV1_QEP_Isr(QEP *p)
{

   p->QEP_cnt_idx = EvaRegs.T2CNT;
   EvaRegs.T2CNT = 0;
   p->index_sync_flag = 0x00F0;

}



//    TMS320F2812电动机位置检测QEP电路初始化参数及函数定义
//    文件名称:F28XQEP.H
//******************************************************************************
#ifndef __F28X_QEP_H__
#define __F28X_QEP_H__

#include "f28xbmsk.h"
/*                 初始化T2CON和CAPCON                 */
#define QEP_CAP_INIT_STATE    0x9004
#define QEP_TIMER_INIT_STATE (FREE_RUN_FLAG +          \
                        TIMER_DIR_UPDN +         \
                        TIMER_CLK_PRESCALE_X_1 + \
                        TIMER_ENABLE_BY_OWN +    \
                        TIMER_ENABLE +         \
                        TIMER_CLOCK_SRC_QEP +    \
                        TIMER_COMPARE_LD_ON_ZERO)

/*定义QEP (正交编码电路) 驱动的对象 */
typedef struct {int theta_elec;           /* 输出: 电动机电角度(Q15)                                                */
                int theta_mech;            /* 输出: 电动机机械角度(Q15)                                                */
                int dir_QEP;              /* 输出: 电动机转动方向 (Q0)                                                */
                int QEP_cnt_idx;         /* 变量: 编码器计数(Q0)                                                */
                int theta_raw;           /* 变量: 定时器2得出的角度(Q0)                             */
                int mech_scaler;           /* 参数: 0.9999/计数最大值,计数最大值 = 4000 (Q26)         */
                int pole_pairs;            /* 参数: 极对数(Q0)                                                        */
                int cal_angle;           /* 参数: 编码器和相之间的角度偏移量 (Q0)                        */
                int index_sync_flag;        /* 输出: Index sync status (Q0)                                               */
                void (*init)();           /* 初始化函数指针                                                         */
                void (*calc)();           /* 计算函数指针                                                               */
                void (*isr)();              /* 中断程序指针                                                                   */
                }QEP;

/*                定义一个QEP_handle                        */
typedef QEP *QEP_handle;
#define QEP_DEFAULTS { 0x0, 0x0,0x0,0x0,0x0,16776,2,-2365,0x0,\
                (void (*)(long))F28X_EV1_QEP_Init,            \
                (void (*)(long))F28X_EV1_QEP_Calc,                    \
                (void (*)(long))F28X_EV1_QEP_Isr }
void F28X_EV1_QEP_Init(QEP_handle);
void F28X_EV1_QEP_Calc(QEP_handle);
void F28X_EV1_QEP_Isr(QEP_handle);

#endif /*__F28X_QEP_H__ */
上面为QEP 头文件
我在主函数里面 我问过旋转变压器产商 它们的解码板 输出的是1024个脉冲,因此QEP脉冲为4*1024=4096
里面的偏移角 cal_angle 我随便设的

cj_212121 发表于 2011-9-5 13:04

谢谢你们了 领导一直要求的紧,我等会下去调试一下,哎!没办法啊

cj_212121 发表于 2011-9-5 15:54

lyftcl   哥等你呢 怎么样了,一直等你的回复呢~

lyftcl 发表于 2011-9-5 17:25

那个MechScaler的16776哪里来的,很像2^26/4000 -1啊,但是你不是1024线的吗?
为什么按1000线的来计算,感觉16776应该变成16384.

对,你写了。。。/* 参数: 0.9999/计数最大值,计数最大值 = 4000 (Q26)
看来确实是这里有个问题,4000还是4096,需要明确下。

其他的应该没什么问题了,因为很久不用开发板,都给同事用了,所以程序没有上机调,就大致看了看,应该没其他的问题了。

就是,这里的PolePairs其实,并不是PolePairs,而是PolePairsRatio=Motor PolePairs/Resolver PolePairs,一般Encoder的PolePairs=1,所以,就直接是PolePairs=Motor PolePairs了。

另外,再确认下,你使用的旋变到底是不是一对极的,别相信代理商的,哪怕发信给TAMAGAWA之后,自己也要再验证一遍。解码板是1024的不错,但是并不意味着旋变是一对极的。
如果真的是一对极的旋变的话,希望能发个图上来,因为很想看一下到底什么样子。

呃。。。公司网络坏了。。。快下班了才发成。。。

songyuanfj 发表于 2011-9-5 19:22

兄弟真厉害,我level1都没通过,电机就在原位不停地抖动,不解啊,求解啊

lyftcl 发表于 2011-9-6 00:06

LEVEL 1的问题估计楼主最清楚···问他·

cj_212121 发表于 2011-9-6 09:54

谢谢 lyftcl百忙之中给我回复,我等会按照你的思路再调一下,如果实在不行,我能否将程序发给你邮箱,让你帮我看一下,我的邮箱是cj_212121@126.com。
现在来解决下一些问题:
1、关于MechScaler数值,因此解码板是1024 所以MechScaler=1/4*1024 再转化成Q30格式,我检查过了是对的,上面那个是笔误,以前的数据。
2、关于电机极对数的问题,问过电机厂家 它们说是4对极,还有Tmp1,这个是内部量,怎么引出来,是不是再设个变量进行赋值,麻烦您告诉我一下,谢谢!
3、下面是旋转变压器和解码板示意图

lbz0123 发表于 2011-9-6 10:08

旋变是不是一对极 拉个反电动式出来 手动转一下看看不就行了
enconder没有极数概念的 TI的例程应该是针对光编写的 所以没考虑旋变的问题
“里面的偏移角 cal_angle 我随便设的”
这个偏移角不能随便设吧 与实际不符的话会影响电机启动吧
页: [1] 2 3 4 5 6 7 8
查看完整版本: 【顶】TI例程PMSM3_1 level4 调试