当前位置:   article > 正文

L298N双路电机驱动模块使用指南

l298n

哦吼,这个模块上手很快!!!

L298N,是一款接受高电压的电机驱动器,直流电机和步进电机都可以驱动。一片驱动芯片可同时控制两个直流减速电机做不同动作,在6V到46V的电压范围内,提供2安培的电流,并且具有过热自断和反馈检测功能,可对电机进行直接控制,通过主控芯片的I/O输入对其控制电平进行设定,就可为电机进行正转反转驱动,操作简单、稳定性好,可以满足直流电机的大电流驱动条件。

L298N 电机驱动板引脚 

代码如下:(无脑转动

  1. #include "stm32f10x.h"
  2. uint16_t NUM;
  3. int main (void)
  4. {
  5. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10. GPIO_Init(GPIOC,&GPIO_InitStructure);
  11. GPIO_SetBits(GPIOC,GPIO_Pin_6);
  12. GPIO_SetBits(GPIOC,GPIO_Pin_7);
  13. while(1)
  14. {
  15. GPIO_ResetBits(GPIOC,GPIO_Pin_6);
  16. }
  17. }

PWM调速实现
这里就不再是把ENA、ENB再接上高电平了,这个时候就要把跳线帽拔掉了,在通过定时器来控制实现PWM调速,具体先上代码:

  1. #include "timer.h"
  2.  
  3.  
  4. #define Ina PGout(2)
  5. #define Inb PGout(3)
  6. #define Inc PGout(4)
  7. #define Ind PGout(5)
  8.  
  9. void TIM3_PWM_Init(u16 arr,u16 psc)
  10. {  
  11.     GPIO_InitTypeDef GPIO_InitStructure;
  12.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  13.     TIM_OCInitTypeDef  TIM_OCInitStructure;
  14.  
  15.     
  16.  
  17.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    
  18.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE); 
  19.     
  20.  
  21.  
  22.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //
  23.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  24.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.     GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道2
  26.     
  27.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //
  28.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //
  29.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.     GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道1
  31.     
  32.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;            
  33.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  34.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
  35.     GPIO_Init(GPIOG, &GPIO_InitStructure);                     
  36.     GPIO_ResetBits(GPIOG,GPIO_Pin_2);                    
  37.     
  38.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  39.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
  40.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         
  41.     GPIO_Init(GPIOG, &GPIO_InitStructure);                
  42.     GPIO_ResetBits(GPIOG,GPIO_Pin_3);                        
  43.     
  44.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                 
  45.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  46.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         
  47.     GPIO_Init(GPIOG, &GPIO_InitStructure);                     
  48.     GPIO_ResetBits(GPIOG,GPIO_Pin_4);                        
  49.     
  50.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                
  51.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  52.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         
  53.     GPIO_Init(GPIOG, &GPIO_InitStructure);                     
  54.     GPIO_ResetBits(GPIOG,GPIO_Pin_5);                        
  55.  
  56.     TIM_TimeBaseStructure.TIM_Period = arr; 
  57.     TIM_TimeBaseStructure.TIM_Prescaler =psc; 
  58.     TIM_TimeBaseStructure.TIM_ClockDivision = 0
  59.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  60.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  61.     
  62.     
  63.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2
  64.      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
  65.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
  66.     TIM_OC2Init(TIM3, &TIM_OCInitStructure);  
  67.  
  68.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2
  69.      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
  70.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
  71.     TIM_OC1Init(TIM3, &TIM_OCInitStructure);  
  72.  
  73.  
  74.     TIM_Cmd(TIM3, ENABLE);  
  75.  
  76. }

上面这段代码主要是定时器TIM3的初始化以及四个输入端的初始化,至于那个预分配系数psc和自动重装值arr可以自己设定,这里我设定的是arr=450,psc=7199

然后把PA6,PA7分别连接到ENA和ENB上,设置好arr和psc,最后通过TIM_SetComparex函数设置占空比即可实现PWM调速功能

整体关键代码
剩下一下重要代码如下:

  1. void qianjin(void)
  2. {
  3.     TIM_SetCompare2(TIM3,100);//设置通道2的占空比实现PWM调速,这里是100,在0~450间,越小速度越快
  4.     TIM_SetCompare1(TIM3,100);//设置通道1的占空比实现PWM调速
  5.     Ina=1;
  6.     Inb=0;
  7.     Inc=1;
  8.     Ind=0;
  9. }
  10. void houtui(void)
  11. {
  12.     TIM_SetCompare2(TIM3,100);
  13.     TIM_SetCompare1(TIM3,100);
  14.     Ina=0;
  15.     Inb=1;
  16.     Inc=0;
  17.     Ind=1;
  18. }
  19. void zuozhuan(void)
  20. {
  21.     TIM_SetCompare2(TIM3,100);
  22.     TIM_SetCompare1(TIM3,100);
  23.     Ina=0;
  24.     Inb=0;
  25.     Inc=1;
  26.     Ind=0;
  27. }
  28. void youzhuan(void)
  29. {
  30.     TIM_SetCompare2(TIM3,100);
  31.     TIM_SetCompare1(TIM3,100);
  32.     Ina=1;
  33.     Inb=0;
  34.     Inc=0;
  35.     Ind=0;
  36. }
  37. void stop(void)
  38. {
  39.     TIM_SetCompare2(TIM3,100);
  40.     TIM_SetCompare1(TIM3,100);
  41.     Ina=0;
  42.     Inb=0;
  43.     Inc=0;
  44.     Ind=0;
  45. }


主函数:

  1. int main(void)
  2.  {    
  3.     vu8 key=0;
  4.      
  5.     delay_init();        //      
  6.     LED_Init();              //
  7.     KEY_Init(); //
  8.     TIM3_PWM_Init(450,7199);
  9.     while(1)
  10.     {
  11.        key=KEY_Scan(0);    //通过按键简单实现
  12.            if(key)
  13.         {                           
  14.             switch(key)
  15.             {                 
  16.                 case WKUP_PRES:    
  17.                      LED0=0;
  18.                      qianjin();
  19.                      break; 
  20.                 case KEY1_PRES:    // 
  21.                      qianjin();
  22.                      delay_ms(5000);
  23.                      delay_ms(5000);
  24.                      delay_ms(5000);
  25.                      houtui();
  26.                      delay_ms(5000);
  27.                      delay_ms(5000);
  28.                      delay_ms(5000);
  29.                      break;
  30.                 case KEY0_PRES:    
  31.                      LED0=1;
  32.                      stop();
  33.                      break;
  34.             }
  35.         }
  36.         else delay_ms(10); 
  37.         
  38.         
  39.     }
  40. }

常见问题
1.电机不会转动?
(1)有响声但是齿轮不转,可能是电压不够,加大电压
(2)接线存在错误,没有与MCU共地等
(3)逻辑端编程错误,没有正确的使能
2.关于ENA和ENB上面的跳线帽要不要拔去?
这取决于你的程序是怎么输出PWM波的,如果是通过ENA来接收PWM控制的,跳线帽就要拔了,接自己的I/O输出。如果是通过IN1和IN2来控制的则不用拔。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/695001
推荐阅读
相关标签
  

闽ICP备14008679号