OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2542|回复: 8

stm32串口如何控制ULN2003驱动28BYJ-48步进电机方向、旋转角度?

[复制链接]

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2019-4-8
在线时间
76 小时
发表于 2019-12-18 10:10:00 | 显示全部楼层 |阅读模式
求助:各位大神我想用串口控制它转 ,该怎么弄?
就是想把它分成360分,然后用正负数,输入进去,输入+10 就向右转10度
如果输入-30就向左转三十度?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

231

帖子

0

精华

高级会员

Rank: 4

积分
755
金钱
755
注册时间
2018-12-7
在线时间
131 小时
发表于 2019-12-18 10:17:23 | 显示全部楼层

回帖奖励 +1 金钱

帮顶  
回复 支持 反对

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2019-12-18 13:00:26 | 显示全部楼层
你这个应该是判断串口输入的字符串来控制电机的转动的,字符串可以用atoi函数来转换成十进制的整数
回复 支持 反对

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6660
金钱
6660
注册时间
2015-8-25
在线时间
1034 小时
发表于 2019-12-18 13:04:30 | 显示全部楼层
分开实现:先实现电机驱动,能实现正转反转,各个角度随你控制;然后实现串口通信,实现你要的串口发送与接收解析(你得自己定义个小协议);最后两者结合,把串口接收解析出来的正反转以及角度信息拿去驱动电机应该就OK了
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2019-4-8
在线时间
76 小时
 楼主| 发表于 2019-12-18 14:25:33 | 显示全部楼层

感谢  OLD铁
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2019-4-8
在线时间
76 小时
 楼主| 发表于 2019-12-18 14:31:19 | 显示全部楼层
hou18 发表于 2019-12-18 13:00
你这个应该是判断串口输入的字符串来控制电机的转动的,字符串可以用atoi函数来转换成十进制的整数

感谢 抽空回复 我是个菜鸟现在只能实现简单的串口控制正反转 能麻烦您帮忙改改嘛

电机

#include "motor.h"
#include "delay.h"
#include "usart.h"

uint16_t phasecw[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A   
uint16_t phaseccw[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D


void Delay_xms(u16 x)
{
u16 i,j;
for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}

void Moto_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 );

}

void Motorcw(u16 speed)
{  
    uint8_t i;  
  
    for(i=0;i<4;i++)  
    {  
        GPIO_Write(GPIOC,phasecw);  
                                delay_ms(speed);
    }  
}
void Motorccw(u16 speed)
{  
    uint8_t i;  
    for(i=0;i<4;i++)  
    {  
        GPIO_Write(GPIOC,phaseccw);  
                                delay_ms(speed);
    }  
}

void MotorStop(void)  
{  
    GPIO_Write(GPIOC,0x0000);  
}

主函数

#include "sys.h"
#include "delay.h"
#include "motor.h"
#include "usart.h"

u16 len;
u16 t;
u8 data=0;
int main(void)
{       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(9600);         //串口初始化为115200
        delay_init();            //延时函数初始化          
        Moto_Init();
        while(1)
        {
//                        Motorcw_angle(180,8);
//                        MotorStop();
//                        delay_ms(1000);
//                        Motorccw_angle(180,8);
//                        MotorStop();
//                        delay_ms(1000);
                if(USART_RX_STA&0x8000)
                {                                            
                        data=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                        data=USART_RX_BUF[0];
                        switch(data)
                        {                                       
                                case 'L':printf("\r\n反转\r\n");Motorcw(10);data=0;break;
                                case 'R':printf("\r\n正转\r\n");Motorccw(10);data=0;break;
                                case 'S':printf("\r\n暂停\r\n");MotorStop();data=0;break;
                                default : break;
                        }
//                        printf("\r\n\r\n");//插入换行
                        USART_RX_STA=0;
                }
        }
}
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2019-4-8
在线时间
76 小时
 楼主| 发表于 2019-12-18 14:31:54 | 显示全部楼层
szczyb1314 发表于 2019-12-18 13:04
分开实现:先实现电机驱动,能实现正转反转,各个角度随你控制;然后实现串口通信,实现你要的串口发送与接 ...

感谢 抽空回复 我是个菜鸟现在只能实现简单的串口控制正反转 能麻烦您帮忙改改嘛

电机

