STM32cubeMX+PWM频率控制(步进电机)+TMC260

一、搭建系统框架,打开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);
    }
}

  • 3
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lao_xu_1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值