完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
A4988控制逻辑主要分为哪几种模式?
A4988驱动板可以驱动57电机吗?可以驱动多大的电流? A4988板子的细分如何配置? A4988可以驱动两相六线或两相无线的电机吗? |
|
相关推荐
2个回答
|
|
A4988控制逻辑简单,主要分为睡眠、正反转、复位、使能、细分等模式控制。
(1)睡眠模式:Sleep管脚电平置0,进入睡眠模式,驱动器输出待机模式;Sleep管脚置1,驱动器处于正常工作状态; (2)正反转模式:正转模式DIR管脚置0或1,反转模式置1或0; (3)复位模式:复位模式下容易消耗能量,产生的冲击电流较大。直接RESET管脚置1,在不影响系统工作时RESET管脚置0复位。一旦驱动芯片复位,系统将回归到原始A4988 I/O端口控制状态; (4)使能模式:使能模式控制系统是否开始工作,ENBALBE管脚置0开始工作,置1停止工作; (5)细分模式:通过MS1、MS2、MS3控制细分系数,A4988细分为1/16细分为最小,通过计算角度值可得最小细分角度为全步进角度的1/16。A4988驱动逻辑控制如表1所示。 测试方法: 拿到一个步进电机时,首先检测步进电机两条线之间的电阻,两条线之间电阻小的(在蠕动泵上测试为33Ω左右),接4988的1A、1B端(或2A、2B端),其中调换1A、1B端(或2A、2B端)的顺序可以改变电机的旋转方向。 接线示意图 使用中,把使能脚和细分脚全部接地,即不设置细分(步进值为1),复位脚和睡眠脚用跳线帽短接。 A4988功能实验测试: DIR=1,STEP为3.3V占空比50%,频率为500Hz的方波,电机电压Vmot=12V。 测得1A(或1B、2A、2B)波形 蠕动泵: 蠕动泵本质上也是步进电机。 电机参数:42步进24V0.4A,1.8° 蠕动泵步进电机 黑绿电阻33Ω,红蓝电阻33Ω 常见问题总结: 1、4988驱动板可以驱动57电机吗? 4988可以驱动的电机跟尺寸关系不大,主要与工作电流有关,理论上电流小于2A的步进电机都是可以驱动的,不论是42还是57电机。 2、可以驱动多大的电流? 如果4988芯片上没有加散热片,电流最好在1.2A以下。如果加散热片,电流可以达到2A。 3、步进电机的连接方式是什么? 正如4988板子背面所标识的,连接方式是依次连接步进电机的1B-1A-2A-2B,或者反向为2B-2A-1A-1B,或者1A-1B-2B-2A,其它的方式一次类推。如果你的电机线是标准的红蓝绿黑的颜色,可以按照颜色连接为:红-蓝-绿-黑,或相反:黑-绿-蓝-红。 4、如何调节相电流? 向大电容方向转增大电流,向芯片方向转减小电流 相电流的大小跟步进电机的扭力有直接关系,如果感觉你的步进电机扭力不足,可以加大4988板子的电流配置。驱动板是通过一个小的电位器来实现对输出电流的配置的。可以通过用万用表测量电位器中间管脚的电位。电位和电流的关系满足下面的公式:Vref = A*0.8.也就是如果你想配置电机工作电流为1A,则电位应该配置在0.8V。默认的元件配置可以将电流调节到1.5A,如果需要更大电流需要修改电路中的R1,将30K的阻值改为20K(左右),就可以将电流调节到2A左右。 5、4988板子的细分如何配置? 4988板子细分配置需要ramps或其它相似板子的短路块来配置。ramps上对应每个4988驱动都有ms1,ms2,ms3三个短路块来调节细分(需要取下4988板子才可以看到), ms1 | ms2 | ms3 no | no | no |全细分 yes | no | no |1/2(2细分) no | yes | no | 1/4 (4细分) yes | yes | no |1/8(8细分) yes | yes | yes | 1/16(16细分) 6、接上电机后,电机不能正常运行,在左右抖动,是什么原因? 电机出现抖动一般有两个原因, 一是缺相:可能是4988板子没有焊接好或因为外力导致4988的输出端某一相断开,造成电机缺相从而抖动。也有可能是步进电机接线只用一相没有连接好; 而是两相接错:如果步进电机没有按照正确的顺序进行连接,电机也会出现抖动的情况,请按照问题3进行正确的连接。 7、4988可以驱动两相六线或两相无线的电机吗? 可以,两相连线按照问题3连接,将中间抽头悬空即可。 8、电机停止转动时会有滋滋的电流声。 首先说明的是这是正常现象。步进电机的特点是走特定的角度而不是一直转,所以步进电机都有一个参数,步距角。如果通过细分,可以最小走 步距角/细分数的角度,比如步距角为1.8度的步进电机,采用16细分,最小可以走的角度是1.8/16=0.1125度。但由于这个角度非常小,并且不一定在电机物理所在的位置(1.8度为一个物理位置),所以步进电机停止时也需要通电,从而保证电机不会自动跳到物理步距角上。因为这个特性使得步进电机在静止时会有电流声,这属于正常现象,不用担心。 #include “a4988.h” #include “delay.h” /* STEP1 PDout(15) SDIR1 PGout(2) STEP2 PDout(14) SDIR2 PGout(3) STEP3 PDout(13) SDIR3 PGout(4) STEP4 PDout(12) SDIR4 PGout(5) MSTEP PDout(15) //固定芯片步进STEP MDIR PGout(2) //固定芯片步进DIR CSTEP PDout(14) //磁铁步进STEP CDIR PGout(3) //磁铁步进DIR RSTEP PDout(13) //蠕动泵STEP RDIR PGout(4) //蠕动泵DIR USTEP PDout(12) //超声步进电机STEP UDIR PGout(5) //超声步进电机DIR */ //方向脚初始化 void Step_DIR_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PG端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; //端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOG, &GPIO_InitStructure); //根据设定参数初始化 GPIO_SetBits(GPIOG,GPIO_Pin_2); GPIO_SetBits(GPIOG,GPIO_Pin_3); GPIO_SetBits(GPIOG,GPIO_Pin_4); GPIO_SetBits(GPIOG,GPIO_Pin_5); } //脉冲初始化,公用定时器4,重映射,4路频率会被一起改变 void Step_Pulse_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer4重映射 //设置该引脚为复用输出功能,输出TIM4的PWM脉冲波形 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //TIM_CH4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO //!!!!!配置完复用功能后,此时输出为低电平,似乎难以修改 //初始化TIM4 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM4 Channel_1234 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1 //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //关闭比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC1 //TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR1上的预装载寄存器 TIM_OC2Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2 //TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器 TIM_OC3Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC3 //TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR3上的预装载寄存器 TIM_OC4Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC4 //TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR4上的预装载寄存器 TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1 TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2 TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3 TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4 TIM_Cmd(TIM4, DISABLE); //先不使能TIM4 } //芯片电机运动 void Mstep_move(u8 dir,u16 frequency) { MDIR = dir; Step_Pulse_Init((u16)(100000/frequency-1),719); TIM_SetCompare4(TIM4,(u16)(50000/frequency)); TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Enable);//开启TIM4通道4 TIM_Cmd(TIM4, ENABLE);//必须放在最后使能 } //芯片电机停止 void Mstep_stop(void) { TIM_SetCompare4(TIM4,0); TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1 TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2 TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3 TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4 TIM_Cmd(TIM4, DISABLE); } //磁铁电机运动 void Cstep_move(u8 dir,u16 frequency) { CDIR = dir; Step_Pulse_Init((u16)(100000/frequency-1),719); TIM_SetCompare3(TIM4,(u16)(50000/frequency)); TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Enable);//开启TIM4通道3 TIM_Cmd(TIM4, ENABLE);//必须放在最后使能 } //磁铁电机停止 void Cstep_stop(void) { TIM_SetCompare3(TIM4,0); TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1 TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2 TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3 TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4 TIM_Cmd(TIM4, DISABLE); } //超声电机运动 void Ustep_move(u8 dir,u16 frequency) { UDIR = dir; Step_Pulse_Init((u16)(100000/frequency-1),719); TIM_SetCompare1(TIM4,(u16)(50000/frequency)); TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Enable);//开启TIM4通道1 TIM_Cmd(TIM4, ENABLE);//必须放在最后使能 } //超声电机停止 void Ustep_stop(void) { TIM_SetCompare1(TIM4,0); TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1 TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2 TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3 TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4 TIM_Cmd(TIM4, DISABLE);//USTEP会随波形停在高或低 } //蠕动泵抽取 void Rstep_move(u8 dir,u16 frequency) { RDIR = dir; Step_Pulse_Init((u16)(100000/frequency-1),719); TIM_SetCompare2(TIM4,(u16)(50000/frequency)); TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Enable);//开启TIM4通道2 TIM_Cmd(TIM4, ENABLE);//必须放在最后使能 } //蠕动泵停止 void Rstep_stop(void) { TIM_SetCompare2(TIM4,0); TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1 TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2 TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3 TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4 TIM_Cmd(TIM4, DISABLE);//RSTEP会随波形停在高或低 } a4988.h文件 #ifndef __A4988_H #define __A4988_H #include “sys.h” #define MSTEP PDout(15) //固定芯片步进STEP #define MDIR PGout(2) //固定芯片步进DIR #define CSTEP PDout(14) //磁铁步进STEP #define CDIR PGout(3) //磁铁步进DIR #define RSTEP PDout(13) //蠕动泵STEP #define RDIR PGout(4) //蠕动泵DIR #define USTEP PDout(12) //超声步进电机STEP #define UDIR PGout(5) //超声步进电机DIR void Step_DIR_Init(void); void Step_Pulse_Init(u16 arr,u16 psc); void Mstep_move(u8 dir,u16 frequency); void Mstep_stop(void); void Rstep_move(u8 dir,u16 frequency); void Rstep_stop(void); void Ustep_move(u8 dir,u16 frequency); void Ustep_stop(void); void Cstep_move(u8 dir,u16 frequency); void Cstep_stop(void); #endif |
|
|
|
A4988控制逻辑简单,主要分为睡眠、正反转、复位、使能、细分等模式控制。
(1)睡眠模式:Sleep管脚电平置0,进入睡眠模式,驱动器输出待机模式;Sleep管脚置1,驱动器处于正常工作状态; (2)正反转模式:正转模式DIR管脚置0或1,反转模式置1或0; (3)复位模式:复位模式下容易消耗能量,产生的冲击电流较大。直接RESET管脚置1,在不影响系统工作时RESET管脚置0复位。一旦驱动芯片复位,系统将回归到原始A4988 I/O端口控制状态; (4)使能模式:使能模式控制系统是否开始工作,ENBALBE管脚置0开始工作,置1停止工作; (5)细分模式:通过MS1、MS2、MS3控制细分系数,A4988细分为1/16细分为最小,通过计算角度值可得最小细分角度为全步进角度的1/16。A4988驱动逻辑控制如表1所示。 测试方法: 拿到一个步进电机时,首先检测步进电机两条线之间的电阻,两条线之间电阻小的(在蠕动泵上测试为33Ω左右),接4988的1A、1B端(或2A、2B端),其中调换1A、1B端(或2A、2B端)的顺序可以改变电机的旋转方向。 接线示意图 使用中,把使能脚和细分脚全部接地,即不设置细分(步进值为1),复位脚和睡眠脚用跳线帽短接。 A4988功能实验测试: DIR=1,STEP为3.3V占空比50%,频率为500Hz的方波,电机电压Vmot=12V。 测得1A(或1B、2A、2B)波形 蠕动泵: 蠕动泵本质上也是步进电机。 电机参数:42步进24V0.4A,1.8° 蠕动泵步进电机 黑绿电阻33Ω,红蓝电阻33Ω 常见问题总结: 1、4988驱动板可以驱动57电机吗? 4988可以驱动的电机跟尺寸关系不大,主要与工作电流有关,理论上电流小于2A的步进电机都是可以驱动的,不论是42还是57电机。 2、可以驱动多大的电流? 如果4988芯片上没有加散热片,电流最好在1.2A以下。如果加散热片,电流可以达到2A。 3、步进电机的连接方式是什么? 正如4988板子背面所标识的,连接方式是依次连接步进电机的1B-1A-2A-2B,或者反向为2B-2A-1A-1B,或者1A-1B-2B-2A,其它的方式一次类推。如果你的电机线是标准的红蓝绿黑的颜色,可以按照颜色连接为:红-蓝-绿-黑,或相反:黑-绿-蓝-红。 4、如何调节相电流? 向大电容方向转增大电流,向芯片方向转减小电流 相电流的大小跟步进电机的扭力有直接关系,如果感觉你的步进电机扭力不足,可以加大4988板子的电流配置。驱动板是通过一个小的电位器来实现对输出电流的配置的。可以通过用万用表测量电位器中间管脚的电位。电位和电流的关系满足下面的公式:Vref = A*0.8.也就是如果你想配置电机工作电流为1A,则电位应该配置在0.8V。默认的元件配置可以将电流调节到1.5A,如果需要更大电流需要修改电路中的R1,将30K的阻值改为20K(左右),就可以将电流调节到2A左右。 5、4988板子的细分如何配置? 4988板子细分配置需要ramps或其它相似板子的短路块来配置。ramps上对应每个4988驱动都有ms1,ms2,ms3三个短路块来调节细分(需要取下4988板子才可以看到), ms1 | ms2 | ms3 no | no | no |全细分 yes | no | no |1/2(2细分) no | yes | no | 1/4 (4细分) yes | yes | no |1/8(8细分) yes | yes | yes | 1/16(16细分) 6、接上电机后,电机不能正常运行,在左右抖动,是什么原因? 电机出现抖动一般有两个原因, 一是缺相:可能是4988板子没有焊接好或因为外力导致4988的输出端某一相断开,造成电机缺相从而抖动。也有可能是步进电机接线只用一相没有连接好; 而是两相接错:如果步进电机没有按照正确的顺序进行连接,电机也会出现抖动的情况,请按照问题3进行正确的连接。 7、4988可以驱动两相六线或两相无线的电机吗? 可以,两相连线按照问题3连接,将中间抽头悬空即可。 8、电机停止转动时会有滋滋的电流声。 首先说明的是这是正常现象。步进电机的特点是走特定的角度而不是一直转,所以步进电机都有一个参数,步距角。如果通过细分,可以最小走 步距角/细分数的角度,比如步距角为1.8度的步进电机,采用16细分,最小可以走的角度是1.8/16=0.1125度。但由于这个角度非常小,并且不一定在电机物理所在的位置(1.8度为一个物理位置),所以步进电机停止时也需要通电,从而保证电机不会自动跳到物理步距角上。因为这个特性使得步进电机在静止时会有电流声,这属于正常现象,不用担心。 #include “a4988.h” #include “delay.h” /* STEP1 PDout(15) SDIR1 PGout(2) STEP2 PDout(14) SDIR2 PGout(3) STEP3 PDout(13) SDIR3 PGout(4) STEP4 PDout(12) SDIR4 PGout(5) MSTEP PDout(15) //固定芯片步进STEP MDIR PGout(2) //固定芯片步进DIR CSTEP PDout(14) //磁铁步进STEP CDIR PGout(3) //磁铁步进DIR RSTEP PDout(13) //蠕动泵STEP RDIR PGout(4) //蠕动泵DIR USTEP PDout(12) //超声步进电机STEP UDIR PGout(5) //超声步进电机DIR */ //方向脚初始化 void Step_DIR_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PG端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; //端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOG, &GPIO_InitStructure); //根据设定参数初始化 GPIO_SetBits(GPIOG,GPIO_Pin_2); GPIO_SetBits(GPIOG,GPIO_Pin_3); GPIO_SetBits(GPIOG,GPIO_Pin_4); GPIO_SetBits(GPIOG,GPIO_Pin_5); } //脉冲初始化,公用定时器4,重映射,4路频率会被一起改变 void Step_Pulse_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer4重映射 //设置该引脚为复用输出功能,输出TIM4的PWM脉冲波形 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //TIM_CH4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO //!!!!!配置完复用功能后,此时输出为低电平,似乎难以修改 //初始化TIM4 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM4 Channel_1234 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1 //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //关闭比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC1 //TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR1上的预装载寄存器 TIM_OC2Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2 //TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器 TIM_OC3Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC3 //TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR3上的预装载寄存器 TIM_OC4Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC4 //TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR4上的预装载寄存器 TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1 TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2 TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3 TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4 TIM_Cmd(TIM4, DISABLE); //先不使能TIM4 } //芯片电机运动 void Mstep_move(u8 dir,u16 frequency) { MDIR = dir; Step_Pulse_Init((u16)(100000/frequency-1),719); TIM_SetCompare4(TIM4,(u16)(50000/frequency)); TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Enable);//开启TIM4通道4 TIM_Cmd(TIM4, ENABLE);//必须放在最后使能 } //芯片电机停止 void Mstep_stop(void) { TIM_SetCompare4(TIM4,0); TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1 TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2 TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3 TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4 TIM_Cmd(TIM4, DISABLE); } //磁铁电机运动 void Cstep_move(u8 dir,u16 frequency) { CDIR = dir; Step_Pulse_Init((u16)(100000/frequency-1),719); TIM_SetCompare3(TIM4,(u16)(50000/frequency)); TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Enable);//开启TIM4通道3 TIM_Cmd(TIM4, ENABLE);//必须放在最后使能 } //磁铁电机停止 void Cstep_stop(void) { TIM_SetCompare3(TIM4,0); TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1 TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2 TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3 TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4 TIM_Cmd(TIM4, DISABLE); } //超声电机运动 void Ustep_move(u8 dir,u16 frequency) { UDIR = dir; Step_Pulse_Init((u16)(100000/frequency-1),719); TIM_SetCompare1(TIM4,(u16)(50000/frequency)); TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Enable);//开启TIM4通道1 TIM_Cmd(TIM4, ENABLE);//必须放在最后使能 } //超声电机停止 void Ustep_stop(void) { TIM_SetCompare1(TIM4,0); TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1 TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2 TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3 TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4 TIM_Cmd(TIM4, DISABLE);//USTEP会随波形停在高或低 } //蠕动泵抽取 void Rstep_move(u8 dir,u16 frequency) { RDIR = dir; Step_Pulse_Init((u16)(100000/frequency-1),719); TIM_SetCompare2(TIM4,(u16)(50000/frequency)); TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Enable);//开启TIM4通道2 TIM_Cmd(TIM4, ENABLE);//必须放在最后使能 } //蠕动泵停止 void Rstep_stop(void) { TIM_SetCompare2(TIM4,0); TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1 TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2 TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3 TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4 TIM_Cmd(TIM4, DISABLE);//RSTEP会随波形停在高或低 } a4988.h文件 #ifndef __A4988_H #define __A4988_H #include “sys.h” #define MSTEP PDout(15) //固定芯片步进STEP #define MDIR PGout(2) //固定芯片步进DIR #define CSTEP PDout(14) //磁铁步进STEP #define CDIR PGout(3) //磁铁步进DIR #define RSTEP PDout(13) //蠕动泵STEP #define RDIR PGout(4) //蠕动泵DIR #define USTEP PDout(12) //超声步进电机STEP #define UDIR PGout(5) //超声步进电机DIR void Step_DIR_Init(void); void Step_Pulse_Init(u16 arr,u16 psc); void Mstep_move(u8 dir,u16 frequency); void Mstep_stop(void); void Rstep_move(u8 dir,u16 frequency); void Rstep_stop(void); void Ustep_move(u8 dir,u16 frequency); void Ustep_stop(void); void Cstep_move(u8 dir,u16 frequency); void Cstep_stop(void); #endif |
|
|
|
只有小组成员才能发言,加入小组>>
646浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 11:46 , Processed in 0.549791 second(s), Total 48, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号