李维强-15级 发表于 2020-7-27 19:30:23

老化测试项目

select TestId,eleStandardSpeed,SetTorque,GetTorque,eleCurrent,Temperature
from t_d_ExteCharacter where eleStandardSpeed<>0 and testId in ('20200723172513_2513_877','20200723172517_2517_171') ORDER BY id asc

SELECT TestId,SetSpeed,GetSpeed,eleCurrent
from t_d_PointMoveTest where testId in ('20200723172513_2513_877','20200723172517_2517_171') ORDER BY id asc

SELECT TestId,PosSetPos,PosGetPos,NegSetPos,NegGetPos
from t_d_PosAccuracy where testId in ('20200723172513_2513_877','20200723172517_2517_171') ORDER BY id asc

SELECT TestId,SetSpeed,GetSpeed,eleCurrent,Temperature
from t_d_Precondition where testId in ('20200723172513_2513_877','20200723172517_2517_171') ORDER BY id asc


SELECT TestId,SetSpeed,GetSpeed,eleTorque,eleCurrent
from t_d_SpeedAccuracy where SetSpeed<>0 and testId in ('20200723172513_2513_877','20200723172517_2517_171') ORDER BY id asc

李维强-15级 发表于 2020-8-10 11:31:43

本帖最后由 李维强-15级 于 2020-8-14 08:09 编辑

下位机问题讨论


问题1:DMA内buffer强转有问题
sample_key_LED_user.c开启DMA
30行   :HAL_ADC_Start_DMA(&hadc1, (uint32_t *)sampleBuffer,4);
分析:sampleBuffer是16位的数组,这里强转成32位 感觉不对,但是实际又是对的,不理解

解决办法:指针本身就是32位的,这里只是为了应对函数参数类型,强制转换

问题2:ADC采集会报溢出错误。

#define                ADC_ARR_SIZE                (20)
//结构体
typedef struct {
        uint16_t                 cur;
        uint16_t                ADC_Sample_Buffer;
        uint32_t                sumVal;
} ADC_Arr_Struct;


// TIM1 更新中断回调函数杨总源代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        ADC_Arr_Struct *p;
        p=&ADC_Data_Arr;
        if(htim == &htim1)                        // 如果是TIM1的更新中断
        {
                uint8_t i;
                for(i=0; i<sizeof(sampleBuffer); i++)
                {
                        ADC_AddSample2Arr(p+i, sampleBuffer);
                }
        }
}

分析: 在ADC_Arr_Struct中 sumVal位32位ADC_Sample_Buffer为16位,即使100个ADC_Sample_Buffer相加 也不会超过32位
在for(i=0; i<sizeof(sampleBuffer); i++)这一句中sizeof内实际是获取的sampleBuffer总的字节数,那么就是8 循环会进行8次,而这里只需要执行4次,指针操作在后面4次就会溢出。

解决办法改为:for(i=0; i<sizeof(sampleBuffer)/2; i++)

李维强-15级 发表于 2020-8-12 17:41:00

本帖最后由 李维强-15级 于 2020-8-12 17:57 编辑

外特性工况测试的疑问:
先看该工况的测试代码

        for(uint8_t i = 0; i < 10; i++)
        {
                WTX_Spd = (i + 1) * 100;
                WTX_Tq = 2000;
        }


static void ExtnCharacterTest(ExtnCharacterTest_Structure* pExtnCharac)
{
        respDebugMsg("外特性测试", TestEndFlag, ENABLE);
       
        uint8_t        ErrCode = 0xFF, ErrCode_t;
        uint8_t Idc = 0;
        TorqueMeasure_Structure Tq;

        PowerOFF(TestMotor);//电机断电
        PowerOFF(StdMotor);       
        HAL_Delay(1000);
        Power_ON(&(motorParaDta.power_ON_Data));       
       
        SetMotorState(TestMotor, Stop);
        SetMotorState(StdMotor, Stop);
        HAL_Delay(500); //停止后必须延时一段时间,否则Stop->Run无法成功切换
       
        SetMotorModel(TestMotor,TorqueModel);
        SetMotorModel(StdMotor,SpeedModel);
       
        SetTorqueData(TestMotor,0);
        SetSpeedData(StdMotor,0);
       
        SetMotorState(TestMotor, Run);
        SetMotorState(StdMotor, Run);

//////////////////////////////////////////////////////
//////以下代码由李维强修改       区分到底是哪里出了故障       
        for(uint8_t i = 0; i < sizeof(WTX_Spd)/sizeof(WTX_Spd); i++)
        {
                SetTorqueData(TestMotor,WTX_Tq);
                SetSpeedData(StdMotor,-WTX_Spd);
                HAL_Delay(EXTNCHARAC_TIME_MS - 1000);
               
                ErrCode = MotorErrCheck_Li(TestMotor);
                if(ErrCode == 0)
                {
                        Tq.setTorque = WTX_Tq;
                        Tq.measureTorque = GetTorqueMeasure(StdMotor);
                        Idc = GetIdc(TestMotor);
                        pExtnCharac->timeStmp = sysCnt;
                        pExtnCharac->current_mA = Idc;
                        pExtnCharac->speedStdMotor = GetSpeedMeasure(StdMotor);
                        pExtnCharac->tempMeasure = GetMotorT(TestMotor);
                        pExtnCharac->torqueMeasure= Tq;       
//                ErrCode = TqErrCheck(Tq.measureTorque - Tq.setTorque, EXTNCHARAC_TQERR);//扭矩误差检测                                               
                        ErrCode_t = MotorErrCheck_Li(StdMotor);    //标准电机故障检测
                        if(ErrCode_t != 0) ErrCode = ErrCode_t;
                        if(ErrCode == 0)
                        {
                                ErrCode_t = MotorErrCheck_Li(TestMotor);    //被测电机故障检测
                                if(ErrCode_t != 0) ErrCode = ErrCode_t;
                                if(ErrCode == 0)
                                {
                                        pExtnCharac->ErrorCode = ErrCode;
                                        HAL_Delay(1000);                                       
                                }                               
                        }                               
                }               
                if(TestEndFlag == 1) break;
        }
        //最后再赋值一次错误代码
        pExtnCharac->ErrorCode = ErrCode;
///////////////////////////////////////////////////////

       
        SetMotorState(TestMotor, Stop);
        SetMotorState(StdMotor, Stop);       
       
        motorParaDta.finallyProc = 4;
}

现象1:3510的电机 在力矩设置为1000的情况下都不能带动自身起转,需要至少1500以上,就更不用说带动标准电机了。电机扭矩所对应的设定值线性关系还需要测试出来
问题1:在以上代码中的31行,32行上面目的是为了设置 被测电机以某个力矩来跑,标准电机以某个速度来跑。在经过反复调试后发现。注意 这里的32行设置的标准电机速度方向和被测电机力矩方向是一致的,并没有形成反向扭矩。打个比方,被测电机即使向正向使能了1牛的力,由于标准电机力量远大于被测电机,所以整个运动速度还是按照的标准电机的设定速度来跑,原程序作者这样设定的用意是什么?


页: [1]
查看完整版本: 老化测试项目