《使用CubeMX HAL库控制STM32的PWM调节直流电机转速》

使用到的各元件:

1、12V电源一个

2、单片机:STM32F103C8T6

3、直流电机4个

4、电机驱动模块:L298N

5、降压模块两个

6:杜邦线若干

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

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

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

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

PWM波

  • 在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输出来控制电机转动

    开启RCC的HSE

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

     

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

    时钟勾选HSE,改到最大

    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的接口

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

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 《使用CubeMX HAL库控制STM32的PWM调节直流电机转速》

    发表评论