文章目录

  • 一、硬件连接
    • 1.器件清单:
    • 2.接线:
    • 3.驱动电机
  • 二、软件驱动代码编写
    • 1.初始化代码
    • 2.电机驱动代码
  • 总结

  • 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的普通大学生。
  • 进入正题,最近在做小车,目前已经可以跑起来了,然后就是加入各种各样的传感器,使得她的功能更加丰富。
  • 本次就谈谈做小车中的第一步,也是最重要的一步:PWM驱动直流减速电机,也是就让小车跑起来。
  • 非常感谢大家的阅读,如果有不对的地方欢迎指正

一、硬件连接

1.器件清单:

1.STM32F103C8T6最小系统板
2.直流减速电机
3.TB6612FNG驱动模块

2.接线:


接线方式1(PWM驱动电机):
PWMA----PA11:接板子可设置PWM的IO口,
PWMA----PA2:接板子可设置PWM的IO口;
STBY------3.3v:使能;
AIN1-------PB12:普通IO口;
AIN2-------PB13:普通IO口;
BIN1-------PB14:普通IO口;
BIN2-------PB15:普通IO口;
VM---------12V电源正极:供电;
GND-------电源负极;
VCC--------板子5V;
GND--------板子GND;
A1(AO1)————电机1(无正负)
A2(AO2)————电机1(无正负,和正传反转有关)
B1(BO1)————电机2(无正负)
B2(BO2)————电机2(无正负,和正传反转有关)
注意:TB6612一定要和板子共地;
接线方式2(不空速):
不用接PWMA和PWMB就可以了。

3.驱动电机

现在就说说为什么这样接线吧:

我们只需要让四个IO输出相应的高低电平,然后通过PWM调速,就可以让小车动起来了,是不是很简单(狗头保命),好了,下面开始讲解软件部分。

二、软件驱动代码编写

1.初始化代码

代码示例:

void Motor_Init(u16 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;    //端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50MGPIO_Init(GPIOB, &GPIO_InitStructure);                  //根据设定参数初始化GPIOBPWM_Init(arr,psc);
}

这就是很简单的GPIO初始化啦,然后就是PWM初始化:

/**************************************************************************
函数功能:控制电机的两路PWM初始化
入口参数:无
返回  值:无
**************************************************************************/
void PWM_Init(u16 arr,u16 psc)
{                GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;//使能GPIO和定时器时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能//设置该引脚为复用输出功能,输出TIM1 CH4和TIM2 CH3的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_11;   //TIM_CH1 //TIM_CH4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化定时器arr、pscTIM_TimeBaseStructure.TIM_Period = arr;                //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc;              //设置用来作为TIMx时钟频率除数的预分频值  不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0;           //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);        //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位//初始化比较参数TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;      //选择定时器模式:TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高TIM_OC4Init(TIM1, &TIM_OCInitStructure);               //根据TIM_OCInitStruct中指定的参数初始化外设TIMx//MOE 主输出使能TIM_CtrlPWMOutputs(TIM1,ENABLE);                   //CH4预装载使能TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);     //使能TIMx在ARR上的预装载寄存器TIM_ARRPreloadConfig(TIM1, ENABLE);                   //使能TIM1TIM_Cmd(TIM1, ENABLE);                                //TIM2_CH3TIM_TimeBaseStructure.TIM_Period = arr;                //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc;              //设置用来作为TIMx时钟频率除数的预分频值  不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0;           //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);        //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;      //选择定时器模式:TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高TIM_OC3Init(TIM2, &TIM_OCInitStructure);               //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_CtrlPWMOutputs(TIM2,ENABLE);                   //MOE 主输出使能TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);     //CH3预装载使能TIM_ARRPreloadConfig(TIM2, ENABLE);                   //使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM2, ENABLE);                                //使能TIM2
}

大家可以仔细看看注释,这里我用的是PA11(TIM1 CH4)和 PA2(TIM2 CH3),这样我们就初始化完了。

2.电机驱动代码

.h文件:

//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12)//0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12)//0x40010C0C#define GPIOA_IDR_Addr    (GPIOA_BASE+8)//0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8)//0x40010C08
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)//输出
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)//输入#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)//输出
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)//输入#define PWMA   TIM2->CCR3//PA2
#define AIN2   PBout(15)
#define AIN1   PBout(14)
#define BIN1   PBout(13)
#define BIN2   PBout(12)
#define PWMB   TIM1->CCR4//PA11void Set_Pwm(int moto1,int moto2);
int myabs(int a);

这里我用了PB12-15作为输入的引脚,大家也可以用其他的引脚,只是需要把宏定义改一下就可以了
.c文件:

/**************************************************************************
函数功能:赋值给PWM寄存器
入口参数:左轮PWM、右轮PWM
返回  值:无
**************************************************************************/
void Set_Pwm(int motorLeft,int motorRight)
{if(motorLeft>0)     AIN2=0, AIN1=1;else if(motorLeft == 0) AIN2=0, AIN1=0;else               AIN2=1,    AIN1=0;PWMA=myabs(motorLeft);if(motorRight>0)   BIN1=0,    BIN2=1;else if(motorRight == 0) BIN1=0, BIN2=0;else                BIN1=1, BIN2=0;PWMB=myabs(motorRight);
}/**************************************************************************
函数功能:绝对值函数
入口参数:int
返回  值:unsigned int
**************************************************************************/
int myabs(int a)
{           int temp;if(a<0)  temp=-a;  else temp=a;return temp;
}

