四轮两驱小车(一):STM32驱动AS4950
目录
前言:
效果展示:
车体展示:
前言:
在前两周的时间里,我对上个版本的小车进行了一个更新换代,将原本的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相关推荐
- 四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹
目录 前言: 小车效果展示: 5路数字灰度传感器: 巡线思路: 加入PID调节的代码: 前言: 之前买了一批5路灰度传感器,想用这传感器进行循迹,无奈网上和官方的资料提供的还是比较少,这里还是做一下当 ...
- ROS小车-上位机代码:两驱小车直线行走校准
前言 要想实现对小车的精准控制.定位精度的准确,那必然前提就是找到小车速度控制的数学逻辑. 本文实现的目的是:通过teleop_twist_keyboard键盘速度控制节点,给小车下发速度指令,希望在 ...
- STM32、51循迹小车 【STM32入门控制必会 含51全部程序】
目录 前言 方案设计 逻辑分析 程序编写 C51程序-模块化便于移植 STM32程序 添加串口程序变身STM32遥控小车 结语 前言 故事的由来的从给学弟学妹门辅导一次单片机综合实验课开始,由于笔者比 ...
- STM32 驱动 ESP8266 WIFI 模块
目录 1. 模块引脚 2. 测试模块是否正常 3. AT指令 4. ESP8266三种工作模式 5. 配置WIFI模块 6. STM32驱动WIFI模块 拿到一个野火的esp8266模块,驱一下试试 ...
- 关于STM32驱动DS1302实时时钟的一点思考
关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...
- 告诉你SUV到底两驱好还是四驱好
很多朋友在购买SUV时都会盲目地认为SUV一定是4驱的更好,其实我们在选购车辆时一定要清楚地了解自身的真实需求.如果您大多数时间都在城市里度过,那么选择一款2驱的SUV就完全能够满足您的日常生活:如果 ...
- ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)
参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixi ...
- stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)
RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...
- STM32驱动LCD实战
目录 01 驱动时序 02 FSMC外设配置 03 背光驱动 04 复位驱动 05 寄存器配置 前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文 ...
最新文章
- Android——学习:线性布局权重分配
- 让你每天精神都好好的方法ZT
- 看,2015阿里巴巴视觉设计人员面临的问题招收学校
- AAAI 2020 | XIV-ReID:基于X模态的跨模态行人重识别
- 淘宝账号基于OAuth2.0的登录验证授权登陆第三方网站
- 【JavaScript】实现将从Excel中复制的数据粘贴到WEB页面Grid中
- oracle表重命名 索引,CSS_在Oracle数据库中按用户名重建索引的方法,如果你管理的Oracle数据库下某 - phpStudy...
- ZMQ模式详解——发布/订阅模式
- 对于PHP面试知识点的小结
- 《麦肯锡方法》读书笔记16
- Linux安装Nvidia显卡驱动
- 信息论——最大流最小割定理
- html英雄联盟网页,Html+Css+JQuery实现简易英雄联盟官网
- 对英文字母按照不区分大小写进行排序
- Cadillac CTS-V
- ERD Commander 2005 Boot CD 剖析及汉化试验
- Java程序性能优化 !
- 三.N32G003 系统性能测试--dhrystone (IAR环境)
- 拆分基础Slam(1)--静态相机前端
- JAVA基础学习-复习day11