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

主要内容

基于被我鸽了的电控作业
主控 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);
	else
		dAngle=motor->Angle-motor->LastAngle;
	
  • 5
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值