重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 361|回复: 2

老化测试项目

[复制链接]

249

主题

618

帖子

3868

积分

学生管理组

Rank: 8Rank: 8

积分
3868
发表于 2020-7-27 19:30:23 | 显示全部楼层 |阅读模式
[SQL] syntaxhighlighter_viewsource syntaxhighlighter_copycode
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

回复

使用道具 举报

249

主题

618

帖子

3868

积分

学生管理组

Rank: 8Rank: 8

积分
3868
 楼主| 发表于 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采集会报溢出错误。
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#define		ADC_ARR_SIZE		(20)
//结构体
typedef struct {
	uint16_t 		cur;
	uint16_t		ADC_Sample_Buffer[ADC_ARR_SIZE];
	uint32_t		sumVal;
} ADC_Arr_Struct;


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


分析: 在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++)
回复 支持 反对

使用道具 举报

249

主题

618

帖子

3868

积分

学生管理组

Rank: 8Rank: 8

积分
3868
 楼主| 发表于 2020-8-12 17:41:00 | 显示全部楼层
本帖最后由 李维强-15级 于 2020-8-12 17:57 编辑

外特性工况测试的疑问:
先看该工况的测试代码
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
	for(uint8_t i = 0; i < 10; i++)
	{
		WTX_Spd[i] = (i + 1) * 100;
		WTX_Tq[i] = 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[0]); i++)
	{
		SetTorqueData(TestMotor,WTX_Tq[i]);
		SetSpeedData(StdMotor,-WTX_Spd[i]);
		HAL_Delay(EXTNCHARAC_TIME_MS - 1000);
		
		ErrCode = MotorErrCheck_Li(TestMotor);
		if(ErrCode == 0)
		{
			Tq.setTorque = WTX_Tq[i];
			Tq.measureTorque = GetTorqueMeasure(StdMotor);
			Idc = GetIdc(TestMotor);
			pExtnCharac->timeStmp[i] = sysCnt;
			pExtnCharac->current_mA[i] = Idc;
			pExtnCharac->speedStdMotor[i] = GetSpeedMeasure(StdMotor);
			pExtnCharac->tempMeasure[i] = GetMotorT(TestMotor);
			pExtnCharac->torqueMeasure[i]= 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牛的力,由于标准电机力量远大于被测电机,所以整个运动速度还是按照的标准电机的设定速度来跑,原程序作者这样设定的用意是什么?


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2020-10-23 07:10 , Processed in 0.098898 second(s), 30 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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