(学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)

使用到的各元件:

1、12V电源一个

2、单片机:STM32F103C8T6

3、直流电机4个

4、电机驱动模块:L298N

5、降压模块两个

6:杜邦线若干

对于直流电机的转动控制如下表

两边电平 00 10 01
电机状态 停止 正转 反转

注意,两边电平不能同时为1。

显然,转动控制是非常简单的,关键在于怎么控制电机的转速,这就需要使用PWM波来进行控制

PWM波

(学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)_第1张图片

  • 在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
  • 当CNT小于CCRx时,TIMx_CHx通道输出低电平;
  • 当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。
  • 在一个周期内:
    • 定时器从0开始向上计数
    • 0-t1段:定时器计数器TIMx_CNT值小于CCRx值,输出低电平
    • t1-t2段:定时器计数器TIMx_CNT值大于CCRx值,输出高电平
    • 当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程
    • 一个PWM周期完成

TIMx_ARR寄存器确定PWM频率,TIMx_CCRx寄存器确定占空比

PWM的频率计算方法如下:

Fpwm =Tclk / ((arr+1)*(psc+1))

        单位:HZ

        arr :计数器值

        psc :预分频值

PWM占空比及其计算方法:

        概念:高电平占总时间长度

        公式:duty circle = TIM3->CCR1 / arr

        配置理念:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。 而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。 如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)。

简而言之:修改CCR1可以修改占空比,修改arr可以修改频率

        

接下来介绍通过CubeMX实现PWM波输出的方法:

由于需要双路输出,设定PB8,PA10分别通过TIM4-CH3,TIM1-CH3进行PWM输出

同时PA4,5,6,7输出来控制电机转动

(学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)_第2张图片

开启RCC的HSE

(学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)_第3张图片

调节TIM1,4,开启响应通道的PWM产生,PSC设置为84-1,ARR设置为1000-1

 (学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)_第4张图片

开启TIM2,3中断,并在中断中调整下自己需要的优先级

(学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)_第5张图片

时钟勾选HSE,改到最大

(学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)_第6张图片

Project Manager中该勾的勾,没什么好说的,生成函数

生成函数之后在while前开中断、开PWM

HAL_TIM_Base_Start_IT(&htim2);//开启TIM2定时器中断
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);//开启PWM波
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);//开启PWM波

主函数前中断回调函数调整占空比

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//回调函数
{
	if(htim==&htim2)
	{
		__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,CRR);//(修改CCR值,改变占空比)
	}
	if(htim==&htim3)
	{
		__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,CRR);//(修改CCR值,改变占空比)                                                                                        
	}
}

main函数中调整电平控制电机转动

		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET); 
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);

PWM波就写好了,只要改变CRR,就可以改变占空比来实现电机调速。

L298N的接口

(学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)_第7张图片

通道A和通道B跳线帽拔掉,靠下端的接口接PWM输入,输出A,B分别接两个电机的正负极。

逻辑输入接4个电机控制端。

你可能感兴趣的:(HAL库,PWM,CubeMX,stm32,单片机,嵌入式硬件)