电机驱动-标准库和HAL库

devtools/2025/1/19 6:00:47/

一、标准库

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/devtools/151753.html

相关文章

python学opencv|读取图像(三十四)阈值处理-彩色图像

【1】引言 前序已经掌握了使用阈值处理函数控制灰度图的RGB值&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;三十三&#xff09;阈值处理图像-限定像素-CSDN博客 在更早的学习中&#xff0c;灰度图的RGB只有一个通道&#xff0c;也就是各个像素点…

Unity3D 移动端CPU端性能调优详解

前言 在Unity3D开发中&#xff0c;特别是在移动端&#xff0c;性能优化至关重要。CPU主要负责逻辑运算、物理计算和碰撞检测等核心任务。优化CPU性能不仅能提升游戏的流畅度&#xff0c;还能减少电量消耗和发热问题。本文将详细介绍Unity3D移动端CPU端的性能调优技术&#xff…

CMD批处理命令入门(6)——常用的特殊字符

CMD批处理命令入门&#xff08;6&#xff09;——特殊字符 本章内容主要学习要点&#xff1a;重定向符 >、>>命令管道符 |组合命令 &、&&、||转义字符 ^变量引导符 %界定符 "" 本章内容主要学习要点&#xff1a; >、>>重定向符| 命令…

深入剖析Java垃圾回收机制

深入剖析Java垃圾回收机制 在现代软件开发中&#xff0c;内存管理是一个至关重要的话题。Java作为广泛使用的编程语言&#xff0c;以其自动化的内存管理机制&#xff0c;特别是垃圾回收机制&#xff0c;广受欢迎。然而&#xff0c;许多开发者对垃圾回收的工作原理、不同算法的…

阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化

在直播场景中&#xff0c;阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力&#xff0c;确保直播间高并发时的流畅体验&#xff0c;降低了我们的运营成本&#xff0c;简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力&#xff0c;实现了数…

Golang笔记——常用库sync

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Golang的常用库sync&#xff0c;提供了一系列工具来处理 并发编程 中的同步问题。 文章目录 sync1. sync.Mutex - 互斥锁2. sync.RWMutex - 读写…

MySQL程序之:使用命令选项连接到服务器

本节介绍如何使用命令行选项来指定如何为mysql或mysqldump等客户端建立到MySQL服务器的连接。有关使用类似URI的连接字符串或键值对建立连接的信息&#xff0c;请参阅“使用类似URI的字符串或键值对连接到服务器”。有关无法连接的其他信息&#xff0c;请参阅“解决连接到MySQL…

Spring Boot + MyBatis-Flex 配置 ProxySQL 的完整指南

✅ Spring Boot MyBatis-Flex 配置 ProxySQL 的完整指南 下面是一个详细的教程&#xff0c;指导您如何在 Spring Boot 项目中使用 MyBatis-Flex 配置 ProxySQL 进行 读写分离 和 主从同步 的数据库访问。 &#x1f3af; 目标 在 Spring Boot 中连接 ProxySQL。使用 MyBatis-…