OpenEdv-开源电子网

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

如何用stm32驱动小马达?大佬们给个思路啊

[复制链接]

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
发表于 2018-7-29 09:52:03 | 显示全部楼层 |阅读模式
1金钱
最近要做一个学校的循迹小车,学校的比赛,需要用stm32f103去做,但是怎么驱动电机啊?最近刚入手stm32,还在点灯实验中,这个怎么驱动马达?能不能给个思路或者学习路径指导?

最佳答案

查看完整内容[请看2#楼]

pwm是控制速率用的啊... 你灯也可以用pwm啊..控制灯的亮暗程度 还可以做呼吸灯 单单一个直流电机,你都可以直接用io口控制,就是转的比较慢而已(可能转不起来),电压太小,而且还不能改方向。所以这时候要用到电机驱动,用小电压控制大电压,还可以用h桥,两个都能使电机改变方向,h桥从原理图上看比较只管罢了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-7-29 09:52:04 | 显示全部楼层
MNK 发表于 2018-7-30 17:08
一样的吗?直接gpio输出就可以?
不是要用pwm的吗?

pwm是控制速率用的啊...   你灯也可以用pwm啊..控制灯的亮暗程度  还可以做呼吸灯    单单一个直流电机,你都可以直接用io口控制,就是转的比较慢而已(可能转不起来),电压太小,而且还不能改方向。所以这时候要用到电机驱动,用小电压控制大电压,还可以用h桥,两个都能使电机改变方向,h桥从原理图上看比较只管罢了
猪猪熊呢?
回复

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
发表于 2018-7-29 20:42:06 来自手机 | 显示全部楼层
本帖最后由 学习stm32f4 于 2018-7-29 20:46 编辑

还没人回复吗?用电机控制芯片吧,快速上手,也不贵,集成了电机运动算法,百度一下trinamic,官网开发板全开源,华强芯城是小批量代理商
回复

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
发表于 2018-7-29 23:05:44 | 显示全部楼层
如果指示学校的循迹小车,用电机驱动芯片搭一个,然后用32单片机控制
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-7-30 08:17:06 | 显示全部楼层
你会点灯为啥不会直流电机?实在不行去网上买个电机驱动模块用
猪猪熊呢?
回复

使用道具 举报

19

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-21
在线时间
171 小时
发表于 2018-7-30 08:33:49 | 显示全部楼层
一种自己做H桥,一种买驱动芯片,比如LMD18200这款就不错
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2018-7-30 08:41:16 | 显示全部楼层
步进电机 还是直流电机? 直流电机 就H桥.(自行百度). 步进电机 看型号.如果是 diy用的 byj48 之类的电机需要芯片(建议网上买模块)然后用tim定时器每几ms(根据速度设置)中断一次,然后修改几相IO的电平来驱动.
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-7-30 15:15:35 | 显示全部楼层
买了一个l298模块。
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-7-30 15:16:04 | 显示全部楼层
森海有眼泉 发表于 2018-7-30 08:41
步进电机 还是直流电机? 直流电机 就H桥.(自行百度). 步进电机 看型号.如果是 diy用的 byj48 之类的电机需 ...

电机就是玩具车上的那种小马达
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2018-7-30 16:22:07 | 显示全部楼层
本帖最后由 森海有眼泉 于 2018-7-30 16:23 编辑
MNK 发表于 2018-7-30 15:16
电机就是玩具车上的那种小马达

小马达?直流电机咯.  自己百度 用mos管 搭个H桥
或者买 模块芯片 我用过L9110H 还不错
控制的话.就是控制两个io 的高低.一高一低 正转.反过来就是反转..
如果对控制速度有要求的话.
你可以 使用tim 输出PWM 方波 来控制高电平 实现控制速度.
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-7-30 16:25:42 | 显示全部楼层
森海有眼泉 发表于 2018-7-30 16:22
小马达?直流电机咯.  自己百度 用mos管 搭个H桥
或者买 模块芯片 我用过L9110H 还不错
控制的话.就是控 ...

我这有l298的电路驱动模块,那个东西怎么用?直接用io口驱动吗?我用的stm32f103rct6,直接驱动是直接拉高?
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2018-7-30 16:31:03 | 显示全部楼层
MNK 发表于 2018-7-30 16:25
我这有l298的电路驱动模块,那个东西怎么用?直接用io口驱动吗?我用的stm32f103rct6,直接驱动是直接拉 ...

...不知道你是懒,还是小白啊...
我随便淘宝找了个模块. VM(电机电压) VCC(stm32的vcc电压) GND  STBY 使能引脚.应该是高使能. PWMA 接tim输出的pwm用于控制速度.  AIN1 AIN2 接俩个IO 用于控制方向.
A01 A02 接电机.     还有pwmb bin1 b01 啥的.控制第二个电机的.
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-7-30 16:32:43 | 显示全部楼层
森海有眼泉 发表于 2018-7-30 16:31
...不知道你是懒,还是小白啊...
我随便淘宝找了个模块. VM(电机电压) VCC(stm32的vcc电压) GND  STBY 使 ...

小白,单片机是早就买了,但是一直没怎么学。最近学校要做比赛,需要做一个基于stm32的循迹小车,这才着急了
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-7-30 16:33:12 | 显示全部楼层
以前没接触过这东西
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-7-30 17:08:26 | 显示全部楼层
323232 发表于 2018-7-30 08:17
你会点灯为啥不会直流电机?实在不行去网上买个电机驱动模块用

一样的吗?直接gpio输出就可以?
不是要用pwm的吗?
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-7-30 17:08:29 | 显示全部楼层
323232 发表于 2018-7-30 08:17
你会点灯为啥不会直流电机?实在不行去网上买个电机驱动模块用

一样的吗?直接gpio输出就可以?
不是要用pwm的吗?
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-7-30 17:08:46 | 显示全部楼层
323232 发表于 2018-7-30 08:17
你会点灯为啥不会直流电机?实在不行去网上买个电机驱动模块用

一样的吗?直接gpio输出就可以?
不是要用pwm的吗?
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-8-1 20:42:26 | 显示全部楼层
各位大佬,又来麻烦大家了。因为,这个gpio点亮led灯,是点亮了,可是驱动电机电机不动啊
用了l298,但是l298一开始电源的led灯是亮的,后来就不亮了。

代码我是这么写的,想请教大佬们,这样写能驱动吗?



motor.c函数:

#ifndef __MOTOR_H_
#define __MOTOR_H_
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
void gpio_motor_config(void);
void left_wheels_foward(void);
void right_wheels_foward(void);
void left_wheels_back(void);
void right_wheels_back(void);
void gpio_go_straight(void);
void gpio_turn_left(void);
void gpio_turn_right(void);
void gpio_back(void);
#endif



motor.h函数:

#include "motor.h"
void gpio_motor_config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
      RCC_APB2Periph_GPIOC, ENABLE);
   
    /*配置PA5-7*/
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
   
    /*配置PB5-7*/
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
   
    /*配置PC7-9*/  
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStruct);
   
    /*配置PC7-9*/   
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStruct);
}
void left_wheels_foward(void)
{
    /*左前轮使能,正转*/
    GPIO_SetBits(GPIOA, GPIO_Pin_5);
    GPIO_SetBits(GPIOA, GPIO_Pin_6);
    GPIO_ResetBits(GPIOA, GPIO_Pin_7);
   
    /*左后轮使能,正转*/
    GPIO_SetBits(GPIOB, GPIO_Pin_5);
    GPIO_SetBits(GPIOB, GPIO_Pin_6);
    GPIO_ResetBits(GPIOB, GPIO_Pin_7);
}
void right_wheels_foward(void)
{
    /*右前轮使能,正转*/
    GPIO_SetBits(GPIOC, GPIO_Pin_7);
    GPIO_SetBits(GPIOC, GPIO_Pin_8);
    GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   
    /*右后轮使能,正转*/
    GPIO_SetBits(GPIOC, GPIO_Pin_0);
    GPIO_SetBits(GPIOC, GPIO_Pin_2);
    GPIO_ResetBits(GPIOC, GPIO_Pin_3);
}
void left_wheels_back(void)
{
    /*左前轮使能,反转*/
    GPIO_SetBits(GPIOA, GPIO_Pin_5);
    GPIO_ResetBits(GPIOA, GPIO_Pin_6);
    GPIO_SetBits(GPIOA, GPIO_Pin_7);
   
    /*左后轮使能,反转*/
    GPIO_SetBits(GPIOB, GPIO_Pin_5);
    GPIO_ResetBits(GPIOB, GPIO_Pin_6);
    GPIO_SetBits(GPIOB, GPIO_Pin_7);
}
void right_wheels_back(void)
{
    /*右前轮使能,反转*/
    GPIO_SetBits(GPIOC, GPIO_Pin_7);
    GPIO_ResetBits(GPIOC, GPIO_Pin_8);
    GPIO_SetBits(GPIOC, GPIO_Pin_9);
   
    /*右后轮使能,反转*/
    GPIO_SetBits(GPIOC, GPIO_Pin_0);
    GPIO_ResetBits(GPIOC, GPIO_Pin_2);
    GPIO_SetBits(GPIOC, GPIO_Pin_3);
}
void gpio_go_straight(void)
{
    void left_wheels_foward();
    void right_wheels_foward();
}
void gpio_turn_left(void)
{
    void left_wheels_back();
    void right_wheels_foward();
}
void gpio_turn_right(void)
{
    void left_wheels_foward();
    void right_wheels_back();
}
void gpio_back(void)
{
    void left_wheels_back();
    void right_wheels_back();
}


