一、42电机
- 型号:ZD-M42P
- 引脚配置
电机 MCU V+ 24V / GND GND / com 3.3V/5V 3.3V DIR 方向选择 PC9 STR PWM波 PA8 EN 使能 PC8
二、定时器
TIM1,cubeMX配置
调试了很久,ch1都没有输出,查阅了很多资料发现都没有使用TIM1,换了TIM3后发现是可以正常输出的。后来发现是因为时钟源Slave Mode里的外部时钟源,换成Clock Source的Internal Clock后,正常输出。
TIM13,cubeMX配置
PWM输出就是通过定时器通道对外输出脉宽(即占空比)可调的方波信号,信号频率由定时器自动重装寄存器 ARR 的值决定,占空比由定时器比较寄存器 CCR 的值决定。ARR及参数配置中的100,Prescaler的值为分频系数,定时器13的时钟总线为84M,分频后频率为10kHz。CRR寄存器的值及参数配置中的Pulse值。
f
r
e
q
=
系统时钟
(
P
r
e
s
c
a
l
e
r
+
1
)
∗
(
P
e
r
i
o
d
+
1
)
freq = \frac{系统时钟}{{(Prescaler+1)}*{(Period + 1)}}
freq=(Prescaler+1)∗(Period+1)系统时钟
三、代码
1、头文件
#include "user_gpio.h"
void Motor_Enable(uint8_t pwmDutyCycle)
{
//TIM_OC_InitTypeDef config;
//HAL_TIM_PWM_ConfigChannel();
//设置占空比
uint32_t period = htim1.Init.Period + 1;
uint32_t compare = (period * pwmDutyCycle) / 100;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, compare);
HAL_GPIO_WritePin(Motor_EN_GPIO_Port, Motor_EN_Pin, SET);
HAL_GPIO_WritePin(Motor_DIR_GPIO_Port, Motor_DIR_Pin, SET);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}
void Motor_Disable()
{
HAL_GPIO_WritePin(Motor_EN_GPIO_Port, Motor_EN_Pin, RESET);
HAL_GPIO_WritePin(Motor_DIR_GPIO_Port, Motor_DIR_Pin, RESET);
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
HAL_TIM_Base_Stop_IT(&htim1);
}
2、源文件
#ifndef INC_USER_GPIO_H_
#define INC_USER_GPIO_H_
#include "user_uart.h"
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim13;
void Motor_Enable(uint8_t pwmDutyCycle);
void Motor_Disable();
#endif /* INC_USER_GPIO_H_ */