Motor

  • 主要内容
  • 前置知识
  • CubeMX配置
  • 代码
  • 出现的问题
  • 参考文献

主要内容

基于被我鸽了的电控作业
主控 STM32F429IGT6 电机TT小黄 模拟小车所以两路编码器
前置知识包括 PID PWM 定时器 LM2596 L298N等

前置知识

PID可以看我之前的这一篇PID简单算法
PWM可以看我之前的这一篇PWM
LM2596可调的降压模块 网上资料蛮多 也比较好用 拿表笔对着测一下转一下旋钮就行 注意不要接反 否则直接击穿就不能再用了
简单介绍一下L298N电机驱动模块 原理图如图
1脚接入12V及以下电压 3脚就能输出5V电压 给单片机供电 5 6由单片机接入PWM波 8 9端接电机 就能按照需要的或者调好的转速控制电机了
下图为真值表 通过信号接入也可以控制正反转

当然TB6612也行 性能可能更佳 但我用过的时候有一点bug 还烧过一次钽电容 用单独模块和降压电路安全电压下直接芯片烧了 后来画PCB集成之后好了 TB6612一块要十几块钱 L298N也就几块钱 性能也没什么差别 再带一块LM2596一样的效果

CubeMX配置

在单片机控制的时候注意 用定时器1和2 开编码器模式 由于输出量是路程 所以需要单开两个基础定时器6 7做计时 一个用来求转速 一个用来调PID 后续代码处可以看到 有一个电机结构体 把算好的速度作为结构体变量之一赋值
新建CubeMX工程 开时钟 TIM1和TIM2开编码器模式 TIM3开四路PWM TIM6和TIM7开计时 并且根据自己设定的频率算出来需要的定时器周期(PSC&ARR)并且开TIM6和TIM7中断 设置抢占优先级为1 如果6.5.x及以上的CubeMX记得调Systick优先级为0

(按照上述步骤开就行 这个图里还有别的引脚被别的功能用了 除了定时器开启状态外不具有参考性)
一个小tip:当你自己画板子或者你拿到的板子有些引脚没引出来 可以在搜索栏搜对应功能 一般都有别的引脚一样的功能(复用)改到那个引脚就好

代码

新建PID文件,Motor电机文件 adv底盘文件 名字不重要
PID的看前面那篇文章就有 结构体啥的基本不变 我就不多写了
motor.h:

typedef  struct
{int16_t Angle;int32_t LastAngle;float Speed;int16_t TargetSpeed;int32_t TargetAngle;int32_t TotalAngle;    PID SpeedPID;CascadePID AnglePID;
}Motor;

一些类似于#ifndef #endif的C语言背景知识这里就不多介绍了 少bug操作而已
motor.c:

//统计马达的角度和速度
void Motor_Cal(Motor *motor)
{int32_t dAngle=0;if(motor->Angle-motor->LastAngle<-30000) //越界处理dAngle=motor->Angle+(65535-motor->LastAngle);else if(motor->Angle-motor->LastAngle>30000)dAngle=-motor->LastAngle-(65535-motor->Angle);elsedAngle=motor->Angle-motor->LastAngle;//将角度增量加入计数器motor->TotalAngle+=dAngle;//计算速度motor->Speed = (float)dAngle/(4*13*48)*50*60;//rpm   *50*60与定时器频率匹配//倍频 刻度 减速比 定时器中断周期 换算成分钟//记录角度motor->LastAngle=motor->Angle;
}

前面if里面是对角度的越界处理 比如你的LastAngle有点大 一步跨到ARR之外了 就自动从0开始了 所以做这个判断
速度的计算公式 因为用了AB相 相当于四倍频 电机用的TT 13个刻度 减速比1:48 因电机而异 定时器周期前面设置的对应值 *60换成分钟

