使用到的各元件:
1、12V电源一个
2、单片机:STM32F103C8T6
3、直流电机4个
4、电机驱动模块:L298N
5、降压模块两个
6:杜邦线若干
对于直流电机的转动控制如下表
两边电平 | 00 | 10 | 01 |
电机状态 | 停止 | 正转 | 反转 |
注意,两边电平不能同时为1。
显然,转动控制是非常简单的,关键在于怎么控制电机的转速,这就需要使用PWM波来进行控制
PWM波
TIMx_ARR寄存器确定PWM频率,TIMx_CCRx寄存器确定占空比
PWM的频率计算方法如下:
单位:HZ
arr :计数器值
psc :预分频值
PWM占空比及其计算方法:
概念:高电平占总时间长度
公式:
配置理念:若配置脉冲计数器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个电机控制端。