请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32f1之L298N电机驱动+PWM调速

[复制链接]
STMCU小助手 发布时间:2022-5-14 20:41
一、L298N电机驱动主要介绍
主要I/O口

使能端ENA和ENB,控制输入端INA、INB、INC、IND,马达输出口OUT1、OUT2、OUT3、OUT4,5V输出(可以不接),还有一个板载5V电压,具体如下图所示:

2L_$AX`QM3WZL$C~O@O3`KA.png

二、控制实现功能
对于L298N模块,直接给12V输入,接上地,就可以给整个模块供电了,之后就是通过控制单片机(这里用的是STM32f1)给4个输入端(INA、INB、INC、IND)控制输入高低电平了

注意:ENA和ENB一般情况下会有两个跳线帽连着,这是直接连上高电平,只有给高电平,这才能让四个输入端(INA、INB、INC、IND)口去控制四个输出(OUT1、OUT2、OUT3、OUT4)进而直流电机状态。特别注意GND是电源和单片机一起共地!

下面为真值表:

_IZRG{XIF1`$$NAXLN[8FUI.png


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

  1. #include "timer.h"


  2. #define Ina PGout(2)
  3. #define Inb PGout(3)
  4. #define Inc PGout(4)
  5. #define Ind PGout(5)

  6. void TIM3_PWM_Init(u16 arr,u16 psc)
  7. {  
  8.         GPIO_InitTypeDef GPIO_InitStructure;
  9.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  10.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  11.         

  12.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        
  13.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
  14.         


  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道2
  19.         
  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23.         GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道1
  24.         
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                        
  26.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
  27.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
  28.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         
  29.         GPIO_ResetBits(GPIOG,GPIO_Pin_2);                                       
  30.         
  31.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  32.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                 
  33.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  34.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                
  35.         GPIO_ResetBits(GPIOG,GPIO_Pin_3);                                                
  36.         
  37.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                 
  38.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
  39.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  40.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         
  41.         GPIO_ResetBits(GPIOG,GPIO_Pin_4);                                                
  42.         
  43.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                
  44.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
  45.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  46.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                         
  47.         GPIO_ResetBits(GPIOG,GPIO_Pin_5);                                                

  48.         TIM_TimeBaseStructure.TIM_Period = arr;
  49.         TIM_TimeBaseStructure.TIM_Prescaler =psc;
  50.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  51.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  52.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  53.         
  54.         
  55.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  56.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  57.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  58.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  

  59.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  60.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  61.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  62.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  


  63.         TIM_Cmd(TIM3, ENABLE);  

  64. }
复制代码

上面这段代码主要是定时器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. }
复制代码

以上是简单的代码实现,大家可以根据自己实际情况调整修改

下面是实物连接图:

~3O~2TCPP3P48296G556`(2.png

这里用另一个L298N来连接,原理一样的,我另外那个红色版的螺丝不好拧,就暂且用这个,这里我用这个电机驱动4个马达,特别注意单片机和电机上的GND是连在一起的!

那个连接单片机的图片就不发了,具体按上述代码操作,不明白的地方可以留言或者哪里写的不对欢迎指正,谢谢!


收藏 评论0 发布时间:2022-5-14 20:41

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版