//设置马达pwm
void Motor_SetPWM(float PWM1,float PWM2)
{if(PWM1>0){__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, PWM1);__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, 0);}else {__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, 0);__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2,ABS(PWM1));//正反转}if(PWM2>0){__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, PWM2);__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, 0);}else{__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, 0);__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, ABS(PWM2));}
}

通过你设置的PWM来规定正反转 写到对应通道 用上面L298N的真值表对应
adv.h

typedef  struct
{uint8_t mode;   //底盘模式float averge;Motor motors[2];  //电机结构体}ADV;
void Adv_init()
{HAL_TIM_Base_Start_IT(&htim6);                  HAL_TIM_Base_Start_IT(&htim7);HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);         //电机pwmHAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);HAL_TIM_Encoder_Start(&htim1,TIM_CHANNEL_ALL);   //电机编码器HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);Adv_PIDInit();
}
/***************内部函数********************/
//PID初始化
void Adv_PIDInit()
{PID_Init(&chassis.motor[0].SpeedPID,200,0.005,0,10000,10000);PID_Init(&chassis.motor[1].SpeedPID,200,0.006,1,10000,10000);PID_Init(&chassis.motor[0].AnglePID.inner,200,0.005,0,10000,10000);PID_Init(&chassis.motor[1].AnglePID.inner,200,0.006,1,10000,10000);PID_Init(&chassis.motor[0].AnglePID.outer,0.2,0,0.5,40,40);PID_Init(&chassis.motor[1].AnglePID.outer,0.2,0,0.5,40,40);
}   void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim)
{if(htim==&htim6){Adv.motor[0].Angle=__HAL_TIM_GET_COUNTER(&htim1);Adv.motor[1].Angle=__HAL_TIM_GET_COUNTER(&htim2);Motor_Cal(&Adv.motor[0]);Motor_Cal(&Adv.motor[1]);}if(htim==&htim7){for(uint8_t i=0;i<2;i++){PID_SingleCalc(&Adv.motor[i].SpeedPID,Adv.motor[i].TargetSpeed,Adv.motor[i].Speed);}Motor_SetPWM(Adv.motor[0].SpeedPID.output,Adv.motor[1].SpeedPID.output);}
}

在回调函数里面分别实现这两个功能 按设定的周期走的
主函数都不用动 除了调用底盘函数

/* USER CODE BEGIN 2 */Adv_init();/* USER CODE END 2 */

如果后续还有功能要加 比如巡线等等 直接在底盘里面修改就行

出现的问题

没啥问题 改了几个参数自己又跑了一遍 效果挺好 就是F4有点大材小用 用F1C8T6最小系统就能实现

参考文献

github暂时不太好使 后续补完整工程
1.野火零基础教程&电机教程 野火论坛或者资料下载中心可以下载 东西可太全了 百度一搜就行
2.吉甲电控yyds 学到不少东西 可惜上岁数了打不了rm寄

2022.7.16 加个广告 欢迎各位来看新写的文章 关于简单控制GM6020电机 上硬件实测好用
RM_EE_Note 1

