电机pwm调速
1.使用hal库控制电机调速
PWM概述:
PWM俗称脉冲调制 脉冲宽度调制模式可以生成一个信号,该信号频率由 TIMx_ARR 寄存器值决定,其占空比则由 TIMx_CCRx 寄存器值决定。
1.电机pwm cube配置教程
首先确认pwm使用的定时器是哪个用的是哪个通道
我们在程序按照底盘控制引脚说明配置stm32cubemx
1.打开stm32cubemx软件,pwm是通过定时器控制
根据slamugv引脚分配,TIM5 CH3 使能为PWM CH3
预分频和时钟计数这个东西,下面在讨论,我们随便设置吧
然后代码生成
3. 寄存器讲解
通用定时器框图
计数器寄存器(TIMx_CNT):
预分频寄存器(TIMx_PSC):
自动重装载寄存器(TIMx_ARR):
void PWM_GPIO_init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启GPIOE时钟
__HAL_RCC_TIM5_CLK_ENABLE(); //使能定时器3
__HAL_RCC_TIM9_CLK_ENABLE(); //使能定时器9
GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate = GPIO_AF2_TIM3 ; //定时器复用
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6; //
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate = GPIO_AF3_TIM9 ; //定时器复用
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
}
//通用定时器5,9中断初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器5,9(定时器3挂在APB1上,时钟为HCLK/2)
void Bsp_motor_pwm_init(u16 arr,u16 psc)
{
PWM_GPIO_init();
TIM_HandleTypeDef TIM5_Handler; //定时器3句柄
TIM_HandleTypeDef TIM9_Handler; //定时器9句柄
TIM_OC_InitTypeDef TIM5_CH1Handler ;
TIM_OC_InitTypeDef TIM9_CH1Handler ;
TIM_MasterConfigTypeDef sMasterConfig;
TIM5_Handler.Instance=TIM5; //定时器5
TIM5_Handler.Init.Prescaler=psc; //定时器分频
TIM5_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
TIM5_Handler.Init.Period=arr; //自动重装载值
TIM5_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM5_Handler); //初始化PWM
TIM5_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM5_CH1Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
TIM5_CH1Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
HAL_TIM_PWM_ConfigChannel(&TIM5_Handler,&TIM5_CH1Handler,TIM_CHANNEL_3);//配置TIM5通道3
HAL_TIM_PWM_ConfigChannel(&TIM5_Handler,&TIM5_CH1Handler,TIM_CHANNEL_4);//配置TIM5通道4
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&TIM5_Handler, &sMasterConfig);
HAL_TIM_PWM_Start(&TIM5_Handler,TIM_CHANNEL_3);//开启PWM通道3
HAL_TIM_PWM_Start(&TIM5_Handler,TIM_CHANNEL_4);//开启PWM通道4
TIM9_Handler.Instance=TIM9; //定时器9
TIM9_Handler.Init.Prescaler=psc; //定时器分频
TIM9_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
TIM9_Handler.Init.Period=arr; //自动重装载值
TIM9_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM9_Handler); //初始化PWM
TIM9_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM9_CH1Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
TIM9_CH1Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
HAL_TIM_PWM_ConfigChannel(&TIM9_Handler,&TIM9_CH1Handler,TIM_CHANNEL_1);
//配置TIM9通道1
HAL_TIM_PWM_ConfigChannel(&TIM9_Handler,&TIM9_CH1Handler,TIM_CHANNEL_2);
//配置TIM9通道2
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&TIM9_Handler, &sMasterConfig);
HAL_TIM_PWM_Start(&TIM9_Handler,TIM_CHANNEL_1);//开启PWM通道1
HAL_TIM_PWM_Start(&TIM9_Handler,TIM_CHANNEL_2);//开启PWM通道1
}
Bsp_motor_pwm_init(500-1,84-1) ; //电机PWM端口使能并设置预分频系数和自动重装载系数
/**********
调节pwm
输入:占空比的大小
**********/
void TIM_SetTIM5Compare3(u32 compare1)
{
TIM5->CCR3=compare1;
}
void TIM_SetTIM5Compare4(u32 compare2)
{
TIM5->CCR4=compare2;
}
void TIM_SetTIM9Compare1(u32 compare3)
{
TIM9->CCR1=compare3;
}
void TIM_SetTIM9Compare2(u32 compare4)
{
TIM9->CCR2=compare4;
}
这里方便代码的使用,对pwm调用的函数进行了小小的封装
/**********
对电机pwm输出函数进行封装
ID: a 电机序号
功能:b 用来控制电机的运动速度
**********/
void MotorPwm(int a, int b)
{
if ( a == 1)
{
TIM_SetTIM5Compare3(b);
}
if ( a == 2)
{
TIM_SetTIM5Compare4(b);
}
if ( a == 3)
{
TIM_SetTIM9Compare1(b);
}
if ( a == 4)
{
TIM_SetTIM9Compare2(b);
}
}