微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 有关pwm调速的问题,希望高手能帮下忙 谢谢

有关pwm调速的问题,希望高手能帮下忙 谢谢

时间:10-02 整理:3721RD 点击:
void tim1_isr(void) interrupt 3 using 3//pwm波生成
{                                                                                                                                                      
        TH1=(65536-10)/256;                                    
        TL1=(65536-10)%256;         
        a_time1++;
        if(a_time1>=PWM_max) //pwm时间计数
        {
                a_time1=0;               
        }
        if(word)
        {
                if(a_time1<PWM)
                {
                        IN1=1;          //马达(前进1=1 2=0)
                }
                else
                {
                        IN1=0;
                }
        }
        else
        {
                if(a_time1<PWM)
                {
                        IN1=0;          //马达(呛笸1=0 2=1)
                }
                else
                {
                        IN1=1;
                }
        }
}
其中a_time1<PWM这句有什么作用啊?(a_time1是pwm时间计数,PWM表示高电平时间)
用的L298驱动电机

不会程序飘过   

会程序的飘过,a_time1<PWM这句就是调节PWM的。例如要60%占空比。PWM_max就为99.那么PWM的值就应该是60.如果a_time1<60的就输出1.60~99就输出1.如果要改变占空比就改变PWM的值。例外程序中有一个word这个确定是前半部分输出1还是后半部分输出1.

if(a_time1<PWM)
                {
                        IN1=1;          //马达(前进1=1 2=0)
                }
                else
                {
                        IN1=0;
                }
PWM控制的方式 PWM高电平持续的时间电机前进

哇  终于等到高手了。我是大四毕业生,毕设做的红外遥控小车,这点不太明白,希望您能指点下,哈哈。那个如果要60%的占空比,PWM_MAX为什么不是100,而是99啊?我的程序里#define PWM_max 10 ,#define  PWM  3,这个值是不是太小啊?我现在还是不太理解这段语句的意思,
        if(a_time1<PWM)
                {
                        IN1=1;          //马达(前进1=1 2=0)
                }
                else
                {
                        IN1=0;
                }
我在网上查的a_time表示PWM时间计数,PWM表示高电平时间,if语句判断PWM时间计数<高电平时间有什么意义啊?如果a_time>PWM,IN1=0,小车不就停止了吗?其实这整个中断函数我就不明白是干什么的,哈哈 。问题比较多,太麻烦您了。下面是我的一些程序,word我用红字标出来了,谢谢了


void tim1_isr(void) interrupt 3 using 3   

{                                                                                                                                                      
        TH1=(65536-10)/256;    // TH1=(65536-100)/256;                                 
        TL1=(65536-10)%256;          // TL1=(65536-100)%256;
        a_time1++;
        if(a_time1>=PWM_max) //pwm时间计数
        {
                a_time1=0;               
        }
        if(word)
        {
                if(a_time1<PWM)
                {
                        IN1=1;          //马达(前进1=1 2=0)
                }
                else
                {
                        IN1=0;
                }
        }
        else
        {
                if(a_time1<PWM)
                {
                        IN1=0;          //马达(前进1=1 2=0)
                }
                else
                {
                        IN1=1;
                }
        }
}
/********************************马达前后、左右转******************************/       
void turnforward(void)
{
        if(one)
        {
          word=1;
          IN1=1;         
          IN2=0;
          ENA=1;
          TR1=1;
          one=0;
        }
}
void turnbackward(void)
{
        if(one)
        {
        word=0;
         IN1=0;         
         IN2=1;
         ENA=1;
         TR1=1;         
         one=0;
         
        }
}
void turnstop(void)
{
        if(one)
        {
         TR1=0;
         IN1=1;           //马达停止
         IN2=1;
         IN3=1;          
         IN4=1;
         ENA=0;
         ENB=0;
         one=0;         
        }
}
void turnleft(void)                               
{
        if(one)
        {
                 IN1=1;
             IN2=0;
                 ENA=1;
                 IN3=0;           //马达左转                                           马达左右转
                 IN4=1;
                 ENB=1;
                 DelayMs(250);
                 ENB=0;                 
                 one=0;
        }
}
void turnright(void)
{
         if(one)
         {      
             IN1=1;
                         IN2=0;
                         ENA=1;
                         IN3=1;           //马达左转                                           马达左右转
                         IN4=0;
                         ENB=1;
                         DelayMs(250);
                         ENB=0;                         
                         one=0;
         }
}
void jiasu()
{
         if( one&&PWM<=10)
         {
                 PWM++;               
                 one=0;       
         }
         else
         {
                 if(PWM>10)
                {
                        one=0;
                }
         }
}
void jiansu()
{
         if( one&&PWM>1)
         {
                 PWM--;
                 one=0;
         }
         else
         {
                  if(PWM<=1)
                 {
                  one=0;         
                 }
                 
               
}
}


