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

2 篇文章 0 订阅
1 篇文章 0 订阅

使用到的各元件:

1、12V电源一个

2、单片机:STM32F103C8T6

3、直流电机4个

4、电机驱动模块:L298N

5、降压模块两个

6:杜邦线若干

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

两边电平001001
电机状态停止正转反转

注意,两边电平不能同时为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个电机控制端。

  • 41
    点赞
  • 381
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
要使用STM32CubeMX进行直流电机控制,您需要执行以下步骤: 1. 打开STM32CubeMX并创建一个新工程,选择您的STM32系列芯片。 2. 在“Pinout”选项卡中配置GPIO引脚,将它们设置为输出模式以控制直流电机。 3. 配置定时器以生成PWM信号,用于驱动电机。在“Clock Configuration”选项卡中启用定时器时钟,并在“Timers”选项卡中配置定时器。 4. 在“Project Manager”选项卡中启用HAL库。 5. 在“Code Generator”选项卡中生成代码,并将其导入到您的IDE中。 6. 在代码中初始化定时器和GPIO引脚,并编写一个简单的控制循环来控制电机。 下面是一个示例代码片段,用于控制直流电机: ```c #include "stm32f4xx_hal.h" TIM_HandleTypeDef htim2; GPIO_InitTypeDef GPIO_InitStruct; void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef sMasterConfig; htim2.Instance = TIM2; htim2.Init.Prescaler = 84-1; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 1000-1; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim2); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500-1; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); } void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm) { GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } int main(void) { HAL_Init(); MX_TIM2_Init(); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); while (1) { for (int i = 0; i < 1000; i++) { TIM2->CCR1 = i; HAL_Delay(10); } } } ``` 这段代码使用TIM2在PA5引脚上生成PWM信号,从而控制电机的转速。在无限循环中,它使用一个简单的控制循环来逐渐增加电机的转速。注意,这只是一个简单的示例,您需要根据您的具体应用场景进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值