|
定时器初始化,A值在定时器中++,达到PWM比较值之后,关闭产生PWM的引脚,到达PWM最大值的时候,A值=0,为了下一次
但是不理解的是,为什么在这个代码的实际现象下是上电就开始转,以及下一次PWM开始的速度要比最开始的速度要快
关于PWM还有不理解之处如下图:
1:PWM为什么会加速,之后速度几乎没变?是因为一开始速度+到50HZ之后,保持不变,下一次的速度本身就在50HZ附近,所以不会出现加速现象是吗?
2:PWM引脚只能给1或者0,为什么会调速,一开始电机引脚给1,只是让电机跑,现在PWM引脚加进来,不妨碍它本身就是跑的状态,但是这个引脚加进来,就会产生PWM,而不同的PWM控制不同的速度是吧(说实话还是不是太明白为什么PWM会调节速度)?或者说PWM间接控制电机引脚可以吗?
3:PWM++值和速度本身是没有关系的,不是PWM值是多少,速度就是多少,对吧?速度本身想要调节,还是要根据实际速度和观测器进行反馈算法调节,即想实现具体速度调节,单靠PWM是不可以的
4:本代码delay是为了看下一次从新开始,但是没看出来下一次速度从头增加,感觉还是之前的速度,是不是因为时间关系,才执stop函数效果不明显?这也说明电机跑的引脚和PWM控制引脚还是又很大区别的?
-----------------------------------------------------------------------------------------------------非常感谢之前告诉我,要想控制速度,需要算法等方法的工程师
-----------------------------------------------------------------------------------------麻烦大佬抽空帮忙解释一下我的疑惑
------------------------------------------------------------------------------------------XX
本次测试单片机代码如下:也可见附件
#include "stc12c5a60s2.h"
//定义电机引脚
sbit Left_motor_go=P2^1; //左电机前进AIN2
sbit Left_motor_back=P2^2; //左电机后退AIN1
sbit Right_motor_go=P2^4; //右电机前进BIN2
sbit Right_motor_back=P2^3; // 右电机后退BIN1
sbit Left_motor_pwm=P2^0; //左电机控速PWMA
sbit Right_motor_pwm=P2^5; //右电机控速PWMB
unsigned char compare_value=150;
unsigned char left_pwm=0;
unsigned char right_pwm=0;
unsigned char Left_motor_pwm_on=0;
unsigned char Right_motor_pwm_on=0;
////速度调节变量 0-20,0最小,20最大
unsigned char push_val_left =5; //左电机占空比push_val_left/20
unsigned char push_val_right=5;
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
// _nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
//void run(unsigned char targetSpeed)
//{
// Left_motor_go=1;
// Right_motor_go=1;
// Left_motor_back=0;
// Right_motor_back=0;
//
// Left_motor_pwm_on=1;
// Right_motor_pwm_on=1;
//// compare_value=targetSpeed;
// push_val_right=targetSpeed;
//}
void run()
{
Left_motor_go=1;
Right_motor_go=1;
Left_motor_back=0;
Right_motor_back=0;
//
// Left_motor_pwm_on=1;
// Right_motor_pwm_on=1;
// compare_value=targetSpeed;
compare_value=10;
}
void stop()
{
Left_motor_go=0;
Right_motor_go=0;
Left_motor_back=0;
Right_motor_back=0;
//
// Left_motor_pwm_on=1;
// Right_motor_pwm_on=1;
// compare_value=targetSpeed;
compare_value=10;
}
void change_right_speed()
{
if(Right_motor_pwm_on)
{
if(right_pwm<compare_value)
{
run();
Right_motor_pwm=1;
//left_pwm++;
//
// run();
//===================
}
else
{
//left_pwm=0;
Right_motor_pwm=0;//--------------------
//Left_motor_go=0;
}
if(right_pwm>20)
{
//left_pwm=0;
right_pwm=0;//----------------------------2
Right_motor_pwm=1;
//Left_motor_go=0;
Right_motor_go=0;
Right_motor_pwm_on=0;
}
}
else
{
right_pwm=0;
Right_motor_go=0;
stop();
Delay1ms() ;
Right_motor_pwm_on=1;
}
}
void change_left_speed()
{
if(Left_motor_pwm_on)
{
if(left_pwm<compare_value)
{
run();
Left_motor_pwm=1;
//left_pwm++;
//
// run();
//===================
}
else
{
//left_pwm=0;
Left_motor_pwm=0;
//Left_motor_go=0;
}
if(left_pwm>20)//----------------255
{
left_pwm=0;//----------------------------
Left_motor_pwm=1;
Left_motor_go=0;
Left_motor_pwm_on=0;
}
}
else
{
left_pwm=0;
Left_motor_go=0;
Delay1ms() ;
stop();
Delay1ms() ;
Left_motor_pwm_on=1;
}
}
void satrt()
{
change_left_speed();
change_right_speed();
}
void timer0_init()
{
P2=0XC0; //关电机
TMOD=0X01; //定时器工作方式1
TH0=0XFC; //1ms定时,装入初值
TL0=0X66;
TR0=1; //启动T0工作
ET0=1; //允许T0中断
EA =1; //开总中断
}
void timer0()interrupt 1 using 2
{
TH0=0XFC; //1ms定时,装入初值
TL0=0X66;
left_pwm++;
right_pwm++;
change_left_speed();
change_right_speed();
}
void main()
{
timer0_init();
while(1)
{
// run();
satrt();
}
}
|
|