stc单片机吧 关注:1,643贴子:1,902
  • 14回复贴,共1

在舵机控制器上做直流有刷电机控制

只看楼主收藏回复

舵机控制功能全去掉,改为直流有刷电机控制,电位器调速,加mos管驱动电机。


回复
来自Android客户端1楼2018-03-21 18:09
    不懂+1


    回复
    来自Android客户端2楼2018-03-21 20:49
      因为没又做出来呢,所以你不懂正常。手里没有MOS管,等几天,课题想出来,我就习惯行发帖,等有时间再做。


      回复
      3楼2018-03-21 22:01
        昨天晚上做到1点,虽然我没有mos管,但我有L9110H芯片,可提供800mA持续电流。但昨天线路一直是连接错误,引脚弄错,还有芯片插反,导致9110和STC15W408AS单片机总是发热。开始我以为我焊接有短路,后来发现是引脚看错了,改了之后还是发热,又发现9110插反了。最后终于能旋转电机了。就睡觉去了,今天早晨起来实验,曾经发热过的几块芯片都恢复正常。今天晚上把调速功能加上,现在只有正反转功能。特此声明!


        收起回复
        来自Android客户端4楼2018-03-22 07:02
          先上原理图


          回复
          来自Android客户端5楼2018-03-22 09:06
            功能说明:电位器中间位置123-133之间电机停止,此时led亮灯,顺时钟电机正转调速,逆时针反转调速。


            收起回复
            来自Android客户端6楼2018-03-22 09:19
              在楼主的舵机控制器基础上加了一个L9110H芯片


              回复
              来自Android客户端7楼2018-03-22 21:49
                //STC15W408AS 11.0592MHz QQ:1149268555
                #include<reg52.h>
                #include<intrins.h>
                #define U8 unsigned char


                sfr P5 = 0xC8;
                sfr ADC_CONTR = 0xBC;
                sfr ADC_RES = 0xBD;
                sfr ADC_LOW2 = 0xBE;
                sfr P1ASF = 0x9D;
                sfr AUXR = 0x8e;


                sbit led = P3^2;
                sbit sb1 = P1^0;
                sbit sb2 = P3^7;


                U8 num;
                U8 ch=2;
                U8 ms,sh;


                void Delay40us()//@11.0592MHz 40us
                {
                unsigned char i;
                i = 108;
                while (--i);
                }


                void delays(U8 i)
                {
                while(i--)
                Delay40us();
                }


                U8 GetADC(U8 ch)
                {
                ADC_CONTR=0x80|0x00|ch|0x08;
                while (!(ADC_CONTR&0x10));
                ADC_CONTR&=~0x10;
                return ADC_RES;
                }


                void InitADC()
                {
                P1ASF=0x02;
                ADC_RES=0;
                ADC_CONTR=0x80|0x00;
                }


                void Timer0Init(void)//5ms @11.0592MHz
                {
                ET0=1;
                AUXR |= 0x80;
                TMOD &= 0xF0;
                TL0 = 0x00;
                TH0 = 0x28;
                TF0 = 0;
                TR0 = 1;
                EA = 1;
                }


                main()
                {
                InitADC();
                Timer0Init();
                while(1)
                {
                num=GetADC(1);
                if (num<108) sh=1;
                if (num>148) sh=2;
                if ((num>=108)&&(num<=148))sh=3;
                }
                }


                void Time0()interrupt 1
                {
                ms++;
                if (ms==200) ms=0;
                switch(sh)
                {
                case 1:sb1=0,sb2=1,led=0,delays(128-num);break;
                case 2:sb1=1,sb2=0,led=0,delays(num-128);break;
                }
                sb1=0,sb2=0,led=1;
                }
                这个是电机双向速度可调程序。


                收起回复
                8楼2018-03-22 22:00
                  //STC15W408AS 11.0592MHz QQ:1149268555
                  #include<reg52.h>
                  #include<intrins.h>
                  #define U8 unsigned char


                  sfr ADC_CONTR = 0xBC;
                  sfr ADC_RES = 0xBD;
                  sfr ADC_LOW2 = 0xBE;
                  sfr P1ASF = 0x9D;
                  sfr AUXR = 0x8e;


                  sbit led = P3^2;
                  sbit sb1 = P1^0;
                  sbit sb2 = P3^7;


                  U8 num;
                  U8 ch=2;
                  U8 ms,sh;


                  void Delay20us()//@11.0592MHz 20us
                  {
                  unsigned char i;
                  i = 54;
                  while (--i);
                  }


                  void delays(U8 i)
                  {
                  while(i--)
                  Delay20us();
                  }


                  U8 GetADC(U8 ch)
                  {
                  ADC_CONTR=0x80|0x00|ch|0x08;
                  while (!(ADC_CONTR&0x10));
                  ADC_CONTR&=~0x10;
                  return ADC_RES;
                  }


                  void InitADC()
                  {
                  P1ASF=0x02;
                  ADC_RES=0;
                  ADC_CONTR=0x80|0x00;
                  }


                  void Timer0Init(void)//5ms @11.0592MHz
                  {
                  ET0=1;
                  AUXR |= 0x80;
                  TMOD &= 0xF0;
                  TL0 = 0x00;
                  TH0 = 0x28;
                  TF0 = 0;
                  TR0 = 1;
                  EA = 1;
                  }


                  main()
                  {
                  InitADC();
                  Timer0Init();
                  while(1)
                  {
                  num=GetADC(1);
                  }
                  }


                  void Time0()interrupt 1
                  {
                  if(num>45) sb1=0,sb2=1,led=0,delays(num);
                  sb1=0,sb2=0,led=1;
                  }
                  //电机单向速度可调程序


                  回复
                  9楼2018-03-22 22:19
                    我回来看程序来了,即便程序是我自己写的,偶尔也需要来学习。


                    回复
                    10楼2018-03-27 20:40
                      为何不用硬件pwm?其实软件模拟pwm也很容易


                      回复
                      来自Android客户端11楼2018-03-28 00:43
                        定时器中断里面只要让一个全局变量负责计数,当这个计数值<某个翻转点时控制引脚为0,当大于这个翻转点时为1,计数到上限值时,计数值为0,重新计数。这样翻转点和上限值控制占空比,定时器控制pwm频率。


                        回复
                        来自Android客户端12楼2018-03-28 00:51