电机驱动-标准库和HAL库

news/2025/1/19 19:43:24/

一、标准库

Motor.c-标准库

#include "stm32f10x.h"                  // Device header
#include "PWM.h"/*** 函    数:直流电机初始化* 参    数:无* 返 回 值:无*/
void Motor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);		//开启GPIOA的时钟GPIO_InitTypeDef GPIO_InitStructure;						//定义GPIO初始化结构体GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;		//使用GPIOA引脚4、5,分别接在电机驱动AIN1、AIN2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);						//初始化GPIOAPWM_Init();		//初始化PWM,需要PWM模块
}/*** 函    数:直流电机调速* 参    数:Speed代表直流电机转速,Speed>0正转,Speed<0反转* 返 回 值:无*/
void Motor_SetSpeed(int8_t Speed)
{if(Speed >= 0)		//正转{//设置电机驱动AIN1、AIN2引脚控制电机转向GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_ResetBits(GPIOA,GPIO_Pin_4);PWM_SetCompare3(Speed);}else				//反转{//设置电机驱动AIN1、AIN2引脚控制电机转向GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare3(Speed);}
}

Motor.h-标准库

#ifndef __MOTOR_H
#define __MOTOR_Hvoid Motor_Init(void);
void Motor_SetSpeed(int8_t Speed);#endif

PWM.c-标准库

#include "stm32f10x.h"                  // Device header/*** 函    数:PWM初始化* 参    数:无* 返 回 值:无*/
void PWM_Init(void)
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);		//开启定时器TIM2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//开启GPIOA时钟//GPIOA初始化,引脚设为2GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//配置TIM2时钟源为内部时钟TIM_InternalClockConfig(TIM2);//TIM2时基初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;	//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//输出比较初始化,设置为通道3TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(&TIM_OCInitStructure);						//结构体初始化(结构体参数多)TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;			//比较模式设置为PWM1TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;	//输出极性设为高(为低则输出高低取反)TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;			//CCR,与ARR一同决定占空比,由于ARR=100,所以占空比为CCR%TIM_OC3Init(TIM2,&TIM_OCInitStructure);		//初始化,设置为通道3,对应GPIOA引脚2TIM_Cmd(TIM2,ENABLE);		//定时器使能,开启定时器TIM2
}/*** 函    数:PWM调节占空比* 参    数:Compare写入需要设定的CCR的值* 返 回 值:无* 注意事项:通过设置CCR调节。并非直接调节*/
void PWM_SetCompare3(uint16_t Compare)
{TIM_SetCompare3(TIM2,Compare);		//修改TIM2的CCR
}

PWM.h-标准库

#ifndef __PWM_H
#define __PWM_Hvoid PWM_Init(void);
void PWM_SetCompare3(uint16_t Compare);#endif

二、HAL库

Motor.c-HAL库

#include "main.h"                  // Device header
#include "Motor.h"
#include "tim.h"
/*** 函    数:直流电机初始化* 参    数:无* 返 回 值:无*/
void Motor_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = Motor_AIN1_Pin|Motor_AIN2_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
}/*** 函    数:直流电机调速* 参    数:Speed代表直流电机转速,Speed>0正转,Speed<0反转* 返 回 值:无*/
void Motor_SetSpeed(int8_t Speed)
{if(Speed >= 0)		//正转{//设置电机驱动AIN1、AIN2引脚控制电机转向HAL_GPIO_WritePin(GPIOA,Motor_AIN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOA,Motor_AIN2_Pin,GPIO_PIN_RESET);__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,Speed);}else				//反转{//设置电机驱动AIN1、AIN2引脚控制电机转向HAL_GPIO_WritePin(GPIOA,Motor_AIN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,Motor_AIN2_Pin,GPIO_PIN_SET);__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,Speed);}
}

Motor.h-HAL库

#ifndef __MOTOR_H
#define __MOTOR_Hvoid Motor_Init(void);
void Motor_SetSpeed(int8_t Speed);#endif


http://www.ppmy.cn/news/1564489.html

相关文章

golang标准库path/filepath使用示例

文章目录 前言一、常用方法示例1.将相对路径转换为绝对路径2.获取路径中最后一个元素3.获取路径中除去最后一个元素的部分4.路径拼接5.将路径拆分为目录和文件名两部分6.返回一个相对路径7.文件路径遍历8.根据文件扩展名过滤文件9.使用正则表达式进行路径匹配 前言 path/filep…

微信消息群发(定时群发)-UI自动化产品(基于.Net平台+C#)

整理 | 小耕家的喵大仙 出品 | CSDN&#xff08;ID&#xff1a;lichao19897314&#xff09; 关联源码及工具下载https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/…

SpringBoot中整合RabbitMQ(测试+部署上线 最完整)

目录 一、RabbitMQ安装 二、启动RabbitMQ 三、编写Java代码 1、引入依赖 2、配置yml 3、配置消息转换器 4、编写接收方接收消息 5、编写发送方发送消息 6、小程序验证 三、宝塔中安装RabbitMQ 1、下载erlang &#xff08;1&#xff09;查看rabbitmq的版本 &#x…

【数据分析与可视化】Python绘制数据地图-GeoPandas地图可视化

本文主要介绍GeoPandas结合matplotlib实现地图的基础可视化。GeoPandas是一个Python开源项目&#xff0c;旨在提供丰富而简单的地理空间数据处理接口。GeoPandas扩展了Pandas的数据类型&#xff0c;并使用matplotlib进行绘图。GeoPandas官方仓库地址为&#xff1a;GeoPandas。G…

Next.js 与 React.js 的对比分析

核心区别的理解React.js 是一个专注于构建 UI 组件的库&#xff0c;它灵活但需要自行搭配其他工具&#xff08;如 React Router&#xff09;才能构建完整的应用。而 Next.js 则是在 React 基础上发展出来的框架&#xff0c;自带服务端渲染&#xff08;SSR&#xff09;、静态站点…

Python基于matplotlib和plottable库绘制精美表格

在Python中&#xff0c;matplotlib 是一个强大的绘图库&#xff0c;但它本身并不直接支持创建精美的表格。然而&#xff0c;你可以使用 matplotlib 的 table 功能来在图表中嵌入表格。此外&#xff0c;plottable 并不是一个广泛认知的与 matplotlib 直接相关的库&#xff08;至…

基于docker微服务日志ELK+Kafka搭建

ELK 是 Elasticsearch 、 Logstash 、 Kibana 的简称 Elasticsearch 是实时全文搜索和分析引擎&#xff0c;提供搜集、分析、存储数据三大功能&#xff1b;是一套开放 REST 和 JAVA API 等结构提供高效搜索功能&#xff0c;可扩展的分布式系统。它构建于 Apache Lucene 搜索引…

在 Windows 上,如果忘记了 MySQL 密码 重置密码

在 Windows 上&#xff0c;如果忘记了 MySQL 密码&#xff0c;可以通过以下方法重置密码&#xff1a; 方法 1&#xff1a;以跳过权限验证模式启动 MySQL 并重置密码 停止 MySQL 服务&#xff1a; 打开 命令提示符 或 PowerShell&#xff0c;输入以下命令停止 MySQL 服务&#…