stm32cubemx hal学习记录:电机控制

news2024/11/19 1:32:23

一、基础配置

1、配置RCC、SYS,SYS的Timebase Source选择TIM6

2、配置USART1、时钟84MHz

3、激活FreeRTOS,选择CMSIS_V1,Config parameters种USE_TIMERS选择ENABLE

二、编码器及电机驱动引脚配置

1、选用TIM3的编码器模式

 2、驱动使用L298N,将PB6、PB7设置为输出模式

 3、使用TIM2的CH1输出1kHz的PWM

 三、FreeRTOS配置

1、设置两个软件定时器,一个用于总控制,一个用于编码器读取数值,也可以用硬件定时器

 2、设置一个队列,用于编码器数值传输

 四、代码编写

硬件测试及传感器数据读取

在gpio.c中添加以下代码,完成电机限幅与方向控制

void Motor_Limit(int *speed)
{
	if(*speed>=100)
		*speed=100;
	if(*speed<=-100)
		*speed=-100;
}

uint8_t motor_dir;
void Motor_control(int speed)
{
	if(speed>=0)
	{
		motor_dir=1;
		Motor_Limit(&speed);
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,speed);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
	}
	else
	{
		motor_dir=0;
		Motor_Limit(&speed);
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,-speed);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);		
	}
}

在main.c中初始化TIM2,发出PWM波形

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);

添加以下函数测试电机是否旋转,若电机旋转证明无错误,完成编码器测试后删掉

Motor_control(80);

添加编码器初始化代码

HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_ALL);

在main中测试编码器是否正常,若正常将函数删掉。

enc=__HAL_TIM_GET_COUNTER(&htim3);

在freertos.c中的StartDefaultTask函数中添加代码,启动软件定时器,总控制周期设置10ms,编码器读取设置10ms

	osTimerStart(timer_controlHandle,10);
	osTimerStart(timer_encoderHandle,10);

编写编码器速度读取函数,debug后将enc放入函数内部

int32_t enc;
/* encoder_Callback function */
void encoder_Callback(void const * argument)
{
  /* USER CODE BEGIN encoder_Callback */
	enc=__HAL_TIM_GET_COUNTER(&htim3);
	__HAL_TIM_SET_COUNTER(&htim3,0);
  /* USER CODE END encoder_Callback */
}

此时发现反方向旋转时读出来的数据非常的大,且不是复数,此时更改代码,手动补偿

int32_t enc;
extern uint8_t motor_dir;
/* encoder_Callback function */
void encoder_Callback(void const * argument)
{
  /* USER CODE BEGIN encoder_Callback */
	if(motor_dir==1)
		enc=__HAL_TIM_GET_COUNTER(&htim3);
	else
		enc=-65535+__HAL_TIM_GET_COUNTER(&htim3);
	
	__HAL_TIM_SET_COUNTER(&htim3,0);
  /* USER CODE END encoder_Callback */
}

此时完成开环控制

增加pid.c与pid.h文件,完成闭环调参

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

以数据赋能业务,qlik为企业搭建透明绩效管理平台

自从各类金融APP出现以来&#xff0c;分支机构网络的性质已经发生了巨大的变化。下一代分支机构通常是围绕着深化客户关系的愿景建立起来的&#xff0c;这些愿景包括理财方面的建议&#xff0c;以及企业和家庭贷款等更大的承诺&#xff0c;同时提供现金和交易设施。由于分支机构…

2022-12-23 工作记录--CSS-超出多行显示省略号ios真机偶失效问题

CSS-超出多行显示省略号ios真机偶失效问题 一、前言 最近帮同事解决一个了bug&#xff1a;在ios真机上&#xff0c;超出多行显示省略号的文本内容&#xff0c;偶然会出现未显示问题。 最开始&#xff0c;我没往 超出多行显示省略号 样式方面进攻&#xff0c;还以为是react渲染…

离散数学图论的练习题详解

文章目录学习技巧图论练习学习技巧 坚持 图论练习 一颗树有2个2度结点&#xff0c;1个3度结点和3个4度结点&#xff0c;则1度结点数为&#xff08;&#xff09; 知识点&#xff1a;握手定理&#xff1a;所有节点度数之和等于边数的两倍解答&#xff1a;221334x2(213x−1)2\…

亚马逊首次亮相中性原子量子计算机Aquila

Aquila处理器内饰&#xff08;图片来源&#xff1a;网络&#xff09; 亚马逊网络服务&#xff08;AWS&#xff09;将在其名为Amazon Braket的特殊云服务器中托管量子计算机Aquila。这是量子计算第一次可以直接从AWS云端访问中性原子量子处理器。 而提供这台量子计算机的公司是Q…

数字化时代,看商业智能BI与业务发展分析

每一家企业我们都可以从模式、问题和求解这三个角度对企业的业务经营管理进行探讨&#xff0c;比如模式&#xff0c;公司目前的管理模式和运营模式效果如何&#xff0c;是否符合公司长期战略目标或中短期业绩增长目标&#xff1f; 数据分析 - 派可数据商业智能BI可视化分析平台…

12项数据安全国标全文来了

二十大报告是新时代党和国家事业发展的理论指南和行动纲领&#xff0c;报告强调&#xff0c;“强化经济、重大基础设施、金融、网络、数据、生物、资源、核、太空、海洋等安全保障体系建设”、“加强个人信息保护”等。“数据安全”与“个人信息保护”被提到前所未有的高度&…

