PWM的介绍以及应用--------L298N驱动直流电机(三)

        PWM的介绍已经详细讲解过了,就不做过多的介绍,可以去翻看主页关于PWM的介绍.

要想通过单片机直接去驱动电机转到,是实现不了的,因为单片机内部全部是0,1这种数字信号,驱动的电压可以带不动电机的转到,就要使用到电机的驱动芯片,常用的电机驱动芯片有tb6612,l298n,俩款的驱动方式雷同,没有很大的区别,下面详细介绍以l298n为例驱动直流电机调速。

一.如图所示为L298N的结构组成部分

1.12v电压输入,GND供地端,5v我自己认为是输出一个5v的接口但是不是特别确定就不做详细的介绍。

2.使能端,L298N有俩个使能端口,分别是ENA和ENB,用一个跳线帽接在板载5v上面,逻辑输入数字信号0,1就可以在相应得输出端输出信号,因为在只有数字信号0,1所以并不能实现电机的调速,只能实现电机的左右转。调速就把跳线帽拔下来,用一个PWM信号脉冲波接着使能端,也就是ENA或ENB,这样就能通过控制PWM的占空比来实现电机的调速。

3逻辑输入端口,IN1-IN4四个输入口,对应着相应的输出端口,给0,1就能控制电机的正反转

4.输出口,接电机的正反极,不分正负极随便接都行。

二.原理图

三.使用说明

1.直流电机的驱动:

L298N能输出俩路控制俩个电机转动,使能端ENA和ENB高电平有效。

如图所示以ENA举例控制真值表:

 我们需要对电机进行调速,需要设置IN1,IN2确定电机的转动方向,然后拔掉跳线帽接上PWM信号。调整占空比就可以实现电机的调速,注意当使能端信号为0时电机处于停止状态,当使能端为1,逻辑输入全部为0或1的时候电机制动,会阻止电机转动,只有逻辑输入为01或10的时候电机才会正常转动。

四.基于STM32的驱动代码

PWM初始化

void	pwm_int(u16 arr,u16 psc)
{
	 GPIO_InitTypeDef GPIO_InitStructure;                
	 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;       
	 TIM_OCInitTypeDef  TIM_OCInitStructure;               //定义结构体
	
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  //使能定时器2
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA端口

	 GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_0;          //使能PA0引脚
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //IO口的输出速度
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     	//IO引脚模式,复用推挽模式
	 GPIO_Init(GPIOA, &GPIO_InitStructure);              //  初始化GPIOA

    TIM_TimeBaseStructure.TIM_Period = arr;//下一个更新事件载入活动的自动重装载寄存器周期值
    
     TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频值,不分频
     
     TIM_TimeBaseStructure.TIM_ClockDivision = 0;  //设置时钟分割
     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式

     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);// 初始化时钟基数单位
   

	 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   //脉宽调制模式2
 	 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;       // 输出极性为高
     
     TIM_OCInitStructure.TIM_OutputState=	TIM_OutputState_Enable;   //比较输出使能

     TIM_OC1Init(TIM2, &TIM_OCInitStructure);  // 初始化TIM2定时器
    

     TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);	    //使能预装载寄存器
	
	 TIM_ARRPreloadConfig(TIM2, ENABLE);      //使能自动装载允许位

	 TIM_Cmd(TIM2, ENABLE);   //使能定时器

}

电机初始化

void Gpio_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;            //结构体	
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口 
  GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_5| GPIO_Pin_9;	  //PB5 PB9
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     	/推挽输出  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //输出速度
  GPIO_Init(GPIOB, &GPIO_InitStructure);          //初始化GPIOB 
	
}

主函数

 int main(void)
 {	
   SystemInit(); //系统时钟
	 delay_init();    //延时函数初始化
   motro_Init();    //电机初始化
   pwm_int(7199,0);      //PWM初始化
	
  while(1)
	{
	 GPIO_SetBits(GPIOB, GPIO_Pin_7);	 // 低电平
	 GPIO_ResetBits(GPIOB, GPIO_Pin_9);	 // 高电平
	 TIM_SetCompare1(TIM4,7000);   //PWM占空比
	}
 }

如有不对请指出。

驱动俩路电机介绍:L298N驱动俩路电机按键控制正反转_m0_63171897的博客-CSDN博客

完整工程代码:STM32,L298N驱动模块驱动直流电机调速-单片机文档类资源-CSDN文库

猜你喜欢

转载自blog.csdn.net/m0_63171897/article/details/127295609