软件:keil 5(其他版本也ok)
硬件:步进电机(我用的是42)×4;单片机开发板(本例使用STM32F407ZGT6);电机驱动器×4;外部按键;杜邦线。
实验效果:
四个步进电机对应四个外部按键,按下对应的外部按键选择需要控制的电机。
在开发板上按下KEYO,步进电机以500HZ的频率顺时针转动200个脉冲的角度(相对定位);
按下KEY1,步进电机以500H的频率逆时针转动400个脉冲的角度(相对定位);
按下KEY UP,步进电机以500HZ的频率回到绝对原点(绝对定位);
同时DS1以1s的周期闪烁,提示代码正在运行。
直接上代码:
主函数:
int main(void)
{
Stm32_Clock_Init(336,8,2,7);//ÉèÖÃʱÖÓ,168Mhz
delay_init(168); //ÑÓʱ³õʼ»¯
uart_init(84,115200); //³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200
usmart_dev.init(84); //³õʼ»¯USMART
LED_Init(); //³õʼ»¯LED
KEY_Init(); //°´¼ü³õʼ»¯
Driver_Init(); //Çý¶¯Æ÷³õʼ»¯
TIM8_OPM_RCR_Init(999,168-1); //1MHz¼ÆÊýƵÂÊ µ¥Âö³å+Öظ´¼ÆÊýģʽ
while(1)
{
u8 i;
u8 keyval;
keyval=KEY_Scan(0);
if(keyval==KEY3_PRES)
{
DRIVER_OE1=0;
DRIVER_OE2=1;
DRIVER_OE3=1;
DRIVER_OE4=1;
}
//
if(keyval==KEY4_PRES)
{
DRIVER_OE1=1;
DRIVER_OE2=0;
DRIVER_OE3=1;
DRIVER_OE4=1;
}
if(keyval==KEY5_PRES)
{
DRIVER_OE1=1;
DRIVER_OE2=1;
DRIVER_OE3=0;
DRIVER_OE4=1;
}
if(keyval==KEY6_PRES)
{
DRIVER_OE1=1;
DRIVER_OE2=1;
DRIVER_OE3=1;
DRIVER_OE4=0;
}
if(keyval==WKUP_PRES)
{
Locate_Abs(0,500);//°´ÏÂWKUP£¬»ØÁãµã
}else if(keyval==KEY0_PRES)
{
Locate_Rle(200,500,CW);//°´ÏÂKEY0£¬ÒÔ500HzµÄƵÂÊ Ë³Ê±Õë·¢200Âö³å
}else if(keyval==KEY1_PRES)
{
Locate_Rle(400,500,CCW);//°´ÏÂKEY1£¬ÒÔ500HzµÄƵÂÊ ÄæʱÕë·¢400Âö³å
}
delay_ms(10);
i++;
if(i==50)
{
i=0;
LED1=!LED1;
}
}
}
按键define:
#define KEY6 PFin(5) //PF5 ZJ
#define KEY5 PFin(4) //PF4 ZJ
#define KEY4 PFin(3) //PF3 ZJ
#define KEY3 PFin(2) //PF2 ZJ
#define KEY0 PEin(4) //PE4
#define KEY1 PEin(3) //PE3
#define KEY2 PEin(2) //P32
#define WK_UP PAin(0) //PA0
///
#define KEY3_PRES 5 //KEY0°´ÏÂ ZJ
#define KEY4_PRES 6 //KEY1°´ÏÂ ZJ
#define KEY5_PRES 7 //KEY2°´ÏÂ ZJ
#define KEY6_PRES 8 //KEY_UP°´ÏÂ(¼´WK_UP) ZJ
//#define KEY7_PRES 5 //KEY0°´ÏÂ ZJ
//#define KEY8_PRES 6 //KEY1°´ÏÂ ZJ
#define KEY0_PRES 1 //KEY0°´ÏÂ
#define KEY1_PRES 2 //KEY1°´ÏÂ
#define KEY2_PRES 3 //KEY2°´ÏÂ
#define WKUP_PRES 4 //KEY_UP°´ÏÂ(¼´WK_UP)
void KEY_Init(void); //IO³õʼ»¯
u8 KEY_Scan(u8); //°´¼üɨÃ躯Êý
IO口define:
#define DRIVER_DIR PFout(15) // Ðýת·½Ïò
//#define DRIVER_OE1_H GPIO_SetBits(GPIOE,PIN6);
//#define DRIVER_OE1_L GPIO_ResetBits(GPIOE,PIN6);
//#define DRIVER_OE2_H GPIO_SetBits(GPIOE,PIN1);
//#define DRIVER_OE2_L GPIO_ResetBits(GPIOE,PIN2);
#define DRIVER_OE1 PFout(6) //zj
#define DRIVER_OE2 PFout(1) //zj
#define DRIVER_OE3 PFout(14) //zj
#define DRIVER_OE4 PFout(13) //zj
//#define DRIVER_OE PEout(6) // ʹÄܽŠµÍµçƽÓÐЧ
#define RCR_VAL 255 //ÿ¼ÆÊý£¨RCR_VAL+1£©´Î£¬ÖжÏÒ»´Î£¬Õâ¸öÖµ£¨0~255£©ÉèÖôóһЩ¿ÉÒÔ½µµÍÖжÏƵÂÊ
typedef enum
{
CW = 1,//¸ßµçƽ˳ʱÕë
CCW = 0,//µÍµçƽÄæʱÕë
}DIR_Type;//ÔËÐз½Ïò
extern long target_pos;//ÓзûºÅ·½Ïò
extern long current_pos;//ÓзûºÅ·½Ïò
void Driver_Init(void);//Çý¶¯Æ÷³õʼ»¯
void TIM8_OPM_RCR_Init(u16 arr,u16 psc);//TIM8_CH2 µ¥Âö³åÊä³ö+Öظ´¼ÆÊý¹¦Äܳõʼ»¯
void TIM8_Startup(u32 frequency); //Æô¶¯¶¨Ê±Æ÷8
void Locate_Rle(long num,u32 frequency,DIR_Type dir); //Ïà¶Ô¶¨Î»º¯Êý
void Locate_Abs(long num,u32 frequency);//¾ø¶Ô¶¨Î»º¯Êý
#endif
电机对应外部按键key3,key4,key5,key6。
需要几个电机大家可以对应着代码改动,我这边实现了两个的和四个的。
代码包我会上传供大家使用,感谢!文章来源:https://www.toymoban.com/news/detail-861649.html
链接:https://pan.baidu.com/s/1y08H-W0AWwxMo8IgdEuRKg?pwd=cgr7
提取码:cgr7文章来源地址https://www.toymoban.com/news/detail-861649.html
到了这里,关于STM32控制四个步进电机(包含运行程序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!