说话人识别的数据需求

概述 机器学习领域名言“Garbage In, Garbage Out!”不论神经网络多么先进&#xff0c;如果输入是垃圾&#xff0c;那么输出也一定是垃圾在说话人识别领域&#xff0c;所需的最小数据单元&#xff0c;包括&#xff1a; 一段只包含单一说话人语音的音频&#xff0c;被称为Utter…

RocketMQ

q RocketMQ 1. RocketMQ简介 官网&#xff1a; http://rocketmq.apache.org/ RocketMQ是阿里巴巴2016年MQ中间件&#xff0c;使用Java语言开发&#xff0c;RocketMQ 是一款开源的分布式消息系统 &#xff0c;基于高可用分布式集群技术&#xff0c;提供低延时的、高可靠的消息…

如何通过链路追踪进行定时任务诊

背景简介 什么是定时任务 定时任务是业务应用系统中存在定时周期性运行的业务逻辑。由于其运行于后端进程中往往存在执行状态和执行链路的不可见性《常见定时任务技术方案》。 什么是链路追踪 随着分布式微服务化架构在企业中大规模运用&#xff0c;业务运行的应用平台是一…

基于GINA/凭证提供程序的自助密码管理

大多数组织依赖于密码自助管理工具来跟踪用户的密码相关日常 事务。但是&#xff0c;另一方面&#xff0c;大多数自助解决方案只能从web浏览器进行访问。因此&#xff0c;已锁定的用户被迫从同事的工作站或用web浏览器从自助服务终端重置其密码。这与自助密码管理的意图背道而驰…

两级电力市场环境下计及风险的省间交易商最优购电模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【小程序】声明式和编程式导航传参

目录 声明式导航 1. 导航到 tabBar 页面 2. 导航到非 tabBar 页面 3. 后退导航 编程式导航 1. 导航到 tabBar 页面 ​编辑 2. 导航到非 tabBar 页面 3. 后退导航 ​编辑 导航传参 1. 声明式导航传参 2. 编程式导航传参 ​编辑 3. 在 onLoad 中接收导航参数 声明式…

pandas对于文件数据基本操作,数据处理常用

基本操作 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple &#xff08;安装包&#xff09; 清华安装 例如 pip3 install --index-url https://pypi.douban.com/simple pandas国内的其他镜像源 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云 http://m…

作为程序员的你,常用的软件有哪些?

作为一个合格程序员的你&#xff0c;必须要有一套用起来得心应手的软件工具&#xff0c;有了好的工具才能够让自己的工作效率达到事半功倍的效果。下面我以常见的编程开发软件和数据库管理软件为例&#xff0c;简单介绍几种&#xff0c;感兴趣的朋友可以尝试一下&#xff1a;一…

并发编程学习(六):park、unpark

1、 park、unpark介绍 park、unpark它们是LockSupport类中的方法&#xff0c;内部调用的是Unsafe类中的native方法。 // 暂停当前线程&#xff0c;暂停后&#xff0c;线程状态变为 WAITING LockSupport.park(); // 恢复某个线程的运行&#xff0c;恢复后线程状态变为RUNNING Lo…

炸弹(二分图最大匹配 = 二分图最小顶点覆盖)

D-炸弹_2022图论班第一章图匹配例题与习题 (nowcoder.com) 看题解前先理解二分图最小点集覆盖 最大匹配 一、什么是最小点覆盖 点覆盖的概念定义&#xff1a; 对于图G(V,E)中的一个点覆盖是一个集合S⊆V使得每一条边至少有一个端点在S中。 最小点覆盖&#xff1a;点个数最少的…

《编译原理》实验一:熟悉实验环境VSCode并完成正则表达式转换为NFA

目录 实验一 熟悉实验环境VSCode并完成正则表达式转换为NFA 一、实验目的 二、预备知识 三、实验内容 VSCode的基本使用方法 安装和启动VSCode VSCode的窗口布局 使用VSCode将项目克隆到本地磁盘 使用VSCode登录平台 查看项目中的文件 实验源代码 演示程序的执行过程 四、实验过…

LeetCode Hot 100~Day2

目录 三数之和 电话号码的字母组合 括号生成 合并k个升序链表 下一个排列 搜索旋转排序数组 在排序数组中查找元素的第一个和最后一个位置 组合总数 全排列 旋转图像 三数之和 题目链接&#xff1a;15.三数之和 示例 输入&#xff1a;nums [-1,0,1,2,-1,-4] 输…

金山云将于12月30日在港交所上市:不发行新股,王育林已辞职

12月23日&#xff0c;金山云&#xff08;NASDAQ:KC&#xff0c;HK:03896&#xff09;发布公告称&#xff0c;拟通过介绍方式在港交所主板上市&#xff0c;代码为“03896”。按照计划&#xff0c;金山云将于2022年12月30日正式登陆港交所&#xff0c;不发行新股融资。 据贝多财…

我写这10+个JavaScript单行代码,被组长夸代码写得优雅!

大厂面试题分享 面试题库 前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 JavaScript 非常大的特点容易上手且非常灵活&#xff0c;代码实现方式五花八门&#xff1b;有时候能一行代码解决&#xff0c;就尽量不用…