标题: L298N电机驱动模块的单片机驱动程序 [打印本页]

作者: 指尖螺    时间: 2020-5-7 16:51
标题: L298N电机驱动模块的单片机驱动程序
  玩小车最重要的是什么? 电机。这个就不用多解释了。 从今天早上开始到现在 总算是知道点皮毛了。 因为有学长做过这东西, 所以做起来也有大概的方向  知道是要搞哪些东西。 现在主要是L298N电机驱动和PWM脉冲控制。  
什么是L298N电机驱动? 什么是PWM脉冲?
一开始我一无所知, 实验室里面有L298N驱动 但是我只知道它是L298N驱动, 对于怎么使用却是一点也不知道。 在网上找教程, 那个宝上找资料; 挣扎了一个上午总算是知道了L298N驱动怎么使用, 相应I/O口的含义以及用途。。
那什么是PWM呢? PWM是脉冲宽度调制, 在电机方面主要是通过改变占空比来改变电机的转速, 从而实现加速、减速、转弯等基本功能。 什么是占空比? 占空比指的是一个周期内, 高电平占这个周期的比例。  占空比越高,
电压输出就越高, 电机转动的就越快。
在飞思卡尔、stm32 等芯片中有专门的模块用来控制PWM, 但是在51单片机中则没有, 所以需要用到内部的定时器来实现, 相对来说比较麻烦。 关于51单片机输出PWM波可以参考一下这篇文章:如果利用51单片机输出PWM波。
我感觉这个网站对现在我也挺好的。

程序一: 通过P2^0和P2^1口来控制电机的转动, 通过按键来控制电机转动的快慢

单片机源程序如下:
  1. #include <reg52.h>

  2. typedef unsigned int u16;

  3. typedef unsigned char u8;

  4. sbit PWM1 = P2^0;        

  5. sbitPWM2 = P2^1;

  6. sbit key_add = P3^2;

  7. sbit key_less = P3^3;

  8. u16count = 50, time;

  9. void init0(){ TMOD= 0x01;        // 方式一

  10. TH0 = (65536 - 10)/256;        // 赋初值

  11. TL0 = (65536 - 10)%256;      

  12. TR0 = 1;      // 开启定时器0      

  13. EA = 1;           // 开启总中断

  14. ET0 = 1;      // 定时器0允许中断}

  15. void delayms(u16 z)   // 延迟函数

  16. {     u16i, j; for (i = z; i > 0; i--)   

  17.        for(j = 110; j > 0; j--);}void speed_add()    // 加速函数

  18. {     if(key_add == 0)      {            

  19. delayms(2);        

  20. if (key_add == 0)            

  21. {                   count+= 5;  // 通过改变占空比来进行加速

  22.   }            

  23. while (!key_add);   
  24. }}
  25. void speed_less()   //减速函数

  26. {   if (key_less == 0)   
  27.   {            delayms(2);     
  28.    if (key_less == 0)         
  29.    {                   count -= 5;      
  30.   }            while(!key_less);   
  31.   }}  
  32. int main (void){ init0();   
  33.    while (1)      {            speed_add();        
  34.      speed_less();             }   
  35. return0;}
  36. void T0_inter() interrupt 1
  37. {    TR0 =0;     
  38. TH0 = (65536 - 10)/256;
  39. TL0 = (65536 - 10)%256;   
  40. TR0 = 1;           
  41. PWM1 = 0;
  42. time++ ;     
  43. if (time < count) // 因为总数是100,所以可以直接看出占空比是多少。
  44.    {            PWM2 = 1;
  45. }      
  46. else {            PWM2= 0; }  
  47.    if(time >= 100)  {            time = 0;      }}
复制代码


作者: Jeff_BlindCat    时间: 2020-6-24 21:10
谢谢楼主指点,好人一生平安。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1