驱动电机,我们在这里使用TB6612来驱动电机,同时,电机的内部我们有编码器进行计次

输出比较

cnt,就是时基单元寄存器

ccr,在cnt下方,为捕获比较寄存器,cc是捕获比较的意思,r就是寄存器

他就可以在捕获与比较之间进行切换

cnt计数是自增的,CCR是我们给定的一个值,当cnt大于ccr 小于ccr 等于ccr时,CH1通道就会对应的置1 / 0 / 1 / 0,为我们需要用这个来输出PWM波形

PWM参数: 频率 = 1 / ts   占空比 = ton / ts   分辨率 = 占空比变化

上图为输出控制OC输出PWM,相同的下面还有3个通道

我们可以控制大小,控制输出的REF的高低电平

输出比较模式

PWM的结构我们之前说过,就不过多介绍,看一张图我们就能明白

直流电机

有两个电极,正接正转,反接反转,我们看看TB6612电路

所以我们可以看出,想要驱动一个电机,我们需要配置3个IO口,一个PWM,两个AIN1/2

TB6612.h

#ifndef TB6612_H
#define TB6612_H#include "sys.h"/*B0 口*/
#define AIN1_GPIO_PIN       GPIO_Pin_3
#define AIN1_GPIO_PORT  GPIOB
#define AIN1_GPIO_CLK       RCC_APB2Periph_GPIOB/*输出高电平*/
#define AIN1_ON         GPIO_SetBits(AIN1_GPIO_PORT,AIN1_GPIO_PIN)
/*输出低电平*/
#define AIN1_OFF        GPIO_ResetBits(AIN1_GPIO_PORT,AIN1_GPIO_PIN)/*B1口*/
#define AIN2_GPIO_PIN       GPIO_Pin_4
#define AIN2_GPIO_PORT  GPIOA
#define AIN2_GPIO_CLK       RCC_APB2Periph_GPIOA/*高电平*/
#define AIN2_ON         GPIO_SetBits(AIN2_GPIO_PORT,AIN2_GPIO_PIN)
/*低电平*/
#define AIN2_OFF        GPIO_ResetBits(AIN2_GPIO_PORT,AIN2_GPIO_PIN)/*B10口*/
#define BIN1_GPIO_PIN       GPIO_Pin_5
#define BIN1_GPIO_PORT  GPIOA
#define BIN1_GPIO_CLK       RCC_APB2Periph_GPIOA#define BIN1_ON         GPIO_SetBits(BIN1_GPIO_PORT,BIN1_GPIO_PIN)#define BIN1_OFF      GPIO_ResetBits(BIN1_GPIO_PORT,BIN1_GPIO_PIN)/*B11口*/
#define BIN2_GPIO_PIN       GPIO_Pin_12
#define BIN2_GPIO_PORT  GPIOB
#define BIN2_GPIO_CLK       RCC_APB2Periph_GPIOB#define BIN2_ON         GPIO_SetBits(BIN2_GPIO_PORT,BIN2_GPIO_PIN)#define BIN2_OFF      GPIO_ResetBits(BIN2_GPIO_PORT,BIN2_GPIO_PIN)  void AIN1_GPIO_Config(void);
void AIN2_GPIO_Config(void);
void PWMA_STOP(void);
void PWMA_Forward(int a);
void PWMA_Reverse(int a);void BIN1_GPIO_Config(void);
void BIN2_GPIO_Config(void);
void PWMB_STOP(void);
void PWMB_Forward(int a);
void PWMB_Reverse(int a);void TB6612_GPIO_Config(void);
void STOP(void);
void Forward(int a);
void Reverse(int a);
#endif

TB6612.c

