目录

前言:

效果展示:

车体展示:


前言:

在前两周的时间里,我对上个版本的小车进行了一个更新换代,将原本的4驱小车换成了4轮两驱小车,舍弃了树莓派4B作为上位机。新版小车采用两个520直流减速电机搭配AS4950电机芯片来差速行进,后面采用两个万向轮带着,5路灰度传感器循迹,用HC_SR04超声波模块中断式测距,用HC_08蓝牙模块与手机进行通信,同时搭载MPU6050模块来拐直角弯。

效果展示:

新版小车功能效果展示

车体展示:

正文开始:

本次改进依旧沿用上次制作的电路板,板载了AS4950电机芯片,在这款电机芯片的帮助下,我甚至连死区时间都不用配置,AS4950自行帮我们处理。

如图就是AS4950及其原理图

根据AS4950的数据手册,我们可以整理一下,得到一个表格

IN1 IN2 电机驱动状态
任意 任意 停止
0 0 停止
0 1 正转
1 0 反转
1 1 刹车

从这里,我们就可以看到AS4950有4种驱动状态:

1:IN1端口输入PWM,IN2端口输入低电平,芯片输出正电流,电机正转;

2:IN1端口输入低电平,IN2端口输入PWM,芯片输出负电流,电机反转;

3:IN1端口输入高电平,IN2端口输入PWM,芯片输出正电流,电机正传;

4;IN1端口输入PWM,IN2端口输入高电平,芯片输出负电流,电机反转;

我这里就选择了方式1和方式4来控制电机正反转,利用两轮差速来循迹和拐弯,使用TIM8的CH2(PC7)CH3(PC8)作为PWM输出,CH2N(PB0)CH3N(PB1)作为推挽输出。在输出PWM上,我选择了输出比较模式,通过修改CCR寄存器来调整占空比

代码部分:

void Motor3_Init()
{//PC7      -> TIM8_CH2GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//PC7为PWMGPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);//PC7GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//PB0用做推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//PB0GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);// 0 0 状态是AS4950休眠状态TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_Period = 9999;TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t) (SystemCoreClock / 1000000) - 1;TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OutputNState_Disable;//CH2N通道失能
//  TIM_OCInitStructure.TIM_OCPolarity = ;TIM_OCInitStructure.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_CtrlPWMOutputs(TIM8,ENABLE);   //MOE 主输出使能 TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Disable);  //CH2预装载使能    TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM8, ENABLE);  //使能TIM8
}
void Motor4_Init()
{//PC8      -> TIM8_CH3GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//PC8作为PWMGPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);//PC8GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//PB1作为输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//PB1GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_RESET);// 0 0 状态是AS4950休眠状态TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_Period = 9999;TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t) (SystemCoreClock / 1000000) - 1;TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);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(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_CtrlPWMOutputs(TIM8,ENABLE);  //MOE 主输出使能 TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Disable);  //CH3预装载使能    TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM8, ENABLE);  //使能TIM8
}
#define Motor3_reverse(pulse)        {TIM8->CCR2 = pulse; GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);}
#define Motor4_reverse(pulse)        {TIM8->CCR3 = pulse; GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_RESET);}
#define Motor3_stop()                {TIM8->CCR2 = 0; GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);}
#define Motor4_stop()                {TIM8->CCR3 = 0; GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_SET);}
#define Motor3_forward(pulse)        {TIM8->CCR2 = pulse; GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);}
#define Motor4_forward(pulse)        {TIM8->CCR3 = pulse; GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_SET);}
#define Move_stop()                  {Motor3_stop();Motor4_stop();}

四轮两驱小车(一):STM32驱动AS4950相关推荐

  1. 四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹

    目录 前言: 小车效果展示: 5路数字灰度传感器: 巡线思路: 加入PID调节的代码: 前言: 之前买了一批5路灰度传感器,想用这传感器进行循迹,无奈网上和官方的资料提供的还是比较少,这里还是做一下当 ...

  2. ROS小车-上位机代码:两驱小车直线行走校准

    前言 要想实现对小车的精准控制.定位精度的准确,那必然前提就是找到小车速度控制的数学逻辑. 本文实现的目的是:通过teleop_twist_keyboard键盘速度控制节点,给小车下发速度指令,希望在 ...

  3. STM32、51循迹小车 【STM32入门控制必会 含51全部程序】

    目录 前言 方案设计 逻辑分析 程序编写 C51程序-模块化便于移植 STM32程序 添加串口程序变身STM32遥控小车 结语 前言 故事的由来的从给学弟学妹门辅导一次单片机综合实验课开始,由于笔者比 ...

  4. STM32 驱动 ESP8266 WIFI 模块

    目录 1. 模块引脚 2. 测试模块是否正常 3. AT指令 ​4. ESP8266三种工作模式 5. 配置WIFI模块 6. STM32驱动WIFI模块 拿到一个野火的esp8266模块,驱一下试试 ...

  5. 关于STM32驱动DS1302实时时钟的一点思考

    关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...

  6. 告诉你SUV到底两驱好还是四驱好

    很多朋友在购买SUV时都会盲目地认为SUV一定是4驱的更好,其实我们在选购车辆时一定要清楚地了解自身的真实需求.如果您大多数时间都在城市里度过,那么选择一款2驱的SUV就完全能够满足您的日常生活:如果 ...

  7. ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)

    参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixi ...

  8. stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)

    RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...

  9. STM32驱动LCD实战

    目录 01 驱动时序 02 FSMC外设配置 03 背光驱动 04 复位驱动 05 寄存器配置 前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文 ...

最新文章

  1. Android——学习:线性布局权重分配
  2. 让你每天精神都好好的方法ZT
  3. 看,2015阿里巴巴视觉设计人员面临的问题招收学校
  4. AAAI 2020 | XIV-ReID:基于X模态的跨模态行人重识别
  5. 淘宝账号基于OAuth2.0的登录验证授权登陆第三方网站
  6. 【JavaScript】实现将从Excel中复制的数据粘贴到WEB页面Grid中
  7. oracle表重命名 索引,CSS_在Oracle数据库中按用户名重建索引的方法,如果你管理的Oracle数据库下某 - phpStudy...
  8. ZMQ模式详解——发布/订阅模式
  9. 对于PHP面试知识点的小结
  10. 《麦肯锡方法》读书笔记16
  11. Linux安装Nvidia显卡驱动
  12. 信息论——最大流最小割定理
  13. html英雄联盟网页,Html+Css+JQuery实现简易英雄联盟官网
  14. 对英文字母按照不区分大小写进行排序
  15. Cadillac CTS-V
  16. ERD Commander 2005 Boot CD 剖析及汉化试验
  17. Java程序性能优化 !
  18. 三.N32G003 系统性能测试--dhrystone (IAR环境)
  19. 拆分基础Slam(1)--静态相机前端
  20. JAVA基础学习-复习day11

热门文章

  1. ffmpeg录制系统声音,麦克风声音,桌面视频,并且桌面视频和声音分两个线程写
  2. jquery浮层居中
  3. 使用sql中replace()函数替换或去掉字段中的某些字符
  4. Oracle 数据库利用回收站恢复删除的表实例演示
  5. 把商品添加到购物车的方法
  6. Word插入NoteExpress插件时“运行错误429:ActiveX部件不能创建对象“解决方案
  7. 今天收到了华为的录取通知
  8. 李开复写给中国学生家长的信
  9. Django基本使用 - 展示一个HTML文件
  10. cgal + sfcgal