#include "motor.h"
#include "delay.h"
#include "usart.h"

uint16_t phasecw[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A   
uint16_t phaseccw[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D


void Delay_xms(u16 x)
{
u16 i,j;
for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}

void Moto_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 );

}

void Motorcw(u16 speed)
{  
    uint8_t i;  
  
    for(i=0;i<4;i++)  
    {  
        GPIO_Write(GPIOC,phasecw);  
                                delay_ms(speed);
    }  
}
void Motorccw(u16 speed)
{  
    uint8_t i;  
    for(i=0;i<4;i++)  
    {  
        GPIO_Write(GPIOC,phaseccw);  
                                delay_ms(speed);
    }  
}

void MotorStop(void)  
{  
    GPIO_Write(GPIOC,0x0000);  
}

主函数

#include "sys.h"
#include "delay.h"
#include "motor.h"
#include "usart.h"

u16 len;
u16 t;
u8 data=0;
int main(void)
{        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(9600);         //串口初始化为115200
        delay_init();            //延时函数初始化         
        Moto_Init();
        while(1)
        {
//                        Motorcw_angle(180,8);
//                        MotorStop();
//                        delay_ms(1000);
//                        Motorccw_angle(180,8);
//                        MotorStop();
//                        delay_ms(1000);
                if(USART_RX_STA&0x8000)
                {                                            
                        data=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                        data=USART_RX_BUF[0];
                        switch(data)
                        {                                       
                                case 'L':printf("\r\n反转\r\n");Motorcw(10);data=0;break;
                                case 'R':printf("\r\n正转\r\n");Motorccw(10);data=0;break;
                                case 'S':printf("\r\n暂停\r\n");MotorStop();data=0;break;
                                default : break;
                        }
//                        printf("\r\n\r\n");//插入换行
                        USART_RX_STA=0;
                }
        }
}
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2019-4-8
在线时间
76 小时
 楼主| 发表于 2019-12-18 14:32:49 | 显示全部楼层
szczyb1314 发表于 2019-12-18 13:04
分开实现:先实现电机驱动,能实现正转反转,各个角度随你控制;然后实现串口通信,实现你要的串口发送与接 ...

感谢 抽空回复 我是个菜鸟现在只能实现简单的串口控制正反转 能麻烦您帮忙改改嘛

电机

#include "motor.h"
#include "delay.h"
#include "usart.h"

uint16_t phasecw[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A   
uint16_t phaseccw[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D


void Delay_xms(u16 x)
{
u16 i,j;
for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}

void Moto_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 );

}

void Motorcw(u16 speed)
{  
    uint8_t i;  
  
    for(i=0;i<4;i++)  
    {  
        GPIO_Write(GPIOC,phasecw);  
                                delay_ms(speed);
    }  
}
void Motorccw(u16 speed)
{  
    uint8_t i;  
    for(i=0;i<4;i++)  
    {  
        GPIO_Write(GPIOC,phaseccw);  
                                delay_ms(speed);
    }  
}

void MotorStop(void)  
{  
    GPIO_Write(GPIOC,0x0000);  
}

主函数

#include "sys.h"
#include "delay.h"
#include "motor.h"
#include "usart.h"

u16 len;
u16 t;
u8 data=0;
int main(void)
{        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(9600);         //串口初始化为115200
        delay_init();            //延时函数初始化         
        Moto_Init();
        while(1)
        {
//                        Motorcw_angle(180,8);
//                        MotorStop();
//                        delay_ms(1000);
//                        Motorccw_angle(180,8);
//                        MotorStop();
//                        delay_ms(1000);
                if(USART_RX_STA&0x8000)
                {                                            
                        data=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                        data=USART_RX_BUF[0];
                        switch(data)
                        {                                       
                                case 'L':printf("\r\n反转\r\n");Motorcw(10);data=0;break;
                                case 'R':printf("\r\n正转\r\n");Motorccw(10);data=0;break;
                                case 'S':printf("\r\n暂停\r\n");MotorStop();data=0;break;
                                default : break;
                        }
//                        printf("\r\n\r\n");//插入换行
                        USART_RX_STA=0;
                }
        }
}
回复 支持 反对

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-12-18 19:15:09 | 显示全部楼层
帮顶                                          
成功没有捷径
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-21 12:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表