#include "TB6612.h"
#include "base_generaltim.h"
#include "stm32f10x.h"// 开启AIN1,GPIO
void AIN1_GPIO_Config(void)
{GPIO_InitTypeDef   GPIO_InitStruct;RCC_APB2PeriphClockCmd(AIN1_GPIO_CLK,ENABLE);GPIO_InitStruct.GPIO_Pin = AIN1_GPIO_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//使用推挽输出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(AIN1_GPIO_PORT,&GPIO_InitStruct);
}// 开启AIN2
void AIN2_GPIO_Config(void)
{GPIO_InitTypeDef       GPIO_InitStruct;RCC_APB2PeriphClockCmd(AIN2_GPIO_CLK,ENABLE);GPIO_InitStruct.GPIO_Pin = AIN2_GPIO_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³öGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(AIN2_GPIO_PORT,&GPIO_InitStruct);
}void BIN1_GPIO_Config(void)
{GPIO_InitTypeDef       GPIO_InitStruct;RCC_APB2PeriphClockCmd(BIN1_GPIO_CLK,ENABLE);GPIO_InitStruct.GPIO_Pin = BIN1_GPIO_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³öGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BIN1_GPIO_PORT,&GPIO_InitStruct);
}void BIN2_GPIO_Config(void)
{GPIO_InitTypeDef       GPIO_InitStruct;RCC_APB2PeriphClockCmd(BIN2_GPIO_CLK,ENABLE);GPIO_InitStruct.GPIO_Pin = BIN2_GPIO_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³öGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BIN2_GPIO_PORT,&GPIO_InitStruct);
}// 开启两个IO口,控制对应输出口
void TB6612_GPIO_Config(void)
{AIN1_GPIO_Config();AIN2_GPIO_Config();BIN1_GPIO_Config();BIN2_GPIO_Config();
}void PWMA_STOP(void)//
{AIN1_OFF;AIN2_OFF;GENERAL_ccr1_Mode_Config(0); //PWM输出
//PWM的初始化,在前两个函数,放在了主函数
} void PWMA_Forward(int a)//01ΪÕýת
{AIN1_OFF;AIN2_ON;GENERAL_ccr1_Mode_Config(a);}void PWMA_Reverse(int a)//10Ϊ·´×ª
{AIN1_ON;AIN2_OFF;GENERAL_ccr1_Mode_Config(a);}void PWMB_STOP(void)//00Ϊֹͣ
{BIN1_OFF;BIN2_OFF;GENERAL_ccr2_Mode_Config(0);
}void PWMB_Forward(int a)//01ΪÕýת
{BIN1_OFF;BIN2_ON;GENERAL_ccr2_Mode_Config(a);
}void PWMB_Reverse(int a)//10Ϊ·´×ª
{BIN1_ON;BIN2_OFF;GENERAL_ccr2_Mode_Config(a);
}void STOP(void)
{PWMA_STOP();PWMB_STOP();
}void Forward(int a)
{PWMA_Forward(a);PWMB_Forward(a);
}void Reverse(int a)
{PWMA_Reverse(a);PWMB_Reverse(a);
}

我们也可以直接配置,然后在Compare里面来进行设定空比(调速)

同时也要进行对电机内编码器的计算

开启IC输出比较,进行cnt计算编码器计次,通过清零读数来计算编码器脉冲,计算编码器最主要的用途是用于PID的使用,我们下一节再说明

