一、搭建系统框架,打开stm32cubeMX,创建工程
1)选择外部晶振
2) 按下图配置SPI
3)配置定时器
4)配置时钟
5)勾选图中划线处
6)输入工程名称,工程路径
7)点击生成代码按钮,生成代码,并使用MDK5打开工程文件
二、添加SPI、TIM控制函数
1、配置驱动芯片寄存器
1)SPI读写函数
static uint8_t SPIReadAndWrite(uint8_t dat)
{
uint8_t Rxdata;
HAL_SPI_TransmitReceive(&tmc260spi,&dat,&Rxdata,1, 1000);
return Rxdata;
}
2)TMC260读写函数
static uint32_t TMC260RegWR(uint8_t mId, uint32_t data)
{
uint32_t retData = 0;
uint8_t sendBuff[3] = {0, 0, 0};
uint8_t rcvBuf[3] = {0, 0, 0};
sendBuff[0] = (data>>16)&0xFF;
sendBuff[1] = (data>>8)&0xFF;
sendBuff[2] = data&0xFF;
motor_cs(0);
rcvBuf[0] = SPIReadAndWrite(sendBuff[0]);
rcvBuf[1] = SPIReadAndWrite(sendBuff[1]);
rcvBuf[2] = SPIReadAndWrite(sendBuff[2]);
motor_cs(1);
retData = rcvBuf[0] << 16 | rcvBuf[1] << 8 |rcvBuf[0];
return retData;
}
3)驱动芯片配置函数
void tmc260_init(void)
{
SPIReadAndWrite(0Xff); // 启动传输
ForceSet(); // 电机电流
ChopperConfig(); // 写斩波器
DriverConfig(); // 写驱动配置寄存器
StepDirMStepRes(); // 脉冲和方向微步细分数
SmartEnergyControl(); // 写智能节能控制配置寄存器
}
2、脉冲设置函数
1)定时器配置函数
void My_MX_TIM10_Init(uint8_t Prescaler, uint16_t Period)
{
TIM_OC_InitTypeDef sConfigOC = {0};
htim10.Instance = TIM10;
htim10.Init.Prescaler = Prescaler;
htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
htim10.Init.Period = Period;
htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim10) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim10) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_MspPostInit(&htim10);
}
2)脉冲给定函数,最大频率为500kHz,如需要使用更高频率,需要更改分频系数
void Motor_hz(int32_t hz)
{
uint16_t a = 1000000 / hz;
My_MX_TIM10_Init(168-1, a-1);
HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1);
TIM10->CCR1 = a / 2;
}
3)方向控制函数
void Motor_dir(uint8_t dir)
{
if(dir == 0){
HAL_GPIO_WritePin(MOTOR_DIR_GPIO_Port, MOTOR_DIR_Pin, GPIO_PIN_RESET);
}
else{
HAL_GPIO_WritePin(MOTOR_DIR_GPIO_Port, MOTOR_DIR_Pin, GPIO_PIN_SET);
}
}
3、主函数
1)初始化(已由cubemx配置好)
2)配置电机驱动芯片:tmc260_init();
3)控制电机方向: Motor_dir(0); Motor_dir(1)
4)控制电机转速函数: Motor_hz(10000); //pwm频率10kHz,占空比50%
int main(void)
{
...
tmc260_init();
Motor_dir(0); //设置电机旋转方向
Motor_hz(10000); //设置频率为 10kHz
while(1)
{
HAL_Delay(1000);
}
}