一、标准库
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、AIN2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA
PWM_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_H
void 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初始化,引脚设为2
GPIO_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; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
//输出比较初始化,设置为通道3
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure); //结构体初始化(结构体参数多)
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //比较模式设置为PWM1
TIM_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引脚2
TIM_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_H
void 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_H
void Motor_Init(void);
void Motor_SetSpeed(int8_t Speed);
#endif