有关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,脉宽调制。他就是输出一定占空比的脉冲来调节电机的转速。占空比越大电机转得越快。占空比是指高电平的时间占整个周期的时间比。那么在一个周期内就会有一段高电平一段低电平。你不懂的那段程序就是调制高低电平的时间。
- if(a_time1<PWM)
- {
- IN1=1; //马达(前进1=1 2=0)
- }
- else
- {
- IN1=0;
- }
在a_time1<PWM这段时间内输出高电平。在a_time1>=PWM这段时间输出低电平。因为这时间是非常短的。电机由于惯性是不会立刻停止的,还是回转的。但是没有电力的驱动了。所以总体来说由于是输出的是PWM。所以电机会比一直输出高电平会慢。这就实现了通过PWM调制电机转动速度了。下一个周期又会重复这样。占空比越大,高电平占的时间越长。电机转得越快。
还有至于为什么PWM_MAX是99而不是100.这是因为下面这条语句。
- if(a_time1>=PWM_max) //pwm时间计数
- {
- a_time1=0;
- }
这里是>=而不是>。0~99就有一百个单位了。程序太长我没有具体看。如果还有什么不懂再上来问。
程序有点长,首先你要明白什么是PWM,脉宽调制。他就是输出一定占空比的脉冲来调节电机的转速。占空比越大电机转得越快。占空比是指高电平的时间占整个周期的时间比。那么在一个周期内就会有一段高电平一段低电平。你不懂的那段程序就是调制高低电平的时间。
- if(a_time1<PWM)
- {
- IN1=1; //马达(前进1=1 2=0)
- }
- else
- {
- IN1=0;
- }
在a_time1<PWM这段时间内输出高电平。在a_time1>=PWM这段时间输出低电平。因为这时间是非常短的。电机由于惯性是不会立刻停止的,还是回转的。但是没有电力的驱动了。所以总体来说由于是输出的是PWM。所以电机会比一直输出高电平会慢。这就实现了通过PWM调制电机转动速度了。下一个周期又会重复这样。占空比越大,高电平占的时间越长。电机转得越快。
还有至于为什么PWM_MAX是99而不是100.这是因为下面这条语句。
- if(a_time1>=PWM_max) //pwm时间计数
- {
- a_time1=0;
- }
这里是>=而不是>。0~99就有一百个单位了。程序太长我没有具体看。如果还有什么不懂再上来问。
你哪个学校的啊,怎么现在毕设还没弄好,我的早完成任务了。现在等着被学校赶。
原来你也是大四的啊,我还以为你是哪个公司的工程师呢。我是河南科技大学的,后天就答辩了,这个pWM我一直不是很清楚,突然想起来还有这个网站,就来求助了。兄弟,你哪个学校的啊,感觉你学的真是不错啊,得多多向你学习撒。讲的很清楚太感谢了。我把思路理一理,有不懂的再来请教你撒
我南华农业大学的,我也是一个刚学飞的菜鸟,工程师还不是,打杂的。就这点水平而已。
哈哈 谦虚了 比我还是强不少的