PWM直流电机在实际应用中的一个问题
时间:10-02
整理:3721RD
点击:
这是驱动电机的函数void runnotor(unsigned char s)
{
Time1Config();//定时器的一些设置,每过0.5ms timer1++
while(1)
{
if(timer1>100) //PWM周期为100*0.5ms
{
timer1=0;
}
if(timer1 < s) //改变“s”可改变速度
{
PWM=1;
}
else
{
PWM=0;
}
}
}
主函数
void main(void)
{
float tp;
sign_auto=0;
speed=50;
runmotor(speed);
while(1)
{
tp=Ds18b20ReadTemp();//读取的温度
realtemp=tp*0.0625*100+0.5;
DigDisplayTemp(realtemp);//显示温度
Key_Scan();//扫描键盘
KeyNum=Key_Scan;
switch(KeyNum)
{
case(0xFD):speed=40,sign_auto=0;break;
case(0xFB):speed=70,sign_auto=0;break;
case(0xF7):speed=99,sign_auto=0;break;
case(0xFE):sign_auto=1;break;
default:break;
}
if(sign_auto) speed=autospeed(realtemp);
runmotor(speed);
}
}
还没成型的程序,如上在运行主函数时要采用while(1)死循环,但是驱动电机的函数里面也需要用这个死循环,这样的话程序就在电机那里出不来了,试过不采用调用驱动电机函数,直接把驱动电机的代码写入主函数中,但这样的话由于timer1的变化感觉PWM就没什么用了,也试过修改定时器的值,这样电机转一下停一下看起来很明显。现向论坛里来求助一下,如何在主函数中处理电机驱动函数,在此先谢过各位了!
{
Time1Config();//定时器的一些设置,每过0.5ms timer1++
while(1)
{
if(timer1>100) //PWM周期为100*0.5ms
{
timer1=0;
}
if(timer1 < s) //改变“s”可改变速度
{
PWM=1;
}
else
{
PWM=0;
}
}
}
主函数
void main(void)
{
float tp;
sign_auto=0;
speed=50;
runmotor(speed);
while(1)
{
tp=Ds18b20ReadTemp();//读取的温度
realtemp=tp*0.0625*100+0.5;
DigDisplayTemp(realtemp);//显示温度
Key_Scan();//扫描键盘
KeyNum=Key_Scan;
switch(KeyNum)
{
case(0xFD):speed=40,sign_auto=0;break;
case(0xFB):speed=70,sign_auto=0;break;
case(0xF7):speed=99,sign_auto=0;break;
case(0xFE):sign_auto=1;break;
default:break;
}
if(sign_auto) speed=autospeed(realtemp);
runmotor(speed);
}
}
还没成型的程序,如上在运行主函数时要采用while(1)死循环,但是驱动电机的函数里面也需要用这个死循环,这样的话程序就在电机那里出不来了,试过不采用调用驱动电机函数,直接把驱动电机的代码写入主函数中,但这样的话由于timer1的变化感觉PWM就没什么用了,也试过修改定时器的值,这样电机转一下停一下看起来很明显。现向论坛里来求助一下,如何在主函数中处理电机驱动函数,在此先谢过各位了!
if(timer1>100) //PWM周期为100*0.5ms
{
timer1=0;
}
if(timer1 < s) //改变“s”可改变速度
{
PWM=1;有问题吧
哪儿呢0.0
明白了,定时器里不要用while循环了,在定时中断里对timer1++进行处理就可以了,
void timer1(void) interrupt 3
{
if(timer1>100) //PWM周期为100*0.5ms
{
timer1=0;
}
if(timer1 < s) //改变“s”可改变速度
{
PWM=1;
}
else
{
PWM=0;
}
}
666啊,我想了好久没想到,把这个函数写进定时中断就行啦。非常感谢你!
那就好,太客气了