trail.h函数

#ifndef __TRAIL_H_
#define __TTAIL_H_
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
void gpio_trail_config(void);
#endif


trail.c函数

#include "trail.h"
void gpio_trail_config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
   
    /*配置PA5-7*/
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
}



main.c函数:

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "motor.h"
#include "trail.h"
u8 left_tcrt_state;
u8 right_tcrt_state;
int main()
{
    gpio_trail_config();
    gpio_motor_config();
    while(1)
    {
        left_tcrt_state = 0;
        right_tcrt_state = 0;
        if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1)  //反射足够,输出为1
        {
            left_tcrt_state = 1;
        }
        else if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 1)
        {
            right_tcrt_state = 1;
        }
        else
        {
            ;
        }
        if(left_tcrt_state == 0 && right_tcrt_state == 0)
        {
            gpio_go_straight();
            
        }
        else if(left_tcrt_state == 1 && right_tcrt_state == 0)
        {
            gpio_turn_left();
        }
        else if(left_tcrt_state == 0 && right_tcrt_state == 1)
        {
            gpio_turn_right();
        }
        else if(left_tcrt_state == 1 && right_tcrt_state == 1)
        {
            gpio_back();
        }
        else
        {
            ;
        }
    }
}

全部是用gpio的,传感器试过了,传感器应该没问题,能返回信号,就是电机不动,为什么啊