void main(void)
{
IN1= 1;         //马达端口          前后
IN2= 1;
IN3= 1;         //左右
IN4= 1;
ENA= 0;         //马达使能端  EN_A高电平 IN_1 IN_2有效控制前后
ENB= 0;
EX0init(); // Enable Global Interrupt Flag
TIM0init();
TIME1init();
DelayMs(15);
while(1)//主循环
   {
    if(irok)                                  //条件其一irok(有红外输入) 其二X(开始键按下为0)
          {   
           Ircordpro();
           irok=0;
          }
    if(irpro_ok)//step press key
          {
           one=1;
            }                                          

                 if((IRcord[2]== 0x18)&&(IRcord[3]==0xe7))
               turnforward();
                 if((IRcord[2]==0x52)&&(IRcord[3]==0xad))
               turnbackward();
                 if((IRcord[2]==0x08) &&(IRcord[3]==0xf7))
               turnleft();
                 if((IRcord[2]==0x5a) &&(IRcord[3]==0xa5))
               turnright();
                 if((IRcord[2]==0x1c) &&(IRcord[3]==0xe3))
               turnstop();
              if((IRcord[2]==0x0c) &&(IRcord[3]==0xf3))
               {
                    jiasu();
                                irpro_ok=0;   
           }
                 if((IRcord[2]==0x42) &&(IRcord[3]==0xbd))
              {
                    jiansu();
                                irpro_ok=0;       
          }
   }
}             

没事  慢慢来撒  我要是初学者,一起加油撒

不好意思啊  怎么看PWM持续的时间啊  小弟对这个PWM不是很懂啊,能说的详细点吗

一起学习         

程序有点长,首先你要明白什么是PWM,脉宽调制。他就是输出一定占空比的脉冲来调节电机的转速。占空比越大电机转得越快。占空比是指高电平的时间占整个周期的时间比。那么在一个周期内就会有一段高电平一段低电平。你不懂的那段程序就是调制高低电平的时间。

  1. if(a_time1<PWM)
  2.                 {
  3.                         IN1=1;          //马达(前进1=1 2=0)
  4.                 }
  5.                 else
  6.                 {
  7.                         IN1=0;
  8.                 }

复制代码


在a_time1<PWM这段时间内输出高电平。在a_time1>=PWM这段时间输出低电平。因为这时间是非常短的。电机由于惯性是不会立刻停止的,还是回转的。但是没有电力的驱动了。所以总体来说由于是输出的是PWM。所以电机会比一直输出高电平会慢。这就实现了通过PWM调制电机转动速度了。下一个周期又会重复这样。占空比越大,高电平占的时间越长。电机转得越快。
还有至于为什么PWM_MAX是99而不是100.这是因为下面这条语句。

  1. if(a_time1>=PWM_max) //pwm时间计数
  2.         {
  3.                 a_time1=0;               
  4.         }

复制代码


这里是>=而不是>。0~99就有一百个单位了。程序太长我没有具体看。如果还有什么不懂再上来问。

程序有点长,首先你要明白什么是PWM,脉宽调制。他就是输出一定占空比的脉冲来调节电机的转速。占空比越大电机转得越快。占空比是指高电平的时间占整个周期的时间比。那么在一个周期内就会有一段高电平一段低电平。你不懂的那段程序就是调制高低电平的时间。

  1. if(a_time1<PWM)
  2.                 {
  3.                         IN1=1;          //马达(前进1=1 2=0)
  4.                 }
  5.                 else
  6.                 {
  7.                         IN1=0;
  8.                 }

复制代码


在a_time1<PWM这段时间内输出高电平。在a_time1>=PWM这段时间输出低电平。因为这时间是非常短的。电机由于惯性是不会立刻停止的,还是回转的。但是没有电力的驱动了。所以总体来说由于是输出的是PWM。所以电机会比一直输出高电平会慢。这就实现了通过PWM调制电机转动速度了。下一个周期又会重复这样。占空比越大,高电平占的时间越长。电机转得越快。
还有至于为什么PWM_MAX是99而不是100.这是因为下面这条语句。

  1. if(a_time1>=PWM_max) //pwm时间计数
  2.         {
  3.                 a_time1=0;               
  4.         }

复制代码


这里是>=而不是>。0~99就有一百个单位了。程序太长我没有具体看。如果还有什么不懂再上来问。

你哪个学校的啊,怎么现在毕设还没弄好,我的早完成任务了。现在等着被学校赶。

原来你也是大四的啊,我还以为你是哪个公司的工程师呢。我是河南科技大学的,后天就答辩了,这个pWM我一直不是很清楚,突然想起来还有这个网站,就来求助了。兄弟,你哪个学校的啊,感觉你学的真是不错啊,得多多向你学习撒。讲的很清楚太感谢了。我把思路理一理,有不懂的再来请教你撒

我南华农业大学的,我也是一个刚学飞的菜鸟,工程师还不是,打杂的。就这点水平而已。

哈哈  谦虚了  比我还是强不少的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top