目录
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与调试软件相连,
- 启动软件,首先把驱动器设置成CANOPEN控制模式,按基本向导,按下列图进行配置,(如果我们配套电机和驱动器的直接下一步,到”操作模式选项”更改就可以了)
选择”更改设置”
选择”下一步”
“下一步”
“下一步”
然后按完成,最后按把设置下载到flash.这样就完成CANOPEN的配置了.
- 选择”CAN”,选择波特率,然后选择can地址的给定方式,上图can地址是1。最后按,“save & reset”。注意:上位机的波特率要跟这里的设定的一样。
- 这样一个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