电路设计论坛
直播中

李郝荫

7年用户 1333经验值
私信 关注
[文章]

H桥电路控制电机的电路和源程序

搭了个H桥电路,控制电机的正反转和PWM调速,程序是网上的,改改引脚就能用,电路和源程序如下:
功能:P1.1按键停止,P1.2左转,P1.3右转,P1.0调速
  1. #include
  2. #define uchar unsigned char
  3. #define uint   unsigned int
  4. ***it PW1=P0^0 ;
  5. ***it PW2=P0^1 ;     //控制电机的两个输入
  6. ***it accelerate=P1^0 ;   //调速按键
  7. ***it stop=P1^1 ;    //停止按键
  8. ***it left=P1^2 ;     //左转按键
  9. ***it right=P1^3 ;    //右转按键
  10.            
  11. #define right_turn PW1=0;PW2=1    //顺时针转动
  12. #define left_turn PW1=1;PW2=0    //逆向转动
  13. #define end_turn   PW1=1;PW2=1    //停转
  14. uint t0=25000,t1=25000;   //初始时占空比为50%
  15. uint a=25000;      //   设置定时器装载初值   25ms     设定频率为20Hz
  16. uchar flag=1;      //此标志用于选择不同的装载初值
  17. uchar dflag;      //左右转标志
  18. uchar count;     //用来标志速度档位
  19. void keyscan();     //键盘扫描
  20. void delay(uchar z);
  21. void time_init();    //定时器的初始化
  22. void adjust_speed();   //通过 调整占空比来调整速度
  23. //**********************************//
  24. void main()
  25. {
  26.     time_init();     //定时器的初始化
  27. while(1)
  28. {
  29.    
  30.    keyscan();    //不断扫描键盘程序,以便及时作出相应的响应
  31. }
  32. }
  33. //*************************************//
  34. void timer0()   interrupt 1 using 0
  35. {
  36.    
  37. if(flag)
  38.     {
  39.     flag=0;
  40.     end_turn;
  41.     a=t0;    //t0的大小决定着低电平延续时间
  42.     TH0=(65536-a)/256;
  43.     TL0=(65536-a)%6;   //重装载初值
  44.     }
  45.     else
  46.     {
  47.     flag=1;    //这个标志起到交替输出高低电平的作用
  48.         if(dflag==0)
  49.         {
  50.          right_turn;   //右转
  51.         }
  52.          else
  53.         {
  54.       left_turn; //左转
  55.         }
  56.         a=t1;   //t1的大小决定着高电平延续时间
  57.         TH0=(65536-a)/256;
  58.         TL0=(65536-a)%6;   //重装载初值
  59.    }
  60. }
  61. void time_init()
  62. {
  63. TMOD=0x01; //工作方式寄存器    软件起动定时器 定时器功能 方式1 定时器0
  64. TH0=(65536-a)/256;
  65. TL0=(65536-a)%6;   //装载初值
  66. ET0=1;       //开启定时器中断使能
  67. EA=1;         // 开启总中断
  68. TR0=0;
  69. }
  70. //****************************************//
  71. void delay(uchar z)    //在12M下延时z毫秒
  72. {
  73. uint x,y;
  74. for(x=z;x>0;x--)
  75.    for(y=110;y>0;y--);
  76. }
  77. //******************************//
  78. void keyscan()
  79. {

  80. if(stop==0)
  81.    {
  82.    TR0=0;        //关闭定时器0    即可停止转动
  83.    end_turn;
  84.    }
  85. if(left==0)
  86.    {
  87.        TR0=1;
  88.        dflag=1;     //转向标志置位则左转
  89.    }
  90. if(right==0)
  91.    {
  92.      TR0=1;
  93.      dflag=0;    //转向标志复位则右转
  94.    }
  95. if(accelerate==0)
  96.    {
  97.      delay(5) ; //延时消抖
  98.    if(accelerate==0)
  99.    {
  100.      while(accelerate==0) ;   //等待松手
  101.       count  ;
  102.     if(count==1)
  103.      {
  104.         t0=20000;
  105.          t1=30000;   //占空比为百分之60
  106.      }
  107.     if(count==2)
  108.      {
  109.         t0=15000;
  110.          t1=35000;    //占空比为百分之70
  111.      }
  112.     if(count==3)
  113.      {
  114.         t0=10000;
  115.          t1=40000;    //占空比为百分之80
  116.      }
  117.      if(count==4)
  118.      {
  119.         t0=5000;
  120.          t1=45000;    //占空比为百分之90
  121.      }
  122.     if(count==5)
  123.      {
  124.        count=0;
  125.      }
  126.    }
  127.    
  128.    }
  129. }



更多回帖

发帖
×
20
完善资料,
赚取积分