这个函数void Set_Pwm(int motorLeft,int motorRight)就是根据TB6612驱动电机的原理编写的代码,方便我们控制电机。
我们调用时直接SetPwm(LeftSpeed,RightSpeed);就可以了,是不是很简单呢?(狗头保命);

总结

奉上视频:

你见过会说话的小车吗

本文仅仅简单介绍了TB6612控制直流电机的原理和驱动代码的编写,这样就完成了智能小车的第一步,后面会加上更多传感器如:超声波,红外避障,红外遥控,超声波,手势传感器等等,去实现更多的功能,感谢阅读,如果觉得我的文章对你有帮助的话,就点个赞吧!爱了爱了

STM32智能小车------PWM驱动直流电机相关推荐

  1. Arduino/stm32 智能小车设计(二)

    Arduino/stm32 智能小车设计(二) 本节进行Arduino智能小车的代码讲解. 一.I/O口定义与初始化函数 如下图RGB指示灯用到10.11.12三个I/O口,分别对应蓝色.红色.绿色. ...

  2. Arduino/stm32 智能小车设计(一)

    Arduino/stm32 智能小车设计(一) 智能小车原理图设计 智能小车原理图组件包括: 模块设计 一.控制模块 二.供电模块 三.充电管理模块 四.电机驱动模块 五.红外寻迹及红外避障模块 六. ...

  3. 智能小车PWM调速原理

    电机驱动电路 智能小车电机的驱动芯片采用L293D.L293D是一款单片集成的高电压.高电流.4通道电机驱动,设计用于连接标准DTL或TTL逻辑电平,驱动电感负载(诸如继电线圈.DC和步进电机)和开关 ...

  4. STM32智能小车循迹教程

    文章目录 前言 一.红外循迹模块工作原理及接线图 红外循迹模块工作原理 红外循迹模块和STM32的接线图 二.cubeMX配置 三.代码解析 总结 前言 本篇文章将带大家学习STM32智能小车的循迹功 ...

  5. 用matlab结合STM32作上位机,基于stm32智能小车视觉控制导航的设计参考.pdf

    第 25 卷 第 9 期 电子设计工程 2017 年 5 月 Vol.25 No.9 Electronic Design Engineering May. 2017 基于STM32 智能小车视觉控制导 ...

  6. 基于STM32智能小车蓝牙遥控实验(有代码含上位机)

    小车设计 利用STM32作为智能小车的主控制器来驱动智能小车的直流电机工作,电机驱动芯片采用L298N微型集成电路电机驱动芯片,配合STM32核心板使用实现四个直流电机运行和pwm软件调速,通过改变直 ...

  7. stm32智能小车设计

    提前说说 博主是用寄存器写的驱动 历时两周,总算把小车弄好了,总体上来说做的太慢了.自己在32的学习中还不够仔细深入,只是浅面的学习,当真正做一个项目时,暴露的问题就太多了.这次在小车的制作的过程中, ...

  8. 基于STM32智能小车->电机驱动

    嵌入式之路,贵在日常点滴 ---阿杰在线送代码 目录 一.直流电机原理 二.减速器 三.电机实物接线图解 四.电机编码器 1.为什么要用电机编码器 2.电机编码器的使用 五.为什么要用电机驱动 六.T ...

  9. STM32智能小车------超声波测距模块

    文章目录 一.原理讲解 1.实物图 2.工作原理: 3.接线: 二.软件驱动代码 1.接口定义 2.驱动函数 总结 最终效果 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的普通大学生. 进 ...

最新文章

  1. iOS中KVO模式的解析与应用
  2. 聊聊高并发(四)Java对象的表示模型和运行时内存表示
  3. 移动端网页宽度值(未加meta viewport标签)
  4. azure云数据库_将Azure SQL数据库警报集成到Slack
  5. 商业智能在公安交通管理领域的应用
  6. 有向图的强连通分量--Tarjan算法---代码分析
  7. linux apache mysql python 搭建_linux 下安装 mysql 并配置 python 开发环境
  8. 拓端tecdat|R语言网络和网络流的可视化实践:通勤者流动网络
  9. win10自动更新系统导致 点击睡眠之后直接关机
  10. easyPOI 模板导出Excel
  11. java 以2为底的对数_Java对数函数及Java对数运算
  12. 支付宝小程序芝麻信用分授权配置
  13. 什么是VMWare虚拟机
  14. 小学计算机考核,小学信息技术学科考核评价方案.docx
  15. sqlplus登录缓慢的解决
  16. 医院PACS系统源码 影像系统源码 区域PACS源码
  17. 软硬件学习记录5—— Verilog语言中的数据类型
  18. CSS3 will-change提高页面动画等渲染性能
  19. 现代计算机体系结构发明人,cpu的发明人是谁啊?
  20. vite创建vue保姆级教程

热门文章

  1. 80核处理器_Intel i9-10980XE处理器首发评测:售价“良心”的18核性能旗舰
  2. 计算机毕业设计SSM仿咸鱼二手物品交易系统【附源码数据库】
  3. 北斗卫星系统的心脏——中国原子钟发展的历史
  4. Camera,音频录制与Vitamio框架
  5. 各种效应:蝴蝶效应、青蛙现象、鳄鱼法则、鲇鱼效应、羊群效应、刺猬法则、手表定律、破窗理论、二八定律、木桶理论、马太效应
  6. 中美老太太第二次对话
  7. 腾讯云系统镜像和使用镜像创建云主机
  8. MATLAB:指定坐标轴范围、轴向、位置
  9. 手电筒java下载_Android studio编写简单的手电筒APP
  10. 这是一个谷歌抄腾讯的时代