电机调试记录

目录

0.L298N直流电机

1.富兴伺服电机:

 2.德马克伺服电机


0.L298N直流电机

用的直流电机为6V,又接了一个降压模块12v-6v,这个驱动器,你输入多少电压,它输出就多少,类似于一个滑动变阻器,如果控制板不需要驱动器供电,需将控制板的地与驱动器的地相接。

STM32程序:

控制两个电机,需要2个PWM,4个高低电位

STM32程序:

两个PWM信号

void TIM3_PWM_Ini(void)
{  
	GPIO_InitTypeDef GPIO_InitStructure;      
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1|GPIO_Pin_0;      // 只用到了定时器的第2、1路输出  改4
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		         // 复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /****************信号周期0.5ms=(3599+1)/72Mhz*****************/    	
    TIM_TimeBaseStructure.TIM_Period = 3599;                   //当定时器从0计数到3599,即为3600次,为一个定时周期
    TIM_TimeBaseStructure.TIM_Prescaler = 0;	                 //设置预分频7,即为9MHz:不预0分频,即为72MHz;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;	 //设置时钟分频系数:不分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	         //配置为PWM模式1
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 1800;	                     //设置通道1的电平跳变值,输出另外一个占空比的PWM  最低500
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);	                 //使能通道1 PA0
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	         //配置为PWM模式1
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 1800;	                     //设置通道2的电平跳变值,输出另外一个占空比的PWM  最低500
    TIM_OC2Init(TIM2, &TIM_OCInitStructure);	 
    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);

    TIM_ARRPreloadConfig(TIM2, ENABLE);			                   // 使能TIM2重载寄存器ARR
    TIM_Cmd(TIM2, ENABLE);

}

 高低信号PB5/PB6/PE5/PE6

头文件

#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5	
#define LED2 PBout(6)// PB6
#define LED3 PEout(6)// PE6	
void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB,PE端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5 输出高
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;				 //LED2-->PB.6 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_6);						 //PB.6 输出高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5 端口配置, 推挽输出
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5 输出高 
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;	    		 //LED3-->PE.6 端口配置, 推挽输出
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
 GPIO_SetBits(GPIOE,GPIO_Pin_6); 						 //PE.6 输出高 
}

 主函数:

