找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4071|回复: 0
打印 上一主题 下一主题
收起左侧

L298直流电机的PWM速度控制单片机程序

[复制链接]
跳转到指定楼层
楼主
分享~


单片机源程序如下:
  1. /*-----------------------------------------------
  2.   名称:        直流电机控制
  3.   工作室:        翼嵌电子工作室
  4.   编写:        Bin.Lee
  5.   日期:        2018.6.10
  6.   版本:        0.1
  7.   内容:        直流电机的PWM速度控制程序
  8.   端口:        IN_1 = P2^0;
  9.                         IN_2 = P2^1;
  10.                         IN_3 = P2^2;
  11.                         IN_4 = P2^3;
  12.                         EN_A = P2^4;
  13.                         EN_B = P2^5;
  14. ------------------------------------------------*/
  15. /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) direction-正反转(1,0)*/


  16. #include "Motor.h"

  17. sbit IN_1 = P2^0; /* L298的IN_1 */
  18. sbit IN_2 = P2^1; /* L298的IN_2 */
  19. sbit IN_3 = P2^2; /* L298的IN_3 */
  20. sbit IN_4 = P2^3; /* L298的IN_4 */
  21. sbit EN_A = P2^4; /* L298的EN_A */
  22. sbit EN_B = P2^5; /* L298的EN_B */

  23. /**********电机驱动****************/   
  24. uchar count        = 0; /* 中断计数器 */
  25. uchar Speed_1 = 0, Speed_2 = 0; /* 电机1/2速度值 */
  26. uchar Speed_Now_1 = 0, Speed_Now_2 = 0; /* 电机1/2当前速度值 */

  27. void Motor_Delay_ms(unsigned int time)
  28. {
  29. uchar i,j;
  30. for(i=time;i>0;i++)
  31.    for(j=112;j>0;j--)
  32.    {;}
  33. }
  34. void Motor(uchar index, char speed,uchar direction)
  35. {
  36.         if(index == 1) /* 电机1的处理 */
  37.         {
  38.                 if(direction == 1)
  39.                 {
  40.                          Speed_1 = speed;
  41.                         IN_1 = 1;
  42.                         IN_2 = 0;
  43.                 }
  44.                 else
  45.                 {
  46.                     Speed_1 = speed;  
  47.                         IN_1 = 0;
  48.                         IN_2 = 1;
  49.                 }
  50.         }
  51.         if(index == 2) /* 电机2的处理 */
  52.         {
  53.                 if(direction == 1)
  54.                 {
  55.                           Speed_2 = speed;
  56.                         IN_3 = 1;
  57.                         IN_4 = 0;
  58.                 }
  59.                 else
  60.                 {
  61.                         Speed_2 = speed; /* 电机2的速度控制 */
  62.                         IN_3 = 0;
  63.                         IN_4 = 1;
  64.                 }
  65.         }
  66. }
  67. void Motor_Control_1(char speed, uchar direction)/* 电机1的控制 */
  68. {
  69.         Motor(1, speed, direction);
  70. }
  71. void Motor_Control_2(char speed, uchar direction)/* 电机2的控制 */
  72. {
  73.         Motor(2, speed, direction);
  74. }
  75. void Motor_Init(void)
  76. {               
  77.         IN_1 = 1;
  78.         IN_2 = 1;
  79.         IN_3 = 1;
  80.         IN_4 = 1;
  81.         TMOD = 0x02; /* 设定T0的工作模式为2 */
  82.         TH0 = 0xa3; /* 装入定时器的初值 */
  83.         TL0 = 0xa3; //0.1ms
  84.         EA = 1; /* 开中断 */
  85.         ET0 = 1; /* 定时器0允许中断 */
  86.         TR0 = 1; /* 启动定时器0 */
  87. }
  88. /*********************行驶状态**************************/
  89. void Motor_Run(void)
  90. {
  91.          TR0 = 1; /* 启动定时器0 */
  92.          Motor_Delay_ms(2);
  93.          Motor_Control_1(13, 1);
  94.          Motor_Control_2(13, 0);
  95. }

  96. void Motor_Back(void)
  97. {
  98.            TR0 = 1; /* 启动定时器0 */
  99.            Motor_Delay_ms(2);
  100.            Motor_Control_1(30, 0);
  101.            Motor_Control_2(30, 1);
  102. }

  103. void Motor_Stop(void)
  104. {
  105.          Motor_Delay_ms(2);
  106.           TR0 = 0; /* 关闭定时器0 */
  107.           EN_A = 0;
  108.           EN_B = 0;
  109.           IN_1 = 0;
  110.         IN_2 = 0;
  111.         IN_3 = 0;
  112.         IN_4 = 0;
  113. }
  114. void Motor_TurnRight(void)         //右转
  115. {
  116.          TR0 = 1;
  117.          Motor_Delay_ms(2);
  118.          Motor_Control_1(15, 1);                    
  119.          Motor_Control_2(10, 1);         
  120. }
  121. void Motor_TurnLeft(void)          //左转
  122. {
  123.           TR0 = 1;
  124.          Motor_Delay_ms(2);
  125.          Motor_Control_1(10, 0);
  126.          Motor_Control_2(15, 0);
  127. }

  128. void Motor_Around(void)                  //打转
  129. {
  130.          TR0 = 1; /* 启动定时器0 */
  131.            Motor_Delay_ms(2);
  132.            Motor_Control_1(10, 1);
  133.            Motor_Control_1(10, 1);
  134. }

  135. void TIME_0(void) interrupt 1 /* T0中断服务程序 */
  136. {
  137.         if(count == 0) /* 1个PWM周期完成后才会接受新数值 */
  138.         {        
  139.                 Speed_Now_1 = Speed_1;
  140.                 Speed_Now_2 = Speed_1;
  141.         }
  142.         /* 产生电机1的PWM信号 */
  143.         if(count < Speed_1) EN_A = 1;
  144.         else EN_A = 0;  
  145.         /* 产生电机2的PWM信号 */
  146.         if(count < Speed_2) EN_B = 1;
  147.         else EN_B = 0;
  148.         count++;
  149.         if(count >= 100) count = 0; /* 1个PWM信号由100次中断产 */
  150. }

复制代码

所有资料51hei提供下载:
L298电机驱动程序.rar (36.61 KB, 下载次数: 63)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表