调试了一个惠斯通的步进电机,原来调试过一款欧柯达的42步进电机, 本以为两个电机差不多,驱动器给的一样,结果发现死活不能动。用自己百度了一下,做一个笔记
例如这个电机 42BYGH403AA
42 为机座尺寸, BYGH是指混合式步进电机(混合式步进电机是综合了永磁式和反应式的优点而设计的步进电机。它又分为两相、三相和五相,两相步进角一般为1.8度 ,三相步进角 一 般为 1.2度 ,而五相步进角 一 般为0.72度。
混合式步进电机的转子本身具有磁性,因此在同样的定子电流下产生的转矩要大于反应式步进电机,且其步距角通常也较小,因此,经济型数控机床一般需用混合式步进电机驱动。但混合转子的结构较复杂、转子惯量大,其快速性要低于反应式步进电机)
这个图像就能看出电机的具体的尺寸标准 绕组是星型步距角1.8度,H就是混合式,法兰是异性法兰
步进电机还有带行星减速的尺寸,在最后我们可以看到一个
比如这个
OK42STH47-168AG3.71
ok:是产品名,欧柯达42是尺寸其他的看不懂,3.71就是减速比
最后一句话直接买电机对应的驱动器,这个市场根本没有统一的标准,杂乱无章,还是直接买一套直接用好,这一会调好了,一般工频10k左右吧程序发给大家参考一下
#include "sydj.h"
#include "gpio.h"
#include "stmflash.h"
#include "usart.h"
u8 DJ_Buffer_temp[4];
u8 datatemp[4];
#define FLASH_SAVE_ADDR 0X08070000 //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
int32_t DJ_WEIZHI ;
u8 End_flage=0;
u8 Dj_turn=0;
u32 Dj_step=0;
u16 Dj_speed=0;
u16 Dj_set=0;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
void TIM1_Init(u16 arr ,u16 psc)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
TIM_Cmd(TIM1, ENABLE);
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_IRQn; //TIM7中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
//使能TIMx
}
void Sydj_move(u8 turn, u16 speed,u32 steep)
{
Dj_step=steep;
Dj_speed=speed;
Dj_set=speed+500;
Dj_turn=turn;
SYDJ_DR=turn;
TIM1_Init(71,speed);
while(End_flage==0);
}
void TIM1_UP_IRQHandler()
{
static u8 dj_flag=0;
u8 jiyi_flag=0;
if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
{
dj_flag=~dj_flag;
if(dj_flag!=0)
{
SYDJ_DR=Dj_turn;
SYDJ_PR=1;
}
else
{
SYDJ_DR=Dj_turn;
SYDJ_PR=0;
}
jiyi_flag++;
Dj_step--;
// if(jiyi_flag==50)
// {
// jiyi_flag=0;
// STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,4);
// if(Dj_turn)
// {
// DJ_WEIZHI=(int32_t)(datatemp[3]<<24|datatemp[2]<<16|datatemp[3]<<8|datatemp[0]);
// printf("%d\n",DJ_WEIZHI);
// DJ_WEIZHI+=1;
// }
// else
// {
// DJ_WEIZHI=(int32_t)(datatemp[3]<<24|datatemp[2]<<16|datatemp[3]<<8|datatemp[0]);
// DJ_WEIZHI-=1;
//
// }
// DJ_Buffer_temp[3]=DJ_WEIZHI>>24;
// DJ_Buffer_temp[2]=DJ_WEIZHI>>16;
// DJ_Buffer_temp[1]=DJ_WEIZHI>>8;
// DJ_Buffer_temp[0]=DJ_WEIZHI;
// STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)DJ_Buffer_temp,4);
//
// }
if(Dj_step>450)
{
if(Dj_speed>150)
{
Dj_speed=Dj_speed-1;
printf("%d\n",Dj_speed);
TIM1->PSC=Dj_speed;
}
else
TIM1->PSC=150;
}
else if(Dj_step<=450)
{ Dj_speed+=1;
printf("%d\n",Dj_speed);
TIM1->PSC=Dj_speed;
if(Dj_step==0)//
{
TIM_Cmd(TIM1,DISABLE );
End_flage=1;
}
}
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
}
}
|