while(1) 
	{		
    key=PS2_DataKey();		
		POINT_COLOR=RED;	  
		LCD_ShowString(10,10,210,12,12,"HTCK"); 
		LCD_ShowString(80,10,200,12,12,"YK_PWM"); 					 
		LCD_ShowString(150,10,200,12,12,"2019/12/02");	
		LCD_ShowString(10,20,200,12,12,"key_number:");	
		LCD_ShowNum(80,20,key,4,12);
		LCD_ShowString(10,30,200,12,12,"Relay_status:");
    if(key==5)		
		{
			LED0=0;
			LED1=0;
			LED2=1;
			LED3=1;
		  TIM2->CCR2 =2400;
			TIM2->CCR1 =2400;		
		}
		if(key==6)		
		{
		 	LED0=0;
			LED1=0;
			LED2=1;
			LED3=1;
		  TIM2->CCR2 =2400;
			TIM2->CCR1 =1800;			
		}

1.富兴伺服电机:

定制CAN电机,支持CAN2.0协议,发货时已设置好程序,直接用CAN卡调试即可:

STM32电机

CAN扩展帧模式:

u8 Can_Send_Msg(u8* msg,u8 len, u32 Id)
{	
	u8 mbox;
	u16 i=0;
	CanTxMsg TxMessage;
	TxMessage.StdId=0xFF;			// 标准标识符 
	TxMessage.ExtId= Id;			// 设置扩展标示符 
	TxMessage.IDE=CAN_Id_Extended; 	// 扩展帧
	TxMessage.RTR=CAN_RTR_Data;		// 数据帧
	TxMessage.DLC=len;				// 要发送的数据长度
	for(i=0;i<len;i++)
	TxMessage.Data[i]=msg[i];			          
	mbox= CAN_Transmit(CAN1, &TxMessage);   
	i=0; 
	while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;	//等待发送结束
	if(i>=0XFFF)return 1;
	return 0;	 
}

初始化:

void MOTOR_init(void)//小车控制上位机控制
{

	unsigned char canbuf[8];
	canbuf[0] = 0x1;
	Can_Send_Msg(canbuf, 1, 0x00FF0130);
	delay_ms(10);

	canbuf[0] = 0x01;
	Can_Send_Msg(canbuf,1, 0x00FF0300);//768电机使能 0失能 1使能
	delay_ms(10);
}

 

 2.德马克伺服电机

 

RS232口与RS232转USB连接

打开DCH调试软件

点击工具,也可以用命令进行电机使能和速度调节。

s r0x2f 1666666     设定速度

s r0x24 11           ///启动

用串口助手要加回车

 can通讯需要间断一根网线,前两个颜色,与CANH和CANL相连

用232与调试软件相连,

  1. 启动软件,首先把驱动器设置成CANOPEN控制模式,按基本向导,按下列图进行配置,(如果我们配套电机和驱动器的直接下一步,到”操作模式选项”更改就可以了)

选择”更改设置”

选择”下一步”

“下一步”

“下一步”

然后按完成,最后按把设置下载到flash.这样就完成CANOPEN的配置了.

 

 

  1. 选择”CAN”,选择波特率,然后选择can地址的给定方式,上图can地址是1。最后按,“save & reset”。注意:上位机的波特率要跟这里的设定的一样。
  2. 这样一个CAN控制的驱动器设定就完成了。

案例1:

1.驱动器的地址是1,波特率是500k。上位机是USBCAN的调试软件。

2.启动CAN软件把软的波特率设成500K,启动软件。

回零设置为当前位置为零点.

重点:ID设定为0,发送数据01 xx   ,xx为CAN硬件(或软件)地址拨号.这样驱动器就是由CAN网络来控制了.


一. 把驱动器设置成速度模式发下列指令
2F 60 60 00 03 00 00 00            设成速度模式
 
二. 使能驱动器
2B 40 60 00 0F 00 00 00
三. 写驱动器速度    (60ff速度地址)
23 FF 60 00 60 54 19 00

调试的CAN卡,接收数据不显示,后来客服大哥远程帮助。

STM32编程:

修改can的发送指令:

u8 Can_Send_Msg(u8* msg,u8 len, u32 Id)
{	
	u8 mbox;
	u16 i=0;
	CanTxMsg TxMessage;
	TxMessage.StdId=Id;			// 标准标识符 
	//TxMessage.ExtId= Id;			// 设置扩展标示符 
	TxMessage.IDE=CAN_Id_Standard; 	// 标准帧
	TxMessage.RTR=CAN_RTR_Data;		// 数据帧
	TxMessage.DLC=len;				// 要发送的数据长度
	for(i=0;i<len;i++)
	TxMessage.Data[i]=msg[i];			          
	mbox= CAN_Transmit(CAN1, &TxMessage);   
	i=0; 
	while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;	//等待发送结束
	if(i>=0XFFF)return 1;
	return 0;	 
}

编写电机初始化函数:

void MOTOR_init(void)//小车控制上位机控制
{
//CAN模式 ID:0000为广播模式,可控制全部电机
	unsigned char canbuf[8];
	canbuf[0] = 0x1;
	canbuf[1] = 0x1;
	Can_Send_Msg(canbuf, 2, 0x0000);
	delay_ms(10);

	//速度模式:ID:601  数据:2F 60 60 00 03 00 00 00  
	canbuf[0] = 0x2F;
	canbuf[1] = 0x60;
	canbuf[2] = 0x60;
	canbuf[3] = 0x00;
	canbuf[4] = 0x03;
	canbuf[5] = 0x00;
	canbuf[6] = 0x00;
	canbuf[7] = 0x00;
	Can_Send_Msg(canbuf,8, 0x0601);
	delay_ms(10);
	
//电机使能 ID:601  数据:2B 40 60 00 0F 00 00 00
	canbuf[0] = 0x2B;
	canbuf[1] = 0x40;
	canbuf[2] = 0x60;
	canbuf[3] = 0x00;
	canbuf[4] = 0x0F;
	canbuf[5] = 0x00;
	canbuf[6] = 0x00;
	canbuf[7] = 0x00;
	Can_Send_Msg(canbuf,8, 0x0601);//768电机使能 0失能 1使能
	delay_ms(10);
}

速度函数:

void MOTOR_speed(long L_speed,long R_speed)
{
//    long l_speed,r_speed;
//    l_speed=floor(L_speed*24*64/2/3.14/0.1);//减速比64/线数24/24*64圈/s 1圈=24*64=1536线 v=2pi*r*n/24*64
//    r_speed=floor(R_speed*24*64/2/3.14/0.1);    
//  23 FF 60 00 60 54 19 00
    unsigned char instruction[1][8]=
    {
    {0x23,0xFF,0x60,0x00,0x00,0x00,0x00,0x00},
    }    
    ;    
     long *p;
     p = (long*)(instruction[0]+4);
  *p = L_speed;
    Can_Send_Msg(instruction[0],8, 0x0601);
    delay_us(15);
}

 

补充:

直流有刷电机500w,48V

替换为伺服电机600w,48V

静止时状态量:

运动会出现过流保护:

调整电流环增益,点击auto tune,stop,选择额定电流,自动调节cp ci。

手动调节,空载任何值效果都不错,负载下四个电机无法同时调节,

 https://wenku.baidu.com/view/f8505616a216147917112877.html

 

 

 

 

 

 

 

### 回答1: 电机FOC(Field-Oriented Control)调试步骤如下: 1. 首先,确认电机的连接,包括电源和控制器的正确连接。此外,确保电机的机械系统(如机械转子、滑动轴承等)正常,并且没有外部故障。 2. 在调试FOC控制算法之前,需要进行电机参数识别。这包括识别电机的电感、电阻、转子转动惯量等参数。可以通过电机转矩测试台或者其他专用设备进行参数识别,也可以利用现有的参数手册进行参考。 3. 调试FOC控制算法时,首先需要设定好控制器的参数。这些参数包括PI控制器的比例增益、积分时间、速度环和电流环的带宽等。合适的参数设定能够保证系统的稳定性和性能。 4. 进行FOC控制算法的调试。在调试过程中,可以通过调整控制器的参数,逐步优化系统的性能。可以通过监测电机转速、电流和角度等变量,来评估系统的响应和跟踪性能。 5. 在调试过程中,需要遵循逐步递进的原则。首先进行开环控制的调试,通过设定期望值和观察实际值,来验证系统的基本功能。随后,可以逐步引入闭环控制,调试PID控制器的参数,提高系统的稳定性和跟踪性能。 6. 在调试过程中,可以利用相关的工具和软件,如示波器、matlab等,来监测和分析系统的性能。可以通过实时的图形和数据,来判断系统的控制效果,以及优化控制器的参数。 ### 回答2: 电机FOC(Field Oriented Control,场向控制)是一种用于控制交流电机转速和电流的技术。FOC通过将电机的转子和磁场的方向进行分离,能够实现高效的电机控制。 电机FOC调试步骤主要包括以下几个方面: 1. 硬件配置:首先,需要确保电机驱动器的硬件配置正确。包括连接电机、传感器(如编码器、霍尔效应传感器等)和控制器等,确保信号线连接正确,并检查电源电压和电流的稳定性。 2. 传感器校准:如果使用了编码器或其他传感器进行反馈,需要进行传感器校准。这包括码盘校准、霍尔传感器校准等,确保传感器的输出准确反映了电机转子的位置和速度。 3. 控制参数设置:根据具体的电机类型和应用需求,设置合适的控制参数。包括设置电机的额定电流、最大速度、最大加速度等,以及PID控制器的参数,如比例、积分和微分增益等。 4. FOC算法调试:在FOC控制器中,需要调试磁场定向和电流环。通过调整磁场定向的角度和反馈电流的控制,实现电机的平稳运行和高效控制。可以通过调整电流环的控制参数,来优化电机的动态响应和静态误差。 5. 性能测试:最后,对电机进行性能测试。包括测试电机的速度响应、力矩响应、效率以及负载能力等。根据测试结果,可以进一步优化控制参数,以达到更好的性能。 总结起来,电机FOC调试步骤包括硬件配置、传感器校准、控制参数设置、FOC算法调试和性能测试等。通过逐步调整参数和算法,可以实现对电机的准确控制和优化性能。 ### 回答3: 针对电机FOC调试的步骤,可以简要概括为以下几个方面: 1. 硬件连接:首先需要确保电机与控制器之间的连接正确无误。检查电机的三相线、霍尔传感器连接是否正确,并通过舵机控制器的电源连接正确供电。 2. 参数设置:根据具体的电机参数,设置转子位置传感器的偏置、霍尔传感器的信号增益等参数。可以通过控制器软件进行相应的参数设置。 3. 初始方向校准:在调试过程中,需要进行电机的初始方向校准。通过按下特定的按钮或者发送特定的控制命令,让电机旋转一定角度,并校准其初始位置。 4. 磁场定位:电机FOC调试的重要环节是磁场定位。通过施加恒定电流并逐渐增加电机转速,观察电机的转子位置响应,以确定电机的磁场位置。 5. PID参数调节:根据电机的实际情况和要求,对PID控制器进行参数调节。通过分析电机实际转速和期望转速之间的偏差,调整PID参数,使电机的转速响应更加稳定和准确。 6. 性能测试:完成上述步骤后,可以进行电机的性能测试。通过调整控制器的输入信号,观察电机的转速、扭矩等性能指标,并记录和分析测试结果,以评估控制系统的性能和稳定性。 需要注意的是,以上只是电机FOC调试的一般步骤,实际调试中可能还需要根据具体的电机型号、控制器软件等因素进行一些特殊的调整和设置。同时,调试过程中要确保安全,避免电机过载、短路等情况,以保证调试的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值