ROS移动机器人——32电机驱动相关推荐

  1. ROS 移动机器人 STM32 Kinect2 智能车

    基于ROS平台的移动机器人-目录 说明 本系列博文将介绍基于ROS平台的移动机器人的搭建,包括小车的底盘的制作,控制和与上位机的通信,建图和导航. 目录 基于ROS平台的移动机器人-1-小车底盘的搭建 ...

  2. 从零开始搭建ROS移动机器人系列之(一)预备知识及总体框架

    " 笔者2020年初次接触ROS,2021年参加工作以后,愈发对ROS产生浓厚的兴趣,渴望拥有一台ROS机器人,淘宝上一搜再搜,发现有很多现成的产品,但是价格属实让人望而却步,遂产生了自己搭 ...

  3. ROS移动机器人开发——硬件引脚

    我们使用的32开发板为冰达机器人官方的开发板,类型为STM32RCT6.32章节的目的为,将官方所给源码转化为 官方标准库函数来进行使用 -------------- 需求提出: 电源 1. 3.3V ...

  4. 古月 ROS移动机器人实战 二维slam地图构建 笔记

    二维slam地图构建 Gmapping功能包 一种粒子滤波算法,将定位与建图分离,先进行定位.再进行建图,适合构建小场景环境下的地图信息. 需要机器人提供里程计信息作为先验知识. 虽然可以降低对激光雷 ...

  5. 古月 ROS移动机器人实战5.3ROS导航框架介绍笔记

    机器人自主导航流程 机器人躲避障碍物,偏离最优路径,由本地规划器完成.本地规划器实时规划避障路径,还会努力让机器人沿着全局路径运动,也就是规划机器人每时每刻的运动速度,速度通过cmd_vel发送给底盘 ...

  6. ros移动机器人,激光雷达里程计rf2o_laser_odometry的使用与分析

    目录 1.问题分析 2.激光雷达里程计 2.1 代码下载 2.2 使用方法 (1) ERRO:"base_link" passed to lookupTransform argum ...

  7. ROS移动机器人——ROS基础知识与编程

    此文章基于冰达机器人进行笔记整理,使用的环境为其配套环境,可结合之前的ROS,赵虚左老师的文章结合进行观看,后期也会进行整合 同时建议观看cn/ROS/Tutorials - ROS Wiki 官方教 ...

  8. ROS移动机器人 Solidworks整个机器人设计文件(三维 激光雷达 arduino nvidia)(SLDPRT SLDASM)

    还是17年本科时制作的毕业设计,基于solidworks 2014所制作. 文件里包含了制作的整个移动机器人的SolidWorks原文件. 是设计完各个零件然后组合在一起的,所以适用性很强,可以根据你 ...

  9. ROS 移动机器人 坐标系统

    坐标系介绍 世界坐标(map) 该map坐标系是一个世界固定坐标系,其Z轴指向上方.相对于map坐标系的移动平台的姿态,不应该随时间显著移动.map坐标是不连续的,这意味着在map坐标系中移动平台的姿 ...

最新文章

  1. BZOJ 1192 鬼谷子的钱袋 数论
  2. ubuntu 11.10 添加分辨率
  3. pdf阅读器改背景色
  4. SAP Marketing Cloud功能简述(四) : 线索和客户管理
  5. webpack设置应用缓存_如何使用Webpack在Rails应用程序中设置TinyMCE
  6. 【数据结构与算法】浅谈稀疏矩阵
  7. openssl windows安装
  8. vue 时间戳 格式转化(插件化) - 封装篇
  9. xgboost算法_XGBoost 原理 及 常见面试题
  10. 对网站商城源码的研究分析 分享大量源码下载
  11. arcgis 中北京1954 高斯克吕格投影说明
  12. # 【CrackMe】0-爆破之Acid burn
  13. MINGW里面没有mingw32 make.exe
  14. java cropper_cropper 使用总结
  15. 2021全国电子设计大赛 D题 基于互联网的摄像测量系统 源码解析
  16. 互联网协议 传输层及概述
  17. mysql数据库基操所遇问题及相关知识及命令记录
  18. java8和java9的对比
  19. 童瑶担任奥伦纳素“冰白大使”,高端护肤品类加速扩张中国市场
  20. 单枪匹马的英雄是否还有用武之地?

热门文章

  1. 2014年11月05日
  2. HTML5音频播放器资源免费下载
  3. fis3-jello搭建笔记
  4. mysql parquet_Spark与Apache Parquet
  5. php网站 qq登陆,PHP QQ一键登入网站实现过程
  6. box-sizing: border-box;是什么意思
  7. android 12.0Camera2 去掉后置摄像头 仅支持前置摄像头功能
  8. 圆形ImageView系列(一)-----Xfermode+View
  9. mini2440 u-boot linux 内核启动,mini2440之U-Boot使用及移植详细手册
  10. Junit5测试框架实战