【零基础学STM32】CubeMX+HAL玩转电机控制相关推荐

  1. 零基础学stm32要多久?stm32应该怎么学?

    STM32由于资料丰富.稳定.性价比高深得广大工程师和企业的喜爱. 现在随便在招聘平台上搜索单片机开发或者嵌入式开发,基本都要求会STM32. 我用STM32也有很多年了,基本上是围绕着F103.F0 ...

  2. 【零基础学STM32】CubeMX+HAL 喂狗小教程

    IWDG&WWDG 内容简介 一点小原理 CubeMX配置 工程代码 出现的问题 参考文献 内容简介 IWDG独立看门狗&WWDG窗口看门狗作为特殊的两类定时器,在检测异常,定期复位有 ...

  3. 【零基础学STM32】CubeMx+HAL配置按键点灯实验

    试验流程 主要内容 cubemx配置 代码部分 1.普通功能 2.模块化设计 1 2 遇到的问题 主要内容 上一篇文章中采用了EXTI中断的方式控制小灯的亮灭.其实也可以不采用中断,直接使用GPIO配 ...

  4. 【零基础学Java】—字符串的概述和特点(十五)

    [零基础学Java]-字符串的概述和特点(十五) 一.字符串的特点 java.lang.String类代表字符串 API当中说:Java程序中的所有字符串字面值(如:"abc")都 ...

  5. 零基础学 Python 有什么建议?

    点击蓝字 关注我们 最近,我经常在后台看到有人问:零基础学 Python 有什么建议?怎么自学 Python?Python 课程推荐?-- 今天,我就来分享一下我的经验总结! Python 目前的应用 ...

  6. 零基础学软件测试有前途吗?

    随着软件工程活动的不断演化,测试工作某种程度上是可以很大幅度提高软件的产品质量以及提升用户的使用满意度,因此软件测试工程师的地位在企业中也越来越受到重视.不少零基础学IT的朋友也开始把软件测试作为一个 ...

  7. 视频教程- 办公三部曲—零基础学WORD教程-Office/WPS

    办公三部曲-零基础学WORD教程 微博认证教育博主,office及设计专业培训讲师.百度.新浪.搜狐.网易等自媒体签约作者 Bob ¥59.00 立即订阅 扫码下载「CSDN程序员学院APP」,100 ...

  8. 学计算机开不了窍,对电脑一窍不通怎么学【零基础学电脑】

    问题:后天考试了,老师说在电脑上考试,可是我从来没玩过电脑怎么办?这说出去得让人笑死,从来没去过网吧,家里也没有电脑,我连电脑基础知识都不知道,怎么办呀? 一.电脑是高科技产品,如果想学硬件制作.软件 ...

  9. UI设计零基础学难吗?

    随着移动互联网时代的发展,带动了UI设计这个专业的发展,很多干了多年平面.电商.网页的设计师.纷纷转UI设计专业,市面上UI设计培训班也雨后春笋一样开始冒出,一些有设计基础的会选择自学,也有一些零基础 ...

最新文章

  1. 测试驱动开发是否是一种强迫症?
  2. 前端技术公众号运营心得记录
  3. python作用域——LEGB规则
  4. 求职,北京,.netGIS
  5. 知名投资机构董事总经理在培训中晕倒后去世,这个培训究竟是什么?
  6. sdram 时钟相位_SDRAM小结 — Windows Live
  7. java tm 2已停止工作_Java(TM) 2 Platform Standard Edition binary 已停止工作
  8. C# 操作Excel(不需要安装Excel),.Net版的 Excel 控件
  9. Spring集成Hprose
  10. 产品经理/总监 面试题及答案
  11. 【哈佛幸福课笔记】【1】
  12. word中全部数字、大小写字母、标点更改为新罗马字体Times News Romans
  13. css 效果之并列排列
  14. pytorch、torch、torchvision介绍
  15. 深入理解Linux 条件变量3:条件变量为什么要配合着锁使用?
  16. Leetcode 45. 跳跃游戏 II
  17. 修复谷歌浏览器翻译功能(win10)
  18. ubuntu 桌面环境出现异常常用的解决方法
  19. git 忽略某些文件
  20. 如何使用电脑将图片进行压缩?图片压缩软件怎么操作?

热门文章

  1. L2-015 互评成绩(Python3)
  2. 至联云解析:为什么说web3.0是IPFS的天下?
  3. ANU-COMP6442 7-12
  4. JAVA使用javaCV完成视频抽帧调用算法和视频合成功能
  5. 使用MATLAB绘制分段函数实现
  6. 开源HTML5拓扑图绘制工具
  7. 085-Java测试题 (2018)
  8. 一个浙大教授让人发冷汗的讲演
  9. 3天学会WebGIS开发——从入门到精通(文章链接汇总)
  10. wireMock伪造请求结果