回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-8-1 20:54:36 | 显示全部楼层
323232 发表于 2018-7-29 09:52
pwm是控制速率用的啊...   你灯也可以用pwm啊..控制灯的亮暗程度  还可以做呼吸灯    单单一个直流电机, ...

真的转不起来了。。。。
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-2 08:05:54 | 显示全部楼层
MNK 发表于 2018-8-1 20:54
真的转不起来了。。。。

你电路呢
猪猪熊呢?
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-8-2 10:08:50 | 显示全部楼层

大佬问一下,l298供电应该是多少v?卖家资料上写的是5-12v,我用的四节干电池,电压表测的输入298的电压是6v,是不是电压太低了?
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-2 10:32:46 | 显示全部楼层
MNK 发表于 2018-8-2 10:08
大佬问一下,l298供电应该是多少v?卖家资料上写的是5-12v,我用的四节干电池,电压表测的输入298的电压 ...

电压总是越高越好,你IO口若是驱动不起来,6V也不见得能
猪猪熊呢?
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-8-2 10:41:17 | 显示全部楼层
323232 发表于 2018-8-2 10:32
电压总是越高越好,你IO口若是驱动不起来,6V也不见得能

我试试升一下电压。过几天升压模块才能到,线也不够用了,还得买线
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-2 10:47:41 | 显示全部楼层
MNK 发表于 2018-8-2 10:41
我试试升一下电压。过几天升压模块才能到,线也不够用了,还得买线

学生电源没有吗
猪猪熊呢?
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-8-2 10:49:15 | 显示全部楼层
323232 发表于 2018-8-2 10:47
学生电源没有吗

放假了,在家,哪有这东西
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-8-2 10:49:54 | 显示全部楼层
323232 发表于 2018-8-2 10:47
学生电源没有吗

再说了,我也不是学电子的,怎么可能有学生电源
现在的电源是四节干电池,一个电池盒
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-8-2 10:50:23 | 显示全部楼层
323232 发表于 2018-8-2 10:47
学生电源没有吗

飞线还不够用了,得等马云爸爸给我发货飞线
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-2 11:28:51 | 显示全部楼层
MNK 发表于 2018-8-2 10:50
飞线还不够用了,得等马云爸爸给我发货飞线

%(UMK8N8LXQYVN1@H0800BC.png
猪猪熊呢?
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-8-5 19:32:39 | 显示全部楼层

嗯呢,升压模块估计明天到,明天试试看
回复

使用道具 举报

11

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-11
在线时间
24 小时
 楼主| 发表于 2018-8-11 21:01:40 | 显示全部楼层
不动车电